use of org.neo4j.values.AnyValue in project neo4j by neo4j.
the class RoutingResultFormat method parseRows.
private static Map<Role, List<SocketAddress>> parseRows(ListValue rows) {
Map<Role, List<SocketAddress>> endpoints = new HashMap<>();
for (AnyValue single : rows) {
MapValue row = (MapValue) single;
Role role = Role.valueOf(((TextValue) row.get("role")).stringValue());
List<SocketAddress> addresses = parseEndpoints((ListValue) row.get("addresses"));
endpoints.put(role, addresses);
}
Arrays.stream(Role.values()).forEach(r -> endpoints.putIfAbsent(r, Collections.emptyList()));
return endpoints;
}
use of org.neo4j.values.AnyValue in project neo4j by neo4j.
the class BoltConnectionIT method shouldHandleFailureDuringResultPublishing.
@Test
void shouldHandleFailureDuringResultPublishing() throws Throwable {
// Given
var machine = newStateMachineAfterAuth();
var pullAllCallbackCalled = new CountDownLatch(1);
var error = new AtomicReference<Neo4jError>();
// When something fails while publishing the result stream
machine.process(run(), nullResponseHandler());
machine.process(pullAll(), new BoltResponseHandler() {
@Override
public boolean onPullRecords(BoltResult result, long size) throws Throwable {
throw new RuntimeException("Ooopsies!");
}
@Override
public boolean onDiscardRecords(BoltResult result, long size) throws Throwable {
throw new RuntimeException("Not this one!");
}
@Override
public void onMetadata(String key, AnyValue value) {
}
@Override
public void markFailed(Neo4jError err) {
error.set(err);
pullAllCallbackCalled.countDown();
}
@Override
public void markIgnored() {
}
@Override
public void onFinish() {
}
});
// Then
assertTrue(pullAllCallbackCalled.await(30, TimeUnit.SECONDS));
var err = error.get();
assertThat(err.status()).isEqualTo(Status.General.UnknownError);
assertThat(err.message()).contains("Ooopsies!");
}
use of org.neo4j.values.AnyValue in project neo4j by neo4j.
the class PathValueBuilderTest method builder.
private static PathValueBuilder builder(AnyValue... values) {
DbAccess dbAccess = mock(DbAccess.class);
RelationshipScanCursor cursors = mock(RelationshipScanCursor.class);
Map<Long, RelationshipValue> relMap = new HashMap<>();
for (AnyValue value : values) {
if (value instanceof NodeValue) {
NodeValue nodeValue = (NodeValue) value;
when(dbAccess.nodeById(nodeValue.id())).thenReturn(nodeValue);
} else if (value instanceof RelationshipValue) {
RelationshipValue relationshipValue = (RelationshipValue) value;
relMap.put(relationshipValue.id(), relationshipValue);
} else {
throw new AssertionError("invalid input");
}
Mockito.doAnswer((Answer<Void>) invocationOnMock -> {
long id = invocationOnMock.getArgument(0);
RelationshipScanCursor cursor = invocationOnMock.getArgument(1);
RelationshipValue rel = relMap.get(id);
when(cursor.sourceNodeReference()).thenReturn(rel.startNode().id());
when(cursor.targetNodeReference()).thenReturn(rel.endNode().id());
return null;
}).when(dbAccess).singleRelationship(anyLong(), any(RelationshipScanCursor.class));
}
return new PathValueBuilder(dbAccess, cursors);
}
use of org.neo4j.values.AnyValue in project neo4j by neo4j.
the class PathValueBuilder method addMultipleUndirected.
/**
* Adds multiple undirected relationships to the path
*
* @param relationships the undirected relationships to add
* @param target the final target node of the path
*/
@CalledFromGeneratedCode
public void addMultipleUndirected(ListValue relationships, NodeValue target) {
if (relationships.isEmpty()) {
// nothing to add
return;
}
long previous = nodes.get(nodes.size() - 1).id();
RelationshipValue first = (RelationshipValue) relationships.head();
boolean correctDirection = startNode(first, dbAccess, cursor).id() == previous || endNode(first, dbAccess, cursor).id() == previous;
int i;
if (correctDirection) {
for (i = 0; i < relationships.size() - 1; i++) {
AnyValue value = relationships.value(i);
if (notNoValue(value)) {
// we know these relationships have already loaded start and end relationship
// so we should not use CypherFunctions::[start,end]Node to look them up
addUndirectedWhenRelationshipsAreFullyLoaded((RelationshipValue) value);
}
}
} else {
for (i = relationships.size() - 1; i > 0; i--) {
AnyValue value = relationships.value(i);
if (notNoValue(value)) {
// we know these relationships have already loaded start and end relationship
// so we should not use CypherFunctions::[start,end]Node to look them up
addUndirectedWhenRelationshipsAreFullyLoaded((RelationshipValue) relationships.value(i));
}
}
}
AnyValue last = relationships.value(i);
if (notNoValue(last)) {
rels.add((RelationshipValue) last);
nodes.add(target);
}
}
use of org.neo4j.values.AnyValue in project neo4j by neo4j.
the class PathValueBuilder method addMultipleUndirected.
/**
* Adds multiple undirected relationships to the path
*
* @param relationships the undirected relationships to add
*/
@CalledFromGeneratedCode
public void addMultipleUndirected(ListValue relationships) {
if (relationships.isEmpty()) {
// nothing to add
return;
}
long previous = nodes.get(nodes.size() - 1).id();
RelationshipValue first = (RelationshipValue) relationships.head();
boolean correctDirection = startNode(first, dbAccess, cursor).id() == previous || endNode(first, dbAccess, cursor).id() == previous;
if (correctDirection) {
for (AnyValue value : relationships) {
if (notNoValue(value)) {
addUndirectedWhenRelationshipsAreFullyLoaded((RelationshipValue) value);
}
}
} else {
ListValue reversed = relationships.reverse();
for (AnyValue rel : reversed) {
if (notNoValue(rel)) {
addUndirectedWhenRelationshipsAreFullyLoaded((RelationshipValue) rel);
}
}
}
}
Aggregations