use of com.apple.foundationdb.record.query.plan.plans.RecordQueryPlan in project fdb-record-layer by FoundationDB.
the class RankIndexTest method rightHalfIntervalRankQuery.
@Test
public void rightHalfIntervalRankQuery() throws Exception {
RecordQuery query = RecordQuery.newBuilder().setRecordType("BasicRankedRecord").setFilter(Query.rank("score").lessThan(2L)).build();
RecordQueryPlan plan = planner.plan(query);
assertEquals("Index(BasicRankedRecord$score ([null],[2]) BY_RANK)", plan.toString());
try (FDBRecordContext context = openContext()) {
openRecordStore(context);
try (RecordCursor<FDBQueriedRecord<Message>> cursor = recordStore.executeQuery(plan)) {
RecordCursorResult<FDBQueriedRecord<Message>> result = cursor.getNext();
FDBQueriedRecord<Message> rec = result.get();
TestRecordsRankProto.BasicRankedRecord.Builder myrec = TestRecordsRankProto.BasicRankedRecord.newBuilder();
myrec.mergeFrom(rec.getRecord());
assertEquals("hector", myrec.getName());
assertEquals(75, myrec.getScore());
result = cursor.getNext();
assertTrue(result.hasNext());
rec = result.get();
myrec = TestRecordsRankProto.BasicRankedRecord.newBuilder();
myrec.mergeFrom(rec.getRecord());
assertEquals("achilles", myrec.getName());
assertEquals(100, myrec.getScore());
result = cursor.getNext();
assertFalse(result.hasNext());
}
}
}
use of com.apple.foundationdb.record.query.plan.plans.RecordQueryPlan in project fdb-record-layer by FoundationDB.
the class RankIndexTest method leftHalfIntervalRankQuery.
@Test
public void leftHalfIntervalRankQuery() throws Exception {
RecordQuery query = RecordQuery.newBuilder().setRecordType("BasicRankedRecord").setFilter(Query.rank("score").greaterThan(2L)).build();
RecordQueryPlan plan = planner.plan(query);
assertEquals("Index(BasicRankedRecord$score ([2],> BY_RANK)", plan.toString());
try (FDBRecordContext context = openContext()) {
openRecordStore(context);
try (RecordCursor<FDBQueriedRecord<Message>> cursor = recordStore.executeQuery(plan)) {
FDBQueriedRecord<Message> rec = cursor.getNext().get();
TestRecordsRankProto.BasicRankedRecord.Builder myrec = TestRecordsRankProto.BasicRankedRecord.newBuilder();
myrec.mergeFrom(rec.getRecord());
assertEquals("laodice", myrec.getName());
assertEquals(300, myrec.getScore());
assertFalse(cursor.getNext().hasNext());
}
}
}
use of com.apple.foundationdb.record.query.plan.plans.RecordQueryPlan in project fdb-record-layer by FoundationDB.
the class RankIndexTest method rankPlusMatchingNonRankIndex.
@Test
public void rankPlusMatchingNonRankIndex() throws Exception {
RecordMetaDataHook hook = md -> md.addIndex("BasicRankedRecord", new Index("AaaSumIndex", Key.Expressions.field("score").ungrouped(), IndexTypes.SUM));
try (FDBRecordContext context = openContext()) {
openRecordStore(context, hook);
// Ordinarily the stable order is the persistent form; force new index to the front.
recordStore.getRecordMetaData().getRecordType("BasicRankedRecord").getIndexes().sort(Comparator.comparing(Index::getName));
recordStore.rebuildIndex(recordStore.getRecordMetaData().getIndex("AaaSumIndex")).join();
commit(context);
}
// New index should not interfere with score_for_rank choice.
RecordQuery query = RecordQuery.newBuilder().setRecordType("BasicRankedRecord").setFilter(Query.and(Query.field("gender").equalsValue("F"), Query.rank(Key.Expressions.field("score").ungrouped()).equalsValue(2L))).build();
RecordQueryPlan plan = planner.plan(query);
assertEquals("Index(rank_by_gender [EQUALS F, EQUALS $__rank_0])" + " WHERE __rank_0 = BasicRankedRecord$score.score_for_rank(2)", plan.toString());
try (FDBRecordContext context = openContext()) {
openRecordStore(context, hook);
List<String> names = recordStore.executeQuery(plan).map(rec -> TestRecordsRankProto.BasicRankedRecord.newBuilder().mergeFrom(rec.getRecord()).getName()).asList().join();
assertEquals(Arrays.asList("helen", "penelope"), names);
assertEquals(875L, recordStore.evaluateAggregateFunction(Collections.singletonList("BasicRankedRecord"), new IndexAggregateFunction(FunctionNames.SUM, Key.Expressions.field("score"), null), Key.Evaluated.EMPTY, IsolationLevel.SNAPSHOT).join().getLong(0));
commit(context);
}
}
use of com.apple.foundationdb.record.query.plan.plans.RecordQueryPlan in project fdb-record-layer by FoundationDB.
the class RankIndexTest method rankScanIntersection.
@Test
public void rankScanIntersection() throws Exception {
try (FDBRecordContext context = openContext()) {
openRecordStore(context, md -> {
md.removeIndex("rank_by_gender");
md.addIndex("BasicRankedRecord", "gender");
});
recordStore.rebuildIndex(recordStore.getRecordMetaData().getIndex("BasicRankedRecord$gender")).join();
// Laodice fails the rank test; need something that fails the gender test.
recordStore.saveRecord(TestRecordsRankProto.BasicRankedRecord.newBuilder().setName("patroclus").setScore(200).setGender("M").build());
RecordQuery query = RecordQuery.newBuilder().setRecordType("BasicRankedRecord").setFilter(Query.and(Query.rank("score").equalsValue(2), Query.field("gender").equalsValue("F"))).build();
RecordQueryPlan plan = planner.plan(query);
assertEquals("Index(BasicRankedRecord$score [[2],[2]] BY_RANK) ∩ Index(BasicRankedRecord$gender [[F],[F]])", plan.toString());
Set<String> names = new HashSet<>();
Function<FDBQueriedRecord<Message>, String> name = rec -> TestRecordsRankProto.BasicRankedRecord.newBuilder().mergeFrom(rec.getRecord()).getName();
RecordCursor<String> cursor = recordStore.executeQuery(plan, null, ExecuteProperties.newBuilder().setReturnedRowLimit(1).build()).map(name);
RecordCursorResult<String> result = cursor.getNext();
assertTrue(result.hasNext());
names.add(result.get());
cursor = recordStore.executeQuery(plan, result.getContinuation().toBytes(), ExecuteProperties.newBuilder().setReturnedRowLimit(1).build()).map(name);
result = cursor.getNext();
assertTrue(result.hasNext());
names.add(result.get());
cursor = recordStore.executeQuery(plan, result.getContinuation().toBytes(), ExecuteProperties.newBuilder().setReturnedRowLimit(1).build()).map(name);
result = cursor.getNext();
assertFalse(result.hasNext());
assertEquals(Sets.newHashSet("penelope", "helen"), names);
commit(context);
}
}
use of com.apple.foundationdb.record.query.plan.plans.RecordQueryPlan in project fdb-record-layer by FoundationDB.
the class TextIndexTest method queryComplexDocumentsWithIndex.
@Nonnull
private List<Tuple> queryComplexDocumentsWithIndex(@Nonnull QueryComponent textFilter, @Nullable QueryComponent additionalFilter, boolean skipFilterCheck, long group, int planHash) throws InterruptedException, ExecutionException {
if (!(textFilter instanceof ComponentWithComparison)) {
throw new RecordCoreArgumentException("filter without comparison provided as text filter");
}
final Matcher<RecordQueryPlan> textScanMatcher = textIndexScan(allOf(indexName(COMPLEX_TEXT_BY_GROUP.getName()), groupingBounds(allOf(notNullValue(), hasTupleString("[[" + group + "],[" + group + "]]"))), textComparison(equalTo(((ComponentWithComparison) textFilter).getComparison()))));
// Don't care whether it's covering or not
final Matcher<RecordQueryPlan> textPlanMatcher = anyOf(textScanMatcher, coveringIndexScan(textScanMatcher));
final Matcher<RecordQueryPlan> planMatcher;
final QueryComponent filter;
if (additionalFilter != null) {
if (skipFilterCheck) {
planMatcher = descendant(textPlanMatcher);
} else {
planMatcher = descendant(filter(additionalFilter, descendant(textPlanMatcher)));
}
filter = Query.and(textFilter, additionalFilter, Query.field("group").equalsValue(group));
} else {
planMatcher = descendant(textPlanMatcher);
filter = Query.and(textFilter, Query.field("group").equalsValue(group));
}
return queryComplexDocumentsWithPlan(filter, planHash, planMatcher);
}
Aggregations