giovedì 5 maggio 2011

OrientDB - Import da csv relazionali, relazioni, archiviare file e query #3


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: