Visualizzazione post con etichetta Embedding. Mostra tutti i post
Visualizzazione post con etichetta Embedding. Mostra tutti i post

lunedì 7 novembre 2011

Java e Open Office - JodConverter

Alle volte nasce l'esigenza di convertire dei documenti in vari formati, file di tipo pdf/doc/rtf.

Per la generazione di PDF e RTF ho eseguito qualche prova con Apache FOP, strumento molto valido, ma ridotto solo su determinati formati di output.

Su suggerimento di Frank decido di utilizzare Open Office come servizio su un server Ubuntu. Aggancio una piccola servlet in java su un tomcat che esegue la generazione del documento a fronte di un file in ingresso (nel mio caso passo un .odt e genero un doc e un pdf) Per supportare il tutto uso la libreria JodConverter che attraverso la lib uno si connette ad una istanza di Open Office avviata come server in ascolto su una porta definita (di default la 8100) ed esegue la conversione.

Installazione su server ubuntu da console:


apt-get install jodconverter  
apt-get install tomcat6
apt-get install tomcat6-admin

creato il file /etc/init.d/openoffice.sh
chmod 0755 /etc/init.d/openoffice.sh
lo script [via] piccola modifica al file openoffice.sh per la cartella dei bin

...
OOo_HOME=/usr/lib/openoffice/program/
....

a questo punto dopo aver fatto partire il nostro script di openoffice server possiamo usarlo come servizio.

In allegato un semplicissima web-app in java (in NetBeans) per gestire la conversione di un file in input in qualsiasi formato supportato da OpenOffice. Come da Documentazione si consiglia di installare la app che gestisce la conversione sulla stessa macchina su cui viene eseguito l'OpenOffice Server.

risorse:

Open Office Service
JodConverter
da Php a Odt
JodPackage
Open Office Formati di Import/export


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


lunedì 2 maggio 2011

OrientDB - Metodi di scrittura: ODocument e Pojo (Embedding in java) - #2

altre puntate: #1

prelevo un file di 10 mb da questo sito per avere dei dati di test per provare le performace di scrittura di questo db, ovvero prendo una classe la aggiungo ad un document e salvo il tutto.

Il file era troppo piccolo quindi lo copia e incollato su se stesso diverse volte ottenendo circa 720000  righe (adesso il mio file pesa 52 MB circa).

metoto ODocument con la classe ODatabaseDocumentTx

ecco il codice:


package orientdbtest;

import com.orientechnologies.orient.core.db.document.ODatabaseDocumentTx;
import com.orientechnologies.orient.core.metadata.security.OUser;
import com.orientechnologies.orient.core.record.impl.ODocument;
import com.orientechnologies.orient.core.sql.query.OSQLSynchQuery;
import com.orientechnologies.orient.server.OServer;
import com.orientechnologies.orient.server.OServerMain;
import java.io.File;

public class Main {

    public static class GeoIp {

        String from;
        String to;
        Long lat;
        Long lng;
        String country;
        String state;

        public void setFrom(String from) {
            this.from = from;
        }

        public void setTo(String to) {
            this.to = to;
        }

        public void setCountry(String country) {
            this.country = country;
        }

        public void setState(String state) {
            this.state = state;
        }

        public String getFrom() {
            return from;
        }

        public String getTo() {
            return to;
        }

        public String getCountry() {
            return country;
        }

        public String getState() {
            return state;
        }

        public Long getLng() {
            return lng;
        }

        public Long getLat() {
            return lat;
        }

        public void setLng(Long lng) {
            this.lng = lng;
        }

        public void setLat(Long lat) {
            this.lat = lat;
        }
    }

    public static void main(String[] args) {
        try {

            String base = "/home/marco/Scrivania/orientdb/";

            OServer server = OServerMain.create();
            server.startup(new File(base + "/file/conf.xml"));

            ODatabaseDocumentTx db = new ODatabaseDocumentTx("local:" + base + "/db").create();


            try {


                for (String s : db.getClusterNames()) {
                    System.out.println("name: " + s + " - " + db.countClusterElements(s));

                }

                db.begin();


                BigFile geoip_list = new BigFile(base + "/file/data/GeoIPCountryWhois.csv");


                long time = System.currentTimeMillis();


                long c = 0;
                for (String geoip_row : geoip_list) {
                    geoip_row = geoip_row.replaceAll("\"", "");
                    String[] s = geoip_row.split("\\,");
                    GeoIp geoIp = new GeoIp();
                    geoIp.setFrom(s[0]);
                    geoIp.setTo(s[1]);
                    geoIp.setLat(new Long(s[2]));
                    geoIp.setLng(new Long(s[3]));
                    geoIp.setCountry(s[4]);
                    geoIp.setState(s[5]);

                    ODocument doc = new ODocument(db);
                    doc.field("geoIp", geoIp);
                    doc.save();
                    if(c>10000 && c % 10000 == 0)
                        System.out.println(c);
                    c++;
                }



                db.commit();
                System.out.println("tot time: " + (System.currentTimeMillis() - time));
                System.out.println("commit:" + c);


            } catch (Exception e) {
                System.out.println("e:" + e.getMessage() + e.getStackTrace().toString());
                db.rollback();
            } finally {


                for (String s : db.getClusterNames()) {
                    System.out.println("name: " + s + " - " + db.countClusterElements(s));

                }

                db.close();
            }

            server.shutdown();
        } catch (Exception ex) {
            System.out.println("ex:" + ex.getMessage()+ ex.getStackTrace().toString());
        }


    }
}



qui la classe BigFile

lancio il tutto da console per evitare di usare troppa ram dalla ide visto che leggo il file con un iterator.

java -jar "/home/marco/netbeans-project/OrientDbTest/dist/OrientDbTest.jar" 

2011-04-29 05:29:02:098 INFO [OServer] OrientDB Server v1.0rc1-SNAPSHOT is starting up...
2011-04-29 05:29:07:325 INFO [OServerNetworkListener] Listening binary connections on 0.0.0.0:2424
2011-04-29 05:29:12:331 INFO [OServerNetworkListener] Listening http connections on 0.0.0.0:2480
2011-04-29 05:29:12:331 INFO [OServer] OrientDB Server v1.0rc1-SNAPSHOT is active.name: internal - 4
name: index - 0
name: default - 0
name: orole - 3
name: ouser - 3
20000
30000
40000
...
...
...
690000
700000
710000
tot time: 39482
commit:719600
name: internal - 4
name: index - 0
name: default - 719600
name: orole - 3
name: ouser - 3



...non male!!! inserite 719600 righe in 39 secondi tutto embeddato in un jar sul pc client....

se utilizzo il metodo POJO, ovvero OrientDB mappa la classe e salvo direttamente la classe mappata il tutto diventa molto più lento (forse perchè deve ricostruire tutto l'object in fase di salvataggio).

metodo POJO con la class ODatabaseObjectTx


package orientdbtest;

import com.orientechnologies.orient.core.db.document.ODatabaseDocumentTx;
import com.orientechnologies.orient.core.db.object.ODatabaseObjectTx;
import com.orientechnologies.orient.core.annotation.OVersion;
import com.orientechnologies.orient.core.metadata.security.OUser;
import com.orientechnologies.orient.core.record.impl.ODocument;
import com.orientechnologies.orient.core.sql.query.OSQLSynchQuery;
import com.orientechnologies.orient.core.type.ODocumentWrapper;
import com.orientechnologies.orient.server.OServer;
import com.orientechnologies.orient.server.OServerMain;
import javax.persistence.Id;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;


public class Main {

    public static class GeoIp  {

          @Id
          private Object id;
          @OVersion
          private Object version;


        private String from;
        private String to;
        private Long lat;
        private Long lng;
        private String country;
        private String state;

        public void setFrom(String from) {
            this.from = from;
        }

        public void setTo(String to) {
            this.to = to;
        }

        public void setCountry(String country) {
            this.country = country;
        }

        public void setState(String state) {
            this.state = state;
        }

        public String getFrom() {
            return from;
        }

        public String getTo() {
            return to;
        }

        public String getCountry() {
            return country;
        }

        public String getState() {
            return state;
        }

        public Long getLng() {
            return lng;
        }

        public Long getLat() {
            return lat;
        }

        public void setLng(Long lng) {
            this.lng = lng;
        }

        public void setLat(Long lat) {
            this.lat = lat;
        }
    }

    public static void main(String[] args) {
        try {

            String base = "/home/marco/Scrivania/orientdb/";

            OServer server = OServerMain.create();
            server.startup(new File(base + "/file/conf.xml"));


                ODatabaseObjectTx db = new ODatabaseObjectTx("local:" + base + "/db").create();
                db.getEntityManager().registerEntityClass(GeoIp.class);
                
            try {


                for (String s : db.getClusterNames()) {
                    System.out.println("name: " + s + " - " + db.countClusterElements(s));

                }

                db.begin();


                BigFile geoip_list = new BigFile(base + "/file/data/GeoIPCountryWhois.csv");


                long time = System.currentTimeMillis();


                long c = 0;


                for (String geoip_row : geoip_list) {
                    geoip_row = geoip_row.replaceAll("\"", "");
                    String[] s = geoip_row.split("\\,");
                    GeoIp geoIp = new GeoIp();
                    geoIp.setFrom(s[0]);
                    geoIp.setTo(s[1]);
                    geoIp.setLat(new Long(s[2]));
                    geoIp.setLng(new Long(s[3]));
                    geoIp.setCountry(s[4]);
                    geoIp.setState(s[5]);
                    db.save(geoIp);
                    if(c>10000 && c % 10000 == 0)
                        System.out.println(c);
                    c++;
                }



                db.commit();
                System.out.println("tot time: " + (System.currentTimeMillis() - time));
                System.out.println("commit:" + c);


            } catch (Exception e) {
                System.out.println("e:" + e.getMessage() + e.getStackTrace().toString());
                db.rollback();
            } finally {


                for (String s : db.getClusterNames()) {
                    System.out.println("name: " + s + " - " + db.countClusterElements(s));

                }

                db.close();
            }


            server.shutdown();
        } catch (Exception ex) {
            System.out.println("ex:" + ex.getMessage()+ ex.getStackTrace().toString());
        }


    }
}




qui vengono indicate le velocità (colonna speed) in base al metodologia di salvataggio usato.


altre puntate: #1

venerdì 29 aprile 2011

OrientDB - primi passi di Embedding in java - #1

Sono sempre alla ricerca di DB in java da Embeddare in modo da provarli più rapidamente su NetBeans.

Dopo avere scaricato le lib della RC1 dal sito, prendo confidenza con lo strumento con qualche articolo su  RecordID e i Cluster

includo le lib nel mio progetto ed inizio a capire dalla documentazione come creare e gestire un db.




import com.orientechnologies.orient.core.db.document.ODatabaseDocumentTx;
import com.orientechnologies.orient.core.metadata.security.OUser;
import com.orientechnologies.orient.core.record.impl.ODocument;
import com.orientechnologies.orient.core.sql.query.OSQLSynchQuery;
import com.orientechnologies.orient.server.OServer;
import com.orientechnologies.orient.server.OServerMain;
import java.io.File;

public class Main {

  public static void main(String[] args) {

    try {

          OServer server = OServerMain.create();
          server.startup(new File("/home/marco/file/conf.xml"));
          ODatabaseDocumentTx db = new ODatabaseDocumentTx("local:/home/marco/db").create();
          server.shutdown();
    } catch (Exception ex) {
            System.out.println("ex:" + ex.getMessage());
    }

  }
}




il file conf.xml è questo:


<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<orient-server>
<network>
<protocols>
    <protocol name="binary" implementation="com.orientechnologies.orient.server.network.protocol.binary.ONetworkProtocolBinary"/>
    <protocol name="http" implementation="com.orientechnologies.orient.server.network.protocol.http.ONetworkProtocolHttpDb"/>
    </protocols>
    <listeners>
    <listener ip-address="0.0.0.0" port-range="2424-2430" protocol="binary"/>
    <listener ip-address="0.0.0.0" port-range="2480-2490" protocol="http"/>
    </listeners>
  </network>
    <users>
    <user name="root" password="test" resources="*"/>
    </users>
    <properties>
    <entry name="orientdb.www.path" value="/home/marco/Scrivania/orientdb/www/"/>
    <entry name="orientdb.config.file" value="/home/marco/Scrivania/orientdb/file/orientdb-server-config.xml"/>
    <entry name="server.cache.staticResources" value="false"/>
    <entry name="log.console.level" value="info"/>
<entry name="log.file.level" value="fine"/>
    </properties>
</orient-server>



a questo punto il db è creato per accederci bisogna utilizzare questa connessione:

ODatabaseDocumentTx db = new ODatabaseDocumentTx("local:/home/marco/db").open("admin", "admin");


di default viene creato l'utente admin admin per l'accesso del db in locale.


con questa funzionalità è possibile vedere quali cluster sono presenti, gli elementi contenuti e info sull'utente in uso sul nostro nuovo db:

System.out.println("closed:" + db.isClosed());
OUser user = db.getUser();
System.out.println("user:" + user.getName());
System.out.println("password:" + user.getPassword());

for (String s : db.getClusterNames()) {
           System.out.println("cluster: " + s + " - " + db.countClusterElements(s));

}




Salviamo qualcosa


          try {
db.begin();

ODocument persona = new ODocument(db, "Persona");
persona.field("nome", "marco");
persona.field("cognome", "bianchi");
persona.save();

persona = new ODocument(db, "Persona");
persona.field("nome", "carlo");
persona.field("cognome", "rossi");
persona.save();

db.commit();
} catch (Exception e) {
System.out.println("ex:" + e.getMessage());
db.rollback();
} finally {
db.close();
}



Eseguiamo la query ed estraiamo i valori appena scritti


List persone = db.query(new OSQLSynchQuery("select from Persona"));

for (ODocument persona : persone) {
System.out.println( persona.field("nome") + " " +  persona.field("cognome"));
}

non male vero?

se rieseguite il codice per elencare i cluster vedrete:

Persona : 2


E' possibili correlare anche gli object in questo modo inserendo documenti in documenti:




try {
db.begin();

ODocument persona = new ODocument(db, "Persona");
persona.field("nome", "marco");
persona.field("cognome", "bianchi");

ODocument auto = new ODocument(db, "Auto");
auto.field("marco", "seat ibiza");
auto.field("cilindrata", "1444");
persona.field("auto",auto);


persona.save();

persona = new ODocument(db, "Persona");
persona.field("nome", "carlo");
persona.field("cognome", "rossi");

auto = new ODocument(db, "Auto");
auto.field("marco", "fiat punto");
auto.field("cilindrata", "1245");
persona.field("auto",auto);

persona.save();

db.commit();
} catch (Exception e) {
System.out.println("ex:" + e.getMessage());
db.rollback();
} finally {
db.close();
}





e ancora più complesso inserendo una lista di valori in un field sotto forma di List:




try {
db.begin();

ODocument persona = new ODocument(db, "Persona");
persona.field("nome", "marco");
persona.field("cognome", "bianchi");

ArrayList mezzi_list = new ArrayList();

ODocument auto = new ODocument(db, "Auto");
auto.field("marco", "seat ibiza");
auto.field("cilindrata", "1444");

mezzi_list.add(auto);

auto = new ODocument(db, "Auto");
auto.field("marco", "fiat punto");
auto.field("cilindrata", "1245");

mezzi_list.add(auto);

persona.field("mezzi",mezzi_list);

persona.save();

db.commit();
} catch (Exception e) {
System.out.println("ex:" + e.getMessage());
db.rollback();
} finally {
db.close();
}