0

私は公式のdb4oチュートリアルの一部をざっと見ていて、ネイティブクエリを実行するためにそれらが提供するコードに変更を加えようとしています。

//the original
List<Pilot> pilots = db.query(new Predicate<Pilot>() {
    public boolean match(Pilot pilot) {
        return pilot.getPoints() == 100;
    }
});

//modified
List<Pilot> pilots = db.query(new Predicate<Pilot>() {
    public boolean match(Pilot pilot) {
        return pilot.getGames() >= 100;
    }
});

私はこれを彼らのパイロットクラスに追加しました:

//in declarations
private ArrayList<String> games;  

//modified constructors
public Pilot() {
    this.name=null;
    this.points=0;
}
public Pilot(String name,int points) {
    this.name=name;
    this.points=points;
    this.games = new ArrayList<String>();
    int numGames = (int) (Math.random() * 1000 + 1);
    for(int i=0;i<numGames;i++) {
        this.games.add(name=" vs Computer");
    }
}

//new method
public int getGames() {
    return games.size();
}

2番目のコンストラクターを使用してデータベースに500個のオブジェクトを既に入力しましたが、データベース内のすべてのデータはOMEeclipseアドオンで正しく表示されます。getGames()をテストしましたが、期待どおりに機能します。

私の問題は、変更されたクエリを実行すると、データベース内のすべてのオブジェクトが返され、その理由がわからないことです。trueの場合はより標準的な構造を含めるようにクエリを変更し、それ以外の場合はfalseの構造を含めるようにクエリを変更し、無駄になるまで一定量のポイントを要求するようにクエリを変更してみました。私が何をするにしても、それは常に(pilot.getGames()> = 100)が真であると評価しているようです。

誰かが理由を理解するのを手伝ってくれますか?

4

1 に答える 1

0

バグを見つけたと思います。db4oは、native-queriesをsoda-queryに変換しようとします。これにより、クエリを実行するためにオブジェクトにインスタンス化することを回避できます。今ここでこの翻訳はどういうわけか機能しません!

最適化をオフにすると、機能します。これは、構成を介して行うことができます。

    EmbeddedConfiguration cfg = Db4oEmbedded.newConfiguration();
    cfg.common().optimizeNativeQueries(false);
    ObjectContainer db = Db4oEmbedded.openFile(cfg,DB_FILE)

ただし、すべてのクエリの実行が遅くなるため、これはお勧めしません。簡単な回避策を見つけました。games-fieldの宣言をに変更しList<String>ます。(およびその他の将来のリストフィールド)。このような:

   class Pilot {
         private List<String> games;
         // rest
   }  

これにより、size()または他のメソッドにアクセスするとすぐに、ネイティブクエリが「最適化解除」されるため、このバグが回避されます。

これで、「最適化されていない」クエリの実行が非常に遅くなる可能性があります。したがって、オブジェクトがたくさんあり、パフォーマンスが許容できない場合は、このクエリに対してこれを行います。リストの現在のサイズを格納する追加フ​​ィールドを作成します。次に、この種類のクエリにこの追加のサイズフィールドを使用します。さらに、サイズフィールドにインデックスを付けることができます。

私はこれをバグとして報告しました

于 2010-03-03T21:23:38.753 に答える