Proseguo la panoramica sulle funzionalità di OrientDb. Il miglior metodo per capire come funziona è quello di sperimentare. Genero dei dati test per simulare il funzionamento di un db relazionale social su file csv. Così costituito:
Utenti: elenco di utenti id;nome;cognome;mail;password; con relativo avatar collegato all'id.
lnk_utenti: collegamento tramite id degli utenti sugli utenti ( tipo amici).
post: id;utente_id;file;text;data;like[utenti];commenti[commento];tag[utenti]; dove i campi compresi tra [] identifica una lista di collegamenti.
commenti: id;utente_id;text;data;like[utenti];
Questa procedura mi permette di provare:
- salvataggio in blocco dell'object
- salvataggio nel db del file (avatar) vedi doc
- collegamenti N:M su liste
package orientdbtest;
import com.orientechnologies.orient.core.db.document.ODatabaseDocumentTx;
import com.orientechnologies.orient.core.metadata.schema.OType;
import com.orientechnologies.orient.core.record.impl.ODocument;
import com.orientechnologies.orient.core.record.impl.ORecordBytes;
import com.orientechnologies.orient.core.sql.query.OSQLSynchQuery;
import com.orientechnologies.orient.server.OServer;
import com.orientechnologies.orient.server.OServerMain;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.io.FileUtils;
public class Social {
public static void main(String[] args) {
try {
String base = "/Users/marco/orientdb/";
OServer server = OServerMain.create();
server.startup(new File(base + "/file/conf.xml"));
ODatabaseDocumentTx db = new ODatabaseDocumentTx("local:" + base + "/social").create();
//elenco dei cluster
for (String s : db.getClusterNames()) {
System.out.println(s + " - " + db.countClusterElements(s));
}
//import UTENTI
try {
System.out.println("**** Start Import Utenti");
long time = System.currentTimeMillis();
BigFile big_file = new BigFile(base + "/file_social/utente.csv");
boolean first_line = true;
db.begin();
for (String utente : big_file) {
if (first_line) {
first_line = false;
continue;
}
String[] utente_split = utente.split("\\;");
ODocument Outente = new ODocument(db, "Utenti");
Outente.field("id", utente_split[0], OType.SHORT);
Outente.field("nome", utente_split[1], OType.STRING);
Outente.field("cognome", utente_split[2], OType.STRING);
Outente.field("email", utente_split[3], OType.STRING);
Outente.field("password", utente_split[4], OType.STRING);
try {
File avatar = new File(base + "/file_social/avatar/" + utente_split[0] + ".jpg");
if (avatar.exists()) {
Outente.field("avatar", new ORecordBytes(db, FileUtils.readFileToByteArray(new File(base + "/file_social/avatar/" + utente_split[0] + ".jpg"))));
System.out.println("immagine trovata: " + base + "/file_social/avatar/" + utente_split[0] + ".jpg");
} else {
System.out.println("immagine " + base + "/file_social/avatar/" + utente_split[0] + ".jpg" + " non trovata");
}
} catch (IOException eFile) {
System.out.println("immagine " + base + "/file_social/avatar/" + utente_split[0] + ".jpg" + " non trovata");
}
Outente.save();
}
db.commit();
System.out.println("tot time: " + (System.currentTimeMillis() - time));
} catch (Exception e) {
System.out.println("e1:" + e.getMessage() + e.getStackTrace().toString());
db.rollback();
}
//import AMICI UTENTI
try {
System.out.println("**** Start Import Amici");
long time = System.currentTimeMillis();
BigFile big_file = new BigFile(base + "/file_social/lnk_utenti.csv");
boolean first_line = true;
for (String lnk_utenti : big_file) {
if (first_line) {
first_line = false;
continue;
}
String[] lnk_utenti_split = lnk_utenti.split("\\;");
db.begin();
//ricerco gli utente correlati e li aggancio uno agli altri
ODocument utente1 = (ODocument) db.query(new OSQLSynchQuery("select from utenti where id = '" + lnk_utenti_split[0] + "'")).get(0);
ODocument utente2 = (ODocument) db.query(new OSQLSynchQuery("select from utenti where id = '" + lnk_utenti_split[1] + "'")).get(0);
ArrayList lnk = new ArrayList();
if (utente1.field("lnk") != null) {
lnk = (ArrayList) utente1.field("lnk");
} else {
lnk = new ArrayList();
}
//verifico se nei lnk esiste già l'utente
boolean trovato = false;
if (!lnk.isEmpty()) {
for (ODocument check : lnk) {
System.out.println("check utente-1 id:" + check.field("id").toString() + " to: " + utente2.field("id").toString());
if (check.field("id").toString().equals(utente2.field("id").toString())) {
trovato = true;
continue;
}
}
}
if (!trovato) {
lnk.add(utente2);
utente1.field("lnk", lnk, OType.EMBEDDEDLIST);
System.out.println("utente-1 add: " + utente2.field("id"));
utente1.save();
}
if (utente2.field("lnk") != null) {
lnk = (ArrayList) utente2.field("lnk");
} else {
lnk = new ArrayList();
}
//verifico se nei lnk esiste già l'utente
trovato = false;
if (!lnk.isEmpty()) {
for (ODocument check : lnk) {
System.out.println("check utente-2 id:" + check.field("id").toString() + " to: " + utente1.field("id").toString());
if (check.field("id").toString().equals(utente1.field("id").toString())) {
trovato = true;
continue;
}
}
}
if (!trovato) {
lnk.add(utente1);
System.out.println("utente-2 add: " + utente1.field("id"));
utente2.field("lnk", lnk, OType.EMBEDDEDLIST);
utente2.save();
}
db.commit();
}
System.out.println("tot time: " + (System.currentTimeMillis() - time));
} catch (Exception e) {
System.out.println("e2:" + e.getMessage() + e.getStackTrace().toString());
db.rollback();
}
for (String s : db.getClusterNames()) {
System.out.println(s + " - " + db.countClusterElements(s));
}
try {
System.out.println("**** Start Import Post");
long time = System.currentTimeMillis();
BigFile big_file = new BigFile(base + "/file_social/post.csv");
boolean first_line = true;
db.begin();
for (String post : big_file) {
if (first_line) {
first_line = false;
continue;
}
String[] post_split = post.split("\\;");
//ricerco gli utente correlati e li aggancio uno agli altri
ODocument utente = (ODocument) db.query(new OSQLSynchQuery("select from utenti where id = '" + post_split[1] + "'")).get(0);
ODocument OPost = new ODocument(db, "Post");
OPost.field("id", post_split[0], OType.SHORT);
OPost.field("utente", utente, OType.EMBEDDED);
OPost.field("file", post_split[2], OType.STRING);
OPost.field("text", post_split[3], OType.STRING);
OPost.field("data", post_split[4], OType.STRING);
if (!post_split[5].equals("-")) {
String[] split_utenti = post_split[5].split("\\,");
ArrayList lnk = new ArrayList();
for (String ut : split_utenti) {
lnk.add((ODocument) db.query(new OSQLSynchQuery("select from utenti where id = '" + ut + "'")).get(0));
}
OPost.field("lnk", lnk, OType.EMBEDDEDLIST);
}
if (!post_split[7].equals("-")) {
String[] split_utenti = post_split[7].split("\\,");
ArrayList tag = new ArrayList();
for (String ut : split_utenti) {
tag.add((ODocument) db.query(new OSQLSynchQuery("select from utenti where id = '" + ut + "'")).get(0));
}
OPost.field("tag", tag, OType.EMBEDDEDLIST);
}
OPost.save();
}
db.commit();
System.out.println("tot time: " + (System.currentTimeMillis() - time));
} catch (Exception e) {
System.out.println("e3:" + e.getMessage() + e.getStackTrace());
db.rollback();
}
try {
System.out.println("**** Start Import commenti");
long time = System.currentTimeMillis();
BigFile big_file = new BigFile(base + "/file_social/commenti.csv");
boolean first_line = true;
db.begin();
for (String commenti : big_file) {
if (first_line) {
first_line = false;
continue;
}
String[] commenti_split = commenti.split("\\;");
//ricerco gli utente correlati e li aggancio uno agli altri
ODocument utente = (ODocument) db.query(new OSQLSynchQuery("select from utenti where id = '" + commenti_split[1] + "'")).get(0);
ODocument OCommenti = new ODocument(db, "commenti");
OCommenti.field("id", commenti_split[0], OType.SHORT);
OCommenti.field("utente", utente, OType.EMBEDDED);
OCommenti.field("text", commenti_split[2], OType.STRING);
OCommenti.field("data", commenti_split[3], OType.STRING);
if (!commenti_split[4].equals("-")) {
String[] split_utenti = commenti_split[4].split("\\,");
ArrayList lnk = new ArrayList();
for (String ut : split_utenti) {
lnk.add((ODocument) db.query(new OSQLSynchQuery("select from utenti where id = '" + ut + "'")).get(0));
}
OCommenti.field("lnk", lnk, OType.EMBEDDEDLIST);
}
OCommenti.save();
}
db.commit();
System.out.println("tot time: " + (System.currentTimeMillis() - time));
} catch (Exception e) {
System.out.println("e5:" + e.getMessage() + e.getStackTrace());
db.rollback();
}
try {
System.out.println("**** Start Add Commenti/Utenti to Post");
long time = System.currentTimeMillis();
BigFile big_file = new BigFile(base + "/file_social/post.csv");
boolean first_line = true;
db.begin();
for (String post : big_file) {
if (first_line) {
first_line = false;
continue;
}
String[] post_split = post.split("\\;");
//ricerco gli utente correlati e li aggancio uno agli altri
ODocument oPost = (ODocument) db.query(new OSQLSynchQuery("select from post where id = '" + post_split[0] + "'")).get(0);
if (!post_split[6].equals("-")) {
String[] split_commenti = post_split[6].split("\\,");
ArrayList lnk = new ArrayList();
for (String ut : split_commenti) {
lnk.add((ODocument) db.query(new OSQLSynchQuery("select from commenti where id = '" + ut + "'")).get(0));
}
oPost.field("commenti", lnk, OType.EMBEDDEDLIST);
oPost.save();
}
}
db.commit();
System.out.println("tot time: " + (System.currentTimeMillis() - time));
} catch (Exception e) {
System.out.println("e3:" + e.getMessage() + e.getStackTrace());
db.rollback();
}
try {
System.out.println("**** Rimuovo tutti gli id");
long time = System.currentTimeMillis();
db.begin();
String obj[] = {"utenti", "post", "commenti"};
for (String o : obj) {
List docs = db.query(new OSQLSynchQuery("select from " + o));
for (ODocument doc : docs) {
doc.removeField("id");
doc.save();
}
}
db.commit();
System.out.println("tot time: " + (System.currentTimeMillis() - time));
} catch (Exception e) {
System.out.println("e4:" + e.getMessage() + e.getStackTrace());
db.rollback();
}
for (String s : db.getClusterNames()) {
System.out.println(s + " - " + db.countClusterElements(s));
}
db.close();
server.shutdown();
} catch (Exception ex) {
System.out.println("ex:" + ex.getMessage() + ex.getStackTrace().toString());
}
}
}
conclusa questa operazione di import delle info procedo ad eseguire qualche query per sperimentare il tutto.
con una query sola molto veloce riesco a:
- estrarre carlo dall'elenco in base alla email
- estrarre gli amici di carlo (prelevare l'avatar e salvarlo su disco)
- estrarre tutti i post di un fede e ricavare tutti i commenti e like
package orientdbtest;
import com.orientechnologies.orient.core.db.document.ODatabaseDocumentTx;
import com.orientechnologies.orient.core.metadata.schema.OType;
import com.orientechnologies.orient.core.record.impl.ODocument;
import com.orientechnologies.orient.core.record.impl.ORecordBytes;
import com.orientechnologies.orient.core.sql.query.OSQLSynchQuery;
import com.orientechnologies.orient.server.OServer;
import com.orientechnologies.orient.server.OServerMain;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.io.FileUtils;
public class Main {
public static void main(String[] args) {
try {
String base = "/Users/marco/orientdb/";
OServer server = OServerMain.create();
ODatabaseDocumentTx db = new ODatabaseDocumentTx("local:" + base + "/social").open("admin", "admin");
try {
System.out.println("****** Start Query");
long time = System.currentTimeMillis();
ODocument carlo = (ODocument) db.query(new OSQLSynchQuery("select from utenti where email = 'carlo@email.it'")).get(0);
System.out.println("Query dati di carlo - tot time: " + (System.currentTimeMillis() - time));
System.out.println("nome:" + carlo.field("nome"));
System.out.println("cognome:" + carlo.field("cognome"));
//scrivo su file l'avatar presente, qui si può decidere cosa fare mandarlo sulla response o altro...
File avatar = new File(base + "/test_avatar_di_carlo.jpg");
FileUtils.writeByteArrayToFile(avatar, ((ORecordBytes) carlo.field("avatar")).toStream());
System.out.println("Avatar estratto in:" + avatar);
time = System.currentTimeMillis();
List amici = db.query(new OSQLSynchQuery("select flatten(lnk) from utenti where email = 'carlo@email.it'"));
System.out.println("Query elenco amici di carlo tot time: " + (System.currentTimeMillis() - time));
for (ODocument amico : amici) {
System.out.println(amico.field("email"));
}
System.out.println();
System.out.println();
time = System.currentTimeMillis();
amici = db.query(new OSQLSynchQuery("select flatten(lnk) from utenti where email = 'roberta@email.it'"));
System.out.println("Query amici di amici di roberta - tot time: " + (System.currentTimeMillis() - time));
for (ODocument amico : amici) {
System.out.print(amico.field("email") + " : ");
for (ODocument amico_di_amico : ((ArrayList) amico.field("lnk", OType.EMBEDDEDLIST))) {
System.out.print(amico_di_amico.field("email") + " ");
}
System.out.println();
}
System.out.println();
System.out.println();
time = System.currentTimeMillis();
List mia_bacheca = db.query(new OSQLSynchQuery("select * from post where utente.email = 'fede@email.it'"));
System.out.println("Query la bacheca di fede tot time: " + (System.currentTimeMillis() - time));
for (ODocument post : mia_bacheca) {
System.out.println("post: '" + post.field("text") + "' da " + ((ODocument) post.field("utente")).field("email"));
if (post.field("lnk") != null) {
ArrayList lnks = (ArrayList) post.field("lnk");
for (ODocument lnk : lnks) {
System.out.println("\t\tquesto post piace a: " + lnk.field("email"));
}
}
if (post.field("commenti") != null) {
ArrayList commenti = (ArrayList) post.field("commenti");
for (ODocument commento : commenti) {
System.out.println("\tcommento: '" + commento.field("text") + "' da " + ((ODocument) commento.field("utente")).field("email"));
if (commento.field("lnk") != null) {
ArrayList lnks = (ArrayList) commento.field("lnk");
for (ODocument lnk : lnks) {
System.out.println("\t\tquesto commento piace a: " + lnk.field("email"));
}
}
}
}
System.out.println();
}
System.out.println("******* Stop Queries");
} catch (Exception e) {
System.out.println("e:" + e.getMessage() + e.getStackTrace().toString());
db.rollback();
} finally {
db.close();
}
//server
server.shutdown();
} catch (Exception ex) {
System.out.println("ex:" + ex.getMessage() + ex.getStackTrace().toString());
}
}
}
risultato:
****** Start Query
Query dati di carlo - tot time: 56
nome:carlo
cognome:rossi
Avatar estratto in:/Users/marco/orientdb/test_avatar_di_carlo.jpg
Query elenco amici di carlo tot time: 38
mauro@email.it
matteo@email.it
roberta@email.it
marco@email.it
Query amici di amici di roberta - tot time: 27
carlo@email.it : mauro@email.it matteo@email.it roberta@email.it
mauro@email.it : carlo@email.it fede@email.it roberta@email.it
fede@email.it : mauro@email.it roberta@email.it
Query la bacheca di fede tot time: 56
post: 'una buona giornata a carlo e roberta' da fede@email.it
questo post piace a: mauro@email.it
questo post piace a: matteo@email.it
commento: 'buona giornata a te' da mauro@email.it
questo commento piace a: fede@email.it
questo commento piace a: carlo@email.it
commento: 'buona giornata a voi' da roberta@email.it
questo commento piace a: carlo@email.it
questo commento piace a: roberta@email.it
******* Stop Queries
note:
le query non funzionano così : email='carlo@email.it'. Ma così email = 'carlo@email.it' (attenzione agli spazi)
altre puntate - #1 #2
Nessun commento:
Posta un commento