use of org.neo4j.internal.schema.IndexValueCapability in project neo4j by neo4j.
the class EntityValueIndexCursorTestBase method shouldProvideValuesForAllTypes.
@Test
void shouldProvideValuesForAllTypes() throws Exception {
// given
assumeTrue(indexParams.indexProvidesAllValues());
int prop = token.propertyKey(EVER_PROP_NAME);
IndexReadSession index = read.indexReadSession(schemaRead.indexGetForName(WHAT_EVER_INDEX_NAME));
IndexValueCapability valueCapability = index.reference().getCapability().valueCapability(ValueCategory.UNKNOWN);
assertEquals(IndexValueCapability.YES, valueCapability);
try (var cursor = entityParams.allocateEntityValueIndexCursor(tx, cursors)) {
MutableLongSet uniqueIds = new LongHashSet();
// when
entityParams.entityIndexSeek(tx, index, cursor, unorderedValues(), PropertyIndexQuery.exists(prop));
// then
assertFoundEntitiesAndValue(cursor, uniqueIds, valueCapability, true, entitiesOfAllPropertyTypes);
}
}
use of org.neo4j.internal.schema.IndexValueCapability in project neo4j by neo4j.
the class EntityValueIndexCursorTestBase method shouldPerformNumericRangeSearch.
@Test
void shouldPerformNumericRangeSearch() throws Exception {
// given
boolean needsValues = indexParams.indexProvidesNumericValues();
IndexQueryConstraints constraints = unordered(needsValues);
int prop = token.propertyKey(PROP_NAME);
IndexReadSession index = read.indexReadSession(schemaRead.indexGetForName(PROP_INDEX_NAME));
IndexValueCapability numberCapability = index.reference().getCapability().valueCapability(ValueCategory.NUMBER);
try (var cursor = entityParams.allocateEntityValueIndexCursor(tx, cursors)) {
MutableLongSet uniqueIds = new LongHashSet();
// when
entityParams.entityIndexSeek(tx, index, cursor, constraints, PropertyIndexQuery.range(prop, 5, true, 12, true));
// then
assertFoundEntitiesAndValue(cursor, uniqueIds, numberCapability, needsValues, num5, num6, num12a, num12b);
// when
entityParams.entityIndexSeek(tx, index, cursor, constraints, PropertyIndexQuery.range(prop, 5, true, 12, false));
// then
assertFoundEntitiesAndValue(cursor, uniqueIds, numberCapability, needsValues, num5, num6);
// when
entityParams.entityIndexSeek(tx, index, cursor, constraints, PropertyIndexQuery.range(prop, 5, false, 12, true));
// then
assertFoundEntitiesAndValue(cursor, uniqueIds, numberCapability, needsValues, num6, num12a, num12b);
// when
entityParams.entityIndexSeek(tx, index, cursor, constraints, PropertyIndexQuery.range(prop, 5, false, 12, false));
// then
assertFoundEntitiesAndValue(cursor, uniqueIds, numberCapability, needsValues, num6);
}
}
use of org.neo4j.internal.schema.IndexValueCapability in project neo4j by neo4j.
the class EntityValueIndexCursorTestBase method shouldPerformStringSuffixSearch.
@Test
void shouldPerformStringSuffixSearch() throws Exception {
// given
boolean needsValues = indexParams.indexProvidesStringValues();
int prop = token.propertyKey(PROP_NAME);
IndexReadSession index = read.indexReadSession(schemaRead.indexGetForName(PROP_INDEX_NAME));
IndexValueCapability stringCapability = index.reference().getCapability().valueCapability(ValueCategory.TEXT);
try (var cursor = entityParams.allocateEntityValueIndexCursor(tx, cursors)) {
MutableLongSet uniqueIds = new LongHashSet();
// when
entityParams.entityIndexSeek(tx, index, cursor, unordered(needsValues), PropertyIndexQuery.stringSuffix(prop, stringValue("e")));
// then
assertThat(cursor.numberOfProperties()).isEqualTo(1);
assertFoundEntitiesAndValue(cursor, uniqueIds, stringCapability, needsValues, strOne, strThree1, strThree2, strThree3);
}
}
use of org.neo4j.internal.schema.IndexValueCapability in project neo4j by neo4j.
the class NativeIndexAccessorTests method getValues.
@Test
void getValues() throws IndexEntryConflictException, IndexNotApplicableKernelException {
// given
int nUpdates = 10000;
Iterator<ValueIndexEntryUpdate<IndexDescriptor>> randomUpdateGenerator = valueCreatorUtil.randomUpdateGenerator(random);
// noinspection unchecked
ValueIndexEntryUpdate<IndexDescriptor>[] someUpdates = new ValueIndexEntryUpdate[nUpdates];
for (int i = 0; i < nUpdates; i++) {
someUpdates[i] = randomUpdateGenerator.next();
}
processAll(someUpdates);
Value[] allValues = ValueCreatorUtil.extractValuesFromUpdates(someUpdates);
// Pick one out of all added values and do a range query for the value group of that value
Value value = random.among(allValues);
ValueGroup valueGroup = value.valueGroup();
IndexValueCapability valueCapability = indexCapability().valueCapability(valueGroup.category());
if (!valueCapability.equals(IndexValueCapability.YES)) {
// We don't need to do this test
return;
}
PropertyIndexQuery.RangePredicate<?> supportedQuery;
List<Value> expectedValues;
if (Values.isGeometryValue(value)) {
// Unless it's a point value in which case we query for the specific coordinate reference system instead
CoordinateReferenceSystem crs = ((PointValue) value).getCoordinateReferenceSystem();
supportedQuery = PropertyIndexQuery.range(0, crs);
expectedValues = Arrays.stream(allValues).filter(v -> v.valueGroup() == ValueGroup.GEOMETRY).filter(v -> ((PointValue) v).getCoordinateReferenceSystem() == crs).collect(Collectors.toList());
} else {
supportedQuery = PropertyIndexQuery.range(0, valueGroup);
expectedValues = Arrays.stream(allValues).filter(v -> v.valueGroup() == valueGroup).collect(Collectors.toList());
}
// when
try (var reader = accessor.newValueReader()) {
SimpleEntityValueClient client = new SimpleEntityValueClient();
reader.query(NULL_CONTEXT, client, unorderedValues(), supportedQuery);
// then
while (client.next()) {
Value foundValue = client.values[0];
assertTrue(expectedValues.remove(foundValue), "found value that was not expected " + foundValue);
}
assertThat(expectedValues.size()).as("did not find all expected values").isEqualTo(0);
}
}
Aggregations