use of com.apple.foundationdb.record.query.plan.plans.QueryResult in project fdb-record-layer by FoundationDB.
the class FDBStreamAggregateTest method aggregateOneGroupByTwo.
@Test
public void aggregateOneGroupByTwo() throws Exception {
try (FDBRecordContext context = openContext()) {
openSimpleRecordStore(context, NO_HOOK);
RecordQueryPlan plan = new AggregatePlanBuilder("MySimpleRecord").withAggregateValue("num_value_2", "SumInteger").withGroupCriterion("num_value_3_indexed").withGroupCriterion("str_value_indexed").build();
List<QueryResult> result = executePlan(plan);
assertResults(result, resultOf(0, "0", 1), resultOf(1, "0", 2), resultOf(1, "1", 3), resultOf(2, "1", 9));
}
}
use of com.apple.foundationdb.record.query.plan.plans.QueryResult in project fdb-record-layer by FoundationDB.
the class FDBStreamAggregateTest method aggregateOneGroupByNone.
@Test
public void aggregateOneGroupByNone() throws Exception {
try (FDBRecordContext context = openContext()) {
openSimpleRecordStore(context, NO_HOOK);
RecordQueryPlan plan = new AggregatePlanBuilder("MySimpleRecord").withAggregateValue("num_value_2", "SumInteger").build();
List<QueryResult> result = executePlan(plan);
assertResults(result, resultOf(15));
}
}
use of com.apple.foundationdb.record.query.plan.plans.QueryResult in project fdb-record-layer by FoundationDB.
the class LuceneIndexQueryPlan method executePlan.
/**
* Override here to have specific logic to build the {@link QueryResult} for lucene auto complete suggestion result.
*/
@Nonnull
@Override
public <M extends Message> RecordCursor<QueryResult> executePlan(@Nonnull FDBRecordStoreBase<M> store, @Nonnull EvaluationContext context, @Nullable byte[] continuation, @Nonnull ExecuteProperties executeProperties) {
final RecordMetaData metaData = store.getRecordMetaData();
final Index index = metaData.getIndex(indexName);
final Collection<RecordType> recordTypes = metaData.recordTypesForIndex(index);
if (recordTypes.size() != 1) {
throw new RecordCoreException("No lucene index should span multiple record types");
}
final IndexScanType scanType = getScanType();
if (scanType == IndexScanType.BY_LUCENE_AUTO_COMPLETE || scanType == IndexScanType.BY_LUCENE_SPELLCHECK) {
final RecordType recordType = recordTypes.iterator().next();
final RecordCursor<IndexEntry> entryRecordCursor = executeEntries(store, context, continuation, executeProperties);
return entryRecordCursor.map(QueryPlanUtils.getCoveringIndexEntryToPartialRecordFunction(store, recordType.getName(), indexName, getToPartialRecord(index, recordType, scanType), scanType)).map(QueryResult::of);
}
return super.executePlan(store, context, continuation, executeProperties);
}
use of com.apple.foundationdb.record.query.plan.plans.QueryResult in project fdb-record-layer by FoundationDB.
the class ComposedBitmapIndexQueryPlan method executePlan.
@Nonnull
@Override
public <M extends Message> RecordCursor<QueryResult> executePlan(@Nonnull final FDBRecordStoreBase<M> store, @Nonnull final EvaluationContext context, @Nullable final byte[] continuation, @Nonnull final ExecuteProperties executeProperties) {
final ExecuteProperties scanExecuteProperties = executeProperties.getSkip() > 0 ? executeProperties.clearSkipAndAdjustLimit() : executeProperties;
final List<Function<byte[], RecordCursor<IndexEntry>>> cursorFunctions = indexPlans.stream().map(RecordQueryCoveringIndexPlan::getIndexPlan).map(scan -> (Function<byte[], RecordCursor<IndexEntry>>) childContinuation -> scan.executeEntries(store, context, childContinuation, scanExecuteProperties)).collect(Collectors.toList());
return ComposedBitmapIndexCursor.create(cursorFunctions, composer, continuation, store.getTimer()).filter(indexEntry -> indexEntry.getValue().get(0) != null).map(indexPlans.get(0).indexEntryToQueriedRecord(store)).map(QueryResult::of);
}
use of com.apple.foundationdb.record.query.plan.plans.QueryResult in project fdb-record-layer by FoundationDB.
the class RecordQuerySortPlan method executePlan.
@Nonnull
@Override
public <M extends Message> RecordCursor<QueryResult> executePlan(@Nonnull FDBRecordStoreBase<M> store, @Nonnull EvaluationContext context, @Nullable byte[] continuation, @Nonnull ExecuteProperties executeProperties) {
// Since we are sorting, we need to feed through everything from the inner plan,
// even just to get the top few.
final ExecuteProperties executeInner = executeProperties.clearSkipAndLimit();
final Function<byte[], RecordCursor<FDBQueriedRecord<M>>> innerCursor = innerContinuation -> getChild().executePlan(store, context, innerContinuation, executeInner).map(result -> result.<M>getQueriedRecord(0));
final int skip = executeProperties.getSkip();
final int limit = executeProperties.getReturnedRowLimitOrMax();
final int maxRecordsToRead = limit == Integer.MAX_VALUE ? limit : skip + limit;
final RecordQuerySortAdapter<M> adapter = key.getAdapter(store, maxRecordsToRead);
final FDBStoreTimer timer = store.getTimer();
final RecordCursor<FDBQueriedRecord<M>> sorted;
if (adapter.isMemoryOnly()) {
sorted = MemorySortCursor.create(adapter, innerCursor, timer, continuation).skipThenLimit(skip, limit);
} else {
sorted = FileSortCursor.create(adapter, innerCursor, timer, continuation, skip, limit);
}
return sorted.map(QueryResult::of);
}
Aggregations