2016-06-11 6 views
1

CQEngineが他のオブジェクトでオブジェクトを照会できるかどうかは知りませんか?私はユーザー、注文、製品を照会できるようにしたいと考えています。CQEngineは別のオブジェクト内のオブジェクトにクエリを実行できます

これはCQEngineで行うことができますか、オブジェクトを平坦化する必要がありますか?

public class User { 
    public List<Orders> orders; 
} 

public class Orders { 
    public List<Products> products; 
} 

public class Products { 
    public String name; 
} 

答えて

3

はい、あなただけあなたがを検索するネストされたオブジェクトから値を返しますCQEngine属性を定義する必要があります。

たとえば、この属性は、特定のユーザーが配置した注文に含まれる各製品の名前を取得します。

static final Attribute<User, String> PRODUCT_NAMES_ORDERED = new MultiValueAttribute<User, String>() { 
    public Iterable<String> getValues(User user, QueryOptions queryOptions) { 
     return user.orders.stream() 
       .map(order -> order.products).flatMap(Collection::stream) 
       .map(product -> product.name)::iterator; 
    } 
}; 

必要に応じてその上にクエリを加速するために、この属性にインデックスを追加することができます。

ユーザーのIndexedCollectionを設定する例です。各ユーザーには複数の注文があり、各注文には多数の商品があります。製品は、映画館で見つかるかもしれない軽食です。 「Snickers Bar」を注文したユーザーのコレクションを検索します。

package com.googlecode.cqengine.examples.nestedobjects; 

import com.googlecode.cqengine.*; 
import com.googlecode.cqengine.attribute.*; 
import com.googlecode.cqengine.query.option.QueryOptions; 
import java.util.*; 
import static com.googlecode.cqengine.query.QueryFactory.*; 
import static java.util.Arrays.asList; 
import static java.util.Collections.singletonList; 

public class NestedObjectsExample { 

    public static void main(String[] args) { 
     Order order1 = new Order(asList(new Product("Diet Coke"), new Product("Snickers Bar"))); 
     Order order2 = new Order(singletonList(new Product("Sprite"))); 
     User user1 = new User(1, asList(order1, order2)); 

     Order order3 = new Order(asList(new Product("Sprite"), new Product("Popcorn"))); 
     User user2 = new User(2, singletonList(order3)); 

     Order order4 = new Order(singletonList(new Product("Snickers Bar"))); 
     User user3 = new User(3, singletonList(order4)); 

     IndexedCollection<User> users = new ConcurrentIndexedCollection<>(); 
     users.addAll(asList(user1, user2, user3)); 

     users.retrieve(equal(PRODUCT_NAMES_ORDERED, "Snickers Bar")).forEach(user -> System.out.println(user.userId)); 
     // ...prints 1, 3 
    } 

} 

はところで私はCQEngineの著者だし、あなたがCQEngine siteに、この例の完全なソースを見つけることができます。 (私はこれを新しい例として追加しました!)

+0

これは実際には素晴らしいことです。プロジェクトの開発時間を半分に短縮しました。ありがとう –

+0

問題ないです、喜んで助けて! – npgall

関連する問題