如何使用NavigableIndex从cqengine IndexedCollection获取第一项或最后一项

时间:2018-07-12 14:45:53

标签: java cqengine

我为com.googlecode.cqengine.IndexedCollection对象配置了NavigableIndex。通常,我需要从索引或索引的迭代器中获取第一项或最后一项。

我认为这应该是微不足道的。我知道我可以使用queryOptions对象创建Query对象,使用它从IndexedCollection检索迭代器并获取第一个对象,但是我不确定它是否对性能最佳。当然,这并不优雅。

4 个答案:

答案 0 :(得分:1)

在miradham的帮助下,我发现我需要记住索引,因为如果我们拥有更多的索引,则很难选择正确的索引。它仅适用于NavigableIndex,我们不能迭代基类Index

collection = new ConcurrentIndexedCollection<Data>();
index = NavigableIndex.onAttribute(Data.UNIQUE_TIMESTAMP);
collection.addIndex(index);

当我有索引时:

try (CloseableIterator<KeyValue<String, Data>> iterator = indexUniqueTimestamp.getKeysAndValuesDescending(null).iterator()) {
        if (iterator.hasNext())
            return iterator.next().getValue();
    }
    return null;

答案 1 :(得分:1)

根据其属性之一检索最小或最大(即第一个或最后一个)对象的一个​​技巧是使用all()查询(与集合中的所有对象匹配),并请求该结果应该以属性的升序或降序返回。

例如,如果您有一组Car对象,则可以使用以下代码来检索价格最高(即最高)的汽车:

try (ResultSet<Car> results = cars.retrieve(
    all(Car.class),
    queryOptions(
        orderBy(descending(Car.PRICE)),
        applyThresholds(
            threshold(INDEX_ORDERING_SELECTIVITY, 1.0)
        )
    ))) {

    results.stream()
        .limit(1)
        .forEach(System.out::println);
}

如果您希望退还前n名最昂贵的汽车,也可以将限制更改为1以外的值。

无论您是否实际使用价格NavigableIndex,以上代码都将起作用。关于INDEX_ORDERING_SELECTIVITY的一点是实际上要求CQEngine利用索引(更多详细信息here)。

答案 2 :(得分:0)

  

或一般而言索引的迭代器

您可以使用QueryEngine interfacegetIndexes() API来检索索引集。

示例代码:

IndexedCollection<Car> indexedCollection = new ConcurrentIndexedCollection<Car>();
indexedCollection.addIndex(HashIndex.onAttribute(Car.CAR_ID), noQueryOptions());

List<Index<Car>> indexes = new ArrayList<Index<Car>>();
for (Index<Car> index : indexedCollection.getIndexes()) {
    indexes.add(index);
}

答案 3 :(得分:-1)

NavigableIndex将对象存储在Map中的元素中,其中属性作为键,对象集作为值。

NavigableIndex不维护插入顺序。索引的第一个元素可以是任何东西。

CQEngine最好用于随机访问集合中的对象而不是顺序访问。

java中的普通集合最适合使用索引进行序列访问。

访问第一个元素的一种优雅方法是创建SequentialIndex类并将其添加到并发集合中。使用索引作为查询来检索元素。