use of org.neo4j.internal.helpers.collection.Pair in project neo4j by neo4j.
the class MultipleIndexPopulator method newPopulatingUpdater.
@VisibleForTesting
MultipleIndexUpdater newPopulatingUpdater(NodePropertyAccessor accessor, CursorContext cursorContext) {
Map<SchemaDescriptor, Pair<IndexPopulation, IndexUpdater>> updaters = new HashMap<>();
forEachPopulation(population -> {
IndexUpdater updater = population.populator.newPopulatingUpdater(accessor, cursorContext);
updaters.put(population.schema(), Pair.of(population, updater));
}, cursorContext);
return new MultipleIndexUpdater(this, updaters, logProvider, cursorContext);
}
use of org.neo4j.internal.helpers.collection.Pair in project neo4j by neo4j.
the class IndexUpdaterMap method close.
@Override
public void close() throws UnderlyingStorageException {
Set<Pair<IndexDescriptor, UnderlyingStorageException>> exceptions = null;
for (Map.Entry<IndexDescriptor, IndexUpdater> updaterEntry : updaterMap.entrySet()) {
IndexUpdater updater = updaterEntry.getValue();
try {
updater.close();
} catch (UncheckedIOException | IndexEntryConflictException e) {
if (null == exceptions) {
exceptions = new HashSet<>();
}
exceptions.add(Pair.of(updaterEntry.getKey(), new UnderlyingStorageException(e)));
}
}
clear();
if (null != exceptions) {
throw new MultipleUnderlyingStorageExceptions(exceptions);
}
}
use of org.neo4j.internal.helpers.collection.Pair in project neo4j by neo4j.
the class TransactionLogsRecoveryTest method writeSomeDataWithVersion.
private void writeSomeDataWithVersion(Path file, Visitor<Pair<LogEntryWriter, Consumer<LogPositionMarker>>, IOException> visitor, KernelVersion version) throws IOException {
try (LogVersionedStoreChannel versionedStoreChannel = new PhysicalLogVersionedStoreChannel(fileSystem.write(file), logVersion, CURRENT_LOG_FORMAT_VERSION, file, EMPTY_ACCESSOR);
PositionAwarePhysicalFlushableChecksumChannel writableLogChannel = new PositionAwarePhysicalFlushableChecksumChannel(versionedStoreChannel, new HeapScopedBuffer(1, KibiByte, INSTANCE))) {
writeLogHeader(writableLogChannel, new LogHeader(logVersion, 2L, StoreId.UNKNOWN));
writableLogChannel.beginChecksum();
Consumer<LogPositionMarker> consumer = marker -> {
try {
writableLogChannel.getCurrentPosition(marker);
} catch (IOException e) {
throw new RuntimeException(e);
}
};
LogEntryWriter first = new LogEntryWriter(writableLogChannel, version);
visitor.visit(Pair.of(first, consumer));
}
}
use of org.neo4j.internal.helpers.collection.Pair in project neo4j by neo4j.
the class CompositeIndexAccessorCompatibility method mustThrowOnIllegalCompositeQueriesAndMustNotThrowOnLegalQueries.
/* Composite query validity */
/**
* This test verify behavior for all different index patterns on a two column composite index.
* A composite query need to have decreasing precision among the queries.
* This means a range or exists query can only be followed by and exists query.
* Prefix query is also included under "range".
* Contains or suffix queries are not allowed in a composite query at all.
*
* Those are all the different combinations:
* x = exact
* < = range (also include stringPrefix)
* - = exists
* ! = stringContains or stringSuffix
* ? = any predicate
* Index patterns
* x x ok
* x < ok
* x - ok
* < x not ok
* < < not ok
* < - ok
* - x not ok
* - < not ok
* - - ok
* ! ? not ok
*/
@Test
public void mustThrowOnIllegalCompositeQueriesAndMustNotThrowOnLegalQueries() throws Exception {
Assume.assumeTrue("Assume support for granular composite queries", testSuite.supportsGranularCompositeQueries());
// given
Value someValue = Values.of(true);
TextValue someString = stringValue("");
PropertyIndexQuery firstExact = exact(100, someValue);
PropertyIndexQuery firstRange = range(100, someValue, true, someValue, true);
PropertyIndexQuery firstPrefix = stringPrefix(100, someString);
PropertyIndexQuery firstExist = exists(100);
PropertyIndexQuery firstSuffix = stringSuffix(100, someString);
PropertyIndexQuery firstContains = stringContains(100, someString);
PropertyIndexQuery secondExact = exact(200, someValue);
PropertyIndexQuery secondRange = range(200, someValue, true, someValue, true);
PropertyIndexQuery secondExist = exists(200);
PropertyIndexQuery secondPrefix = stringPrefix(100, someString);
PropertyIndexQuery secondSuffix = stringSuffix(100, someString);
PropertyIndexQuery secondContains = stringContains(100, someString);
List<Pair<PropertyIndexQuery[], Boolean>> queries = Arrays.asList(of(new PropertyIndexQuery[] { firstExact, secondExact }, true), of(new PropertyIndexQuery[] { firstExact, secondRange }, true), of(new PropertyIndexQuery[] { firstExact, secondExist }, true), of(new PropertyIndexQuery[] { firstExact, secondPrefix }, true), of(new PropertyIndexQuery[] { firstExact, secondSuffix }, false), of(new PropertyIndexQuery[] { firstExact, secondContains }, false), of(new PropertyIndexQuery[] { firstRange, secondExact }, false), of(new PropertyIndexQuery[] { firstRange, secondRange }, false), of(new PropertyIndexQuery[] { firstRange, secondExist }, true), of(new PropertyIndexQuery[] { firstRange, secondPrefix }, false), of(new PropertyIndexQuery[] { firstRange, secondSuffix }, false), of(new PropertyIndexQuery[] { firstRange, secondContains }, false), of(new PropertyIndexQuery[] { firstPrefix, secondExact }, false), of(new PropertyIndexQuery[] { firstPrefix, secondRange }, false), of(new PropertyIndexQuery[] { firstPrefix, secondExist }, true), of(new PropertyIndexQuery[] { firstPrefix, secondPrefix }, false), of(new PropertyIndexQuery[] { firstPrefix, secondSuffix }, false), of(new PropertyIndexQuery[] { firstPrefix, secondContains }, false), of(new PropertyIndexQuery[] { firstExist, secondExact }, false), of(new PropertyIndexQuery[] { firstExist, secondRange }, false), of(new PropertyIndexQuery[] { firstExist, secondExist }, true), of(new PropertyIndexQuery[] { firstExist, secondPrefix }, false), of(new PropertyIndexQuery[] { firstExist, secondSuffix }, false), of(new PropertyIndexQuery[] { firstExist, secondContains }, false), of(new PropertyIndexQuery[] { firstSuffix, secondExact }, false), of(new PropertyIndexQuery[] { firstSuffix, secondRange }, false), of(new PropertyIndexQuery[] { firstSuffix, secondExist }, false), of(new PropertyIndexQuery[] { firstSuffix, secondPrefix }, false), of(new PropertyIndexQuery[] { firstSuffix, secondSuffix }, false), of(new PropertyIndexQuery[] { firstSuffix, secondContains }, false), of(new PropertyIndexQuery[] { firstContains, secondExact }, false), of(new PropertyIndexQuery[] { firstContains, secondRange }, false), of(new PropertyIndexQuery[] { firstContains, secondExist }, false), of(new PropertyIndexQuery[] { firstContains, secondPrefix }, false), of(new PropertyIndexQuery[] { firstContains, secondSuffix }, false), of(new PropertyIndexQuery[] { firstContains, secondContains }, false));
SimpleEntityValueClient client = new SimpleEntityValueClient();
try (ValueIndexReader reader = accessor.newValueReader()) {
for (Pair<PropertyIndexQuery[], Boolean> pair : queries) {
PropertyIndexQuery[] theQuery = pair.first();
Boolean legal = pair.other();
if (legal) {
// when
reader.query(NULL_CONTEXT, client, unconstrained(), theQuery);
// then should not throw
} else {
try {
// when
reader.query(NULL_CONTEXT, client, unconstrained(), theQuery);
fail("Expected index reader to throw for illegal composite query. Query was, " + Arrays.toString(theQuery));
} catch (IllegalArgumentException e) {
// then
assertThat(e.getMessage()).contains("Tried to query index with illegal composite query.");
}
}
}
}
}
use of org.neo4j.internal.helpers.collection.Pair in project neo4j by neo4j.
the class DurationValueTest method shouldGetSameInstantWhenAddingDurationBetweenToInstant.
@Test
void shouldGetSameInstantWhenAddingDurationBetweenToInstant() {
// given
@SuppressWarnings("unchecked") Pair<Temporal, Temporal>[] input = new Pair[] { pair(datetime(date(2017, 3, 20), localTime(13, 37, 0, 0), ZoneId.of("Europe/Stockholm")), datetime(date(2017, 3, 26), localTime(19, 40, 0, 0), ZoneId.of("Europe/Stockholm"))), pair(datetime(date(2017, 3, 20), localTime(13, 37, 0, 0), ZoneId.of("Europe/Stockholm")), datetime(date(2017, 3, 26), localTime(11, 40, 0, 0), ZoneId.of("Europe/Stockholm"))), pair(datetime(date(2017, 10, 20), localTime(13, 37, 0, 0), ZoneId.of("Europe/Stockholm")), datetime(date(2017, 10, 29), localTime(19, 40, 0, 0), ZoneId.of("Europe/Stockholm"))), pair(datetime(date(2017, 10, 20), localTime(13, 37, 0, 0), ZoneId.of("Europe/Stockholm")), datetime(date(2017, 10, 29), localTime(11, 40, 0, 0), ZoneId.of("Europe/Stockholm"))) };
for (Pair<Temporal, Temporal> pair : input) {
Temporal a = pair.first(), b = pair.other();
// when
DurationValue diffAB = durationBetween(a, b);
DurationValue diffBA = durationBetween(b, a);
DurationValue diffABs = between(SECONDS, a, b);
DurationValue diffBAs = between(SECONDS, b, a);
// then
assertEquals(b, a.plus(diffAB), diffAB.prettyPrint());
assertEquals(a, b.plus(diffBA), diffBA.prettyPrint());
assertEquals(b, a.plus(diffABs), diffABs.prettyPrint());
assertEquals(a, b.plus(diffBAs), diffBAs.prettyPrint());
}
}
Aggregations