This diagnostics object informs you that a Native Query cannot be optimized. It means that it will be run by instantiating all objects of the candidate class. Try to simplify your query expression.
For an example let's look at a predicate using 2 different unrelated clauses.
/* Copyright (C) 2004 - 2007 db4objects Inc. http://www.db4o.com */
02
package com.db4odoc.diagnostics;
03
04
import com.db4o.query.Predicate;
05
06
public class ArbitraryQuery extends Predicate<Pilot>{
07
public int[] points;
08
09
public ArbitraryQuery(int[] points) {
10
this.points=points;
11
}
12
13
public boolean match(Pilot pilot) {
14
for (int i = 0; i < points.length; i++) {
15
if (((Pilot)pilot).getPoints() == points[i])
16
{
17
return true;
18
}
19
}
20
return ((Pilot)pilot).getName().startsWith("Rubens");
21
}
22
}
private static void queryPilot(ObjectContainer container){
2
int[] i = new int[]{19,100};
3
ObjectSet result = container.query(new ArbitraryQuery(i));
4
listResult(result);
5
}
private static void testArbitrary() {
02
Configuration configuration = Db4o.newConfiguration();
03
configuration.diagnostic().addListener(new DiagnosticToConsole());
04
new File(DB4O_FILE_NAME).delete();
05
ObjectContainer container=Db4o.openFile(configuration, DB4O_FILE_NAME);
06
try {
07
Pilot pilot = new Pilot("Rubens Barrichello",99);
08
container.set(pilot);
09
queryPilot(container);
10
}
11
finally {
12
container.close();
13
}
14
}