package info.gamlor.db4oseries;

import com.db4o.Db4oEmbedded;
import com.db4o.ObjectContainer;
import com.db4o.ObjectSet;
import com.db4o.query.Predicate;
import com.db4o.query.QueryComparator;

import java.io.File;
import java.util.List;

/**
 * @author roman.stoffel@gamlor.info
 * @since 26.10.2009
 */
public class Main {
    public static void main(String[] args) {
        new File("test.db40").delete();
        ObjectContainer db = Db4oEmbedded.openFile("test.db40");
        fillDatabase(db);
        System.out.println("---native-queries----");
        nativeQueries(db);
        System.out.println("---by example----");
        byExample(db);


    }

    private static void byExample(ObjectContainer db) {
        SimpleObject toSearchFor = new SimpleObject("MyObject-3",3);
        final ObjectSet<Object> result1 = db.queryByExample(toSearchFor);
        printAll(result1);
System.out.println("-cannot get the object with Number=0---");
SimpleObject doesnotWork = new SimpleObject(0);
final ObjectSet<Object> result2 = db.queryByExample(doesnotWork);
        printAll(result2);
    }

    private static void nativeQueries(ObjectContainer db) {
        List<SimpleObject> result1 = db.query(new Predicate<SimpleObject>() {
            @Override
            public boolean match(SimpleObject o) {
                return o.getNumber()>2;
            }
        });
        printAll(result1);
        List<ComplexObject> result2 = db.query(new Predicate<ComplexObject>() {
        @Override
        public boolean match(ComplexObject o) {
            return o.getVersion()==1&& o.getKnowsAbout().getNumber()<2|| o.getMightKnowsAlso()!=null;
        }
        },new QueryComparator<ComplexObject>() {
            public int compare(ComplexObject complexObject, ComplexObject complexObject1) {
            return complexObject.getKnowsAbout().getName().compareTo(complexObject1.getKnowsAbout().getName());
            }
        });
        printAll(result2);
    }

    private static void printAll(List<?> result) {
        for (Object simpleObject : result) {
            System.out.println("Simple-Object:"+simpleObject);
        }
    }

    private static void fillDatabase(ObjectContainer db) {
        db.store(new SimpleObject("MyObject-0",0));
        db.store(new SimpleObject("MyObject-0",0));
        db.store(new SimpleObject("MyObject-1",1));
        db.store(new SimpleObject("MyObject-2",2));
        db.store(new SimpleObject("MyObject-3",3));
        db.store(new SimpleObject("MyObject-3",3));
        db.store(new SimpleObject("MyObject",22));
        db.store(new ComplexObject(new SimpleObject("C-KnownBy-Complex-1",1)));
        db.store(new ComplexObject(new SimpleObject("B-KnownBy-Complex-2",2)));
        db.store(new ComplexObject(new SimpleObject("A-KnownBy-Complex-3",3)));
        final ComplexObject veryComplexObj = new ComplexObject(new SimpleObject("A-KnownBy-Complex-3", 3));
        veryComplexObj.setMightKnowsAlso(new SimpleObject("KnownBy-Complex-4", 4));
        db.store(veryComplexObj);
        db.commit();
    }
}

