12. SODA Evaluations


In the SODA API chapter we already mentioned Evaluations as a means of providing user-defined custom constraints and as a means to run any arbitrary code in a SODA query. Let's have a closer look.


    12.1. Evaluation API


    The evaluation API consists of two interfaces, Evaluation and Candidate . Evaluation implementations are implemented by the user and injected into a query. During a query, they will be called from db4o with a candidate instance in order to decide whether to include it into the current (sub-)result.


    The Evaluation interface contains a single method only:

    public void evaluate(Candidate candidate);


    This will be called by db4o to check whether the object encapsulated by this candidate should be included into the current candidate set.


    The Candidate interface provides three methods:

    public Object getObject();
    public void include(boolean flag);
    public ObjectContainer objectContainer();


    An Evaluation implementation may call getObject() to retrieve the actual object instance to be evaluated, it may call include() to instruct db4o whether or not to include this object in the current candidate set, and finally it may access the current database directly by calling objectContainer().



    12.2. Example


    For a simple example, let's go back to our Pilot/Car implementation from the Collections chapter. Back then, we kept a history of SensorReadout instances in a List member inside the car. Now imagine that we wanted to retrieve all cars that have assembled an even number of history entries. A quite contrived and seemingly trivial example, however, it gets us into trouble: Collections are transparent to the query API, it just 'looks through' them at their respective members.


    So how can we get this done? Let's implement an Evaluation that expects the objects passed in to be instances of type Car and checks their history size.

    using Db4objects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4o.Query;
    using Db4objects.Db4o.Tutorial.F1.Cly tribjects.Db4