use of com.apple.foundationdb.record.TestHelpers in project fdb-record-layer by FoundationDB.
the class FDBNestedFieldQueryTest method nestedWithBetween.
/**
* Verify that BETWEEN-style AND on nested fields merge properly.
*/
@DualPlannerTest
public void nestedWithBetween() throws Exception {
final RecordMetaDataHook hook = metaData -> {
metaData.removeIndex("stats$school");
metaData.addIndex("RestaurantReviewer", "stats$school", concat(field("name"), field("stats").nest(field("start_date"))));
metaData.getIndex("stats$school").setSubspaceKey("stats$school_2");
};
nestedWithAndSetup(hook);
RecordQuery query = RecordQuery.newBuilder().setRecordType("RestaurantReviewer").setFilter(Query.and(Query.field("name").equalsValue("Newt A. Robot"), Query.field("stats").matches(Query.field("start_date").greaterThan(100L)), Query.field("stats").matches(Query.field("start_date").lessThan(2000L)))).build();
// Index(stats$school ([Newt A. Robot, 100],[Newt A. Robot, 2000]))
RecordQueryPlan plan = planner.plan(query);
assertThat(plan, indexScan(allOf(indexName("stats$school"), bounds(hasTupleString("([Newt A. Robot, 100],[Newt A. Robot, 2000])")))));
assertEquals(1355996214, plan.planHash(PlanHashable.PlanHashKind.LEGACY));
assertEquals(669950614, plan.planHash(PlanHashable.PlanHashKind.FOR_CONTINUATION));
assertEquals(-1690206997, plan.planHash(PlanHashable.PlanHashKind.STRUCTURAL_WITHOUT_LITERALS));
assertEquals(Collections.singletonList(2L), fetchResultValues(plan, TestRecords4Proto.RestaurantReviewer.ID_FIELD_NUMBER, ctx -> openNestedRecordStore(ctx, hook), TestHelpers::assertDiscardedNone));
}
use of com.apple.foundationdb.record.TestHelpers in project fdb-record-layer by FoundationDB.
the class FDBNestedFieldQueryTest method nestedThenWithAndPartial.
/**
* Verify that matching part of a nested field only uses part of the index.
*/
@DualPlannerTest
public void nestedThenWithAndPartial() throws Exception {
final RecordMetaDataHook hook = metaData -> {
metaData.addIndex("RestaurantReviewer", "hometownEmail", concat(field("stats").nest(concatenateFields("hometown", "school_name", "start_date")), field("email")));
};
nestedWithAndSetup(hook);
RecordQuery query = RecordQuery.newBuilder().setRecordType("RestaurantReviewer").setFilter(Query.and(Query.field("stats").matches(Query.and(Query.field("hometown").equalsValue("Home Town"), Query.field("school_name").equalsValue("University of Learning"))), Query.field("email").equalsValue("pmp@example.com"))).build();
RecordQueryPlan plan = planner.plan(query);
assertThat(plan, filter(Query.field("email").equalsValue("pmp@example.com"), indexScan(allOf(indexName("hometownEmail"), bounds(hasTupleString("[[Home Town, University of Learning],[Home Town, University of Learning]]"))))));
if (planner instanceof RecordQueryPlanner) {
assertEquals(895882018, plan.planHash(PlanHashable.PlanHashKind.LEGACY));
assertEquals(146214617, plan.planHash(PlanHashable.PlanHashKind.FOR_CONTINUATION));
assertEquals(1382626015, plan.planHash(PlanHashable.PlanHashKind.STRUCTURAL_WITHOUT_LITERALS));
} else {
assertEquals(-1385621911, plan.planHash(PlanHashable.PlanHashKind.LEGACY));
assertEquals(945827751, plan.planHash(PlanHashable.PlanHashKind.FOR_CONTINUATION));
assertEquals(-2112728147, plan.planHash(PlanHashable.PlanHashKind.STRUCTURAL_WITHOUT_LITERALS));
}
assertEquals(Collections.singletonList(1L), fetchResultValues(plan, TestRecords4Proto.RestaurantReviewer.ID_FIELD_NUMBER, context -> openNestedRecordStore(context, hook), TestHelpers::assertDiscardedNone));
}
use of com.apple.foundationdb.record.TestHelpers in project fdb-record-layer by FoundationDB.
the class FDBNestedFieldQueryTest method nestedThenWithAnd.
/**
* Verify that AND conditions involving nested non-repeated fields still work when index has non-nested fields,
* no matter which way the nested conditions are expressed.
*/
@DualPlannerTest
public void nestedThenWithAnd() throws Exception {
final RecordMetaDataHook hook = metaData -> {
metaData.addIndex("RestaurantReviewer", "emailHometown", concat(field("email"), field("stats").nest(concatenateFields("hometown", "start_date"))));
};
nestedWithAndSetup(hook);
RecordQuery query = RecordQuery.newBuilder().setRecordType("RestaurantReviewer").setFilter(Query.and(Query.field("stats").matches(Query.and(Query.field("start_date").lessThanOrEquals(0L), Query.field("hometown").equalsValue("Home Town"))), Query.field("email").equalsValue("pmp@example.com"))).build();
RecordQueryPlan plan = planner.plan(query);
assertThat(plan, indexScan(allOf(indexName("emailHometown"), bounds(hasTupleString("([pmp@example.com, Home Town, null],[pmp@example.com, Home Town, 0]]")))));
assertEquals(-688450117, plan.planHash(PlanHashable.PlanHashKind.LEGACY));
assertEquals(-1159885451, plan.planHash(PlanHashable.PlanHashKind.FOR_CONTINUATION));
assertEquals(608425592, plan.planHash(PlanHashable.PlanHashKind.STRUCTURAL_WITHOUT_LITERALS));
assertEquals(Collections.singletonList(1L), fetchResultValues(plan, TestRecords4Proto.RestaurantReviewer.ID_FIELD_NUMBER, context -> openNestedRecordStore(context, hook), TestHelpers::assertDiscardedNone));
query = RecordQuery.newBuilder().setRecordType("RestaurantReviewer").setFilter(Query.and(Query.field("stats").matches(Query.field("start_date").lessThanOrEquals(0L)), Query.field("email").equalsValue("pmp@example.com"), Query.field("stats").matches(Query.field("hometown").equalsValue("Home Town")))).build();
assertEquals(plan, planner.plan(query));
}
use of com.apple.foundationdb.record.TestHelpers in project fdb-record-layer by FoundationDB.
the class FDBInQueryTest method testInQueryOrCompound.
/**
* Verify that a complex query involving IN, AND, and OR is planned using a union of scans and joins on a
* multi-field index, where the left subset has equality and the final field has an IN plus inequality on that same
* field.
*/
@DualPlannerTest
void testInQueryOrCompound() throws Exception {
RecordMetaDataHook hook = complexQuerySetupHook();
complexQuerySetup(hook);
RecordQuery query = RecordQuery.newBuilder().setRecordType("MySimpleRecord").setFilter(Query.and(Query.field("str_value_indexed").equalsValue("odd"), Query.field("num_value_2").equalsValue(0), Query.or(Query.field("num_value_3_indexed").in(Arrays.asList(1, 3)), Query.field("num_value_3_indexed").greaterThanOrEquals(4)))).build();
// Index(multi_index [EQUALS odd, EQUALS 0, EQUALS $__in_num_value_3_indexed__0]) WHERE __in_num_value_3_indexed__0 IN [1, 3] SORTED ∪[Field { 'num_value_3_indexed' None}, Field { 'rec_no' None}] Index(multi_index [[odd, 0, 4],[odd, 0]])
RecordQueryPlan plan = planner.plan(query);
if (planner instanceof RecordQueryPlanner) {
assertMatchesExactly(plan, unionPlan(inValuesJoinPlan(indexPlan().where(indexName("multi_index")).and(scanComparisons(range("[EQUALS odd, EQUALS 0, EQUALS $__in_num_value_3_indexed__0]")))).where(inValuesList(equalsObject(Arrays.asList(1, 3)))), indexPlan().where(indexName("multi_index")).and(scanComparisons(range("[[odd, 0, 4],[odd, 0]]")))));
assertEquals(468569345, plan.planHash(PlanHashable.PlanHashKind.LEGACY));
assertEquals(1312398381, plan.planHash(PlanHashable.PlanHashKind.FOR_CONTINUATION));
assertEquals(1327693258, plan.planHash(PlanHashable.PlanHashKind.STRUCTURAL_WITHOUT_LITERALS));
} else {
assertMatchesExactly(plan, fetchFromPartialRecordPlan(unionPlan(coveringIndexPlan().where(indexPlanOf(indexPlan().where(indexName("multi_index")))), inValuesJoinPlan(coveringIndexPlan().where(indexPlanOf(indexPlan().where(indexName("multi_index")).and(scanComparisons(equalities(exactly(equalsObject(new Comparisons.SimpleComparison(Comparisons.Type.EQUALS, "odd")), equalsObject(new Comparisons.SimpleComparison(Comparisons.Type.EQUALS, 0)), anyParameterComparison()))))))).where(inValuesList(equalsObject(Arrays.asList(1, 3))))).where(comparisonKey(concat(field("num_value_3_indexed"), primaryKey("MySimpleRecord"))))));
assertEquals(687944558, plan.planHash(PlanHashable.PlanHashKind.LEGACY));
assertEquals(-913554911, plan.planHash(PlanHashable.PlanHashKind.FOR_CONTINUATION));
assertEquals(-137232979, plan.planHash(PlanHashable.PlanHashKind.STRUCTURAL_WITHOUT_LITERALS));
}
assertEquals(3 + 4 + 4, querySimpleRecordStore(hook, plan, EvaluationContext::empty, record -> {
assertThat(record.getStrValueIndexed(), is("odd"));
assertThat(record.getNumValue2(), is(0));
assertThat(record.getNumValue3Indexed(), anyOf(is(1), is(3), greaterThanOrEqualTo(4)));
}, TestHelpers::assertDiscardedNone));
}
use of com.apple.foundationdb.record.TestHelpers in project fdb-record-layer by FoundationDB.
the class FDBSortQueryIndexSelectionTest method sortWithScannableFilterOnIndex.
/**
* Verify that if the sort matches an index that can satisfy a filter that the index is used.
*/
@ParameterizedTest
@MethodSource("hooks")
void sortWithScannableFilterOnIndex(RecordMetaDataHook hook, PlannableIndexTypes indexTypes) throws Exception {
setupSimpleRecordStore(hook, (i, builder) -> builder.setRecNo(i).setNumValue2(i % 2).setNumValue3Indexed(i % 3));
RecordQuery query = RecordQuery.newBuilder().setRecordType("MySimpleRecord").setFilter(Query.field("num_value_3_indexed").greaterThanOrEquals(2)).setSort(field("num_value_3_indexed")).build();
setupPlanner(indexTypes);
// Index(MySimpleRecord$num_value_3_indexed [[2],>)
RecordQueryPlan plan = planner.plan(query);
assertThat(plan, indexScan(allOf(indexName("MySimpleRecord$num_value_3_indexed"), bounds(hasTupleString("[[2],>")))));
assertEquals(1008857205, plan.planHash(PlanHashable.PlanHashKind.LEGACY));
assertEquals(-2059045225, plan.planHash(PlanHashable.PlanHashKind.FOR_CONTINUATION));
assertEquals(-1347749581, plan.planHash(PlanHashable.PlanHashKind.STRUCTURAL_WITHOUT_LITERALS));
AtomicInteger lastNumValue3 = new AtomicInteger(Integer.MIN_VALUE);
int returned = querySimpleRecordStore(hook, plan, EvaluationContext::empty, builder -> {
assertThat(builder.getNumValue3Indexed(), greaterThanOrEqualTo(2));
assertThat(builder.getNumValue3Indexed(), greaterThanOrEqualTo(lastNumValue3.get()));
lastNumValue3.set(builder.getNumValue3Indexed());
}, TestHelpers::assertDiscardedNone);
assertEquals(33, returned);
// reset planner
setupPlanner(null);
}
Aggregations