首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CQEngine可以查询另一个对象内的对象吗?

CQEngine可以查询另一个对象内的对象吗?
EN

Stack Overflow用户
提问于 2016-06-11 17:55:56
回答 1查看 2K关注 0票数 2

有人知道CQEngine是否可以在其他对象中查询对象吗?我希望能够查询用户,订单和产品。

这可以用CQEngine来完成吗?还是我需要把对象压平呢?

代码语言:javascript
复制
public class User {
    public List<Orders> orders;
}

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

public class Products {
    public String name;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-11 21:47:51

是的,您只需要定义一个CQEngine属性,它将从要搜索的嵌套对象返回值。

例如,该属性将检索每个产品的名称,这些名称包含在特定用户所下的订单中。

代码语言:javascript
复制
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“的用户。

代码语言:javascript
复制
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站点上找到这个示例的完整源代码。(我刚添加了一个新例子!)

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37766895

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档