blob: 88a9088bf22f6ce972b2996261b3252e325f376b [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with this
* work for additional information regarding copyright ownership. The ASF
* licenses this file to You under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*/
package org.apache.hugegraph.api;
import static org.apache.hugegraph.structure.graph.UpdateStrategy.INTERSECTION;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import org.apache.hugegraph.driver.SchemaManager;
import org.apache.hugegraph.exception.ServerException;
import org.apache.hugegraph.structure.GraphElement;
import org.apache.hugegraph.structure.graph.BatchEdgeRequest;
import org.apache.hugegraph.structure.graph.BatchVertexRequest;
import org.apache.hugegraph.structure.graph.Edge;
import org.apache.hugegraph.structure.graph.UpdateStrategy;
import org.apache.hugegraph.structure.graph.Vertex;
import org.apache.hugegraph.structure.schema.VertexLabel;
import org.apache.hugegraph.testutil.Assert;
import org.apache.hugegraph.testutil.Whitebox;
import org.junit.After;
import org.junit.BeforeClass;
import org.junit.Test;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
public class BatchUpdateElementApiTest extends BaseApiTest {
private static final int BATCH_SIZE = 5;
@BeforeClass
public static void prepareSchema() {
SchemaManager schema = schema();
schema.propertyKey("name").asText().ifNotExist().create();
schema.propertyKey("price").asInt().ifNotExist().create();
schema.propertyKey("date").asDate().ifNotExist().create();
schema.propertyKey("set").asText().valueSet().ifNotExist().create();
schema.propertyKey("list").asText().valueList().ifNotExist().create();
schema.vertexLabel("object")
.properties("name", "price", "date", "set", "list")
.primaryKeys("name")
.nullableKeys("price", "date", "set", "list")
.ifNotExist()
.create();
schema.edgeLabel("updates")
.sourceLabel("object")
.targetLabel("object")
.properties("name", "price", "date", "set", "list")
.nullableKeys("name", "price", "date", "set", "list")
.ifNotExist()
.create();
}
@Override
@After
public void teardown() {
vertexAPI.list(-1).results().forEach(v -> vertexAPI.delete(v.id()));
edgeAPI.list(-1).results().forEach(e -> edgeAPI.delete(e.id()));
}
/* Vertex Test */
@Test
public void testVertexBatchUpdateStrategySum() {
BatchVertexRequest req = batchVertexRequest("price", 1, -1,
UpdateStrategy.SUM);
List<Vertex> vertices = vertexAPI.update(req);
assertBatchResponse(vertices, "price", 0);
req = batchVertexRequest("price", 2, 3, UpdateStrategy.SUM);
vertices = vertexAPI.update(req);
assertBatchResponse(vertices, "price", 5);
}
@Test
public void testVertexBatchUpdateStrategyBigger() {
// TODO: Add date comparison after fixing the date serialization bug
BatchVertexRequest req = batchVertexRequest("price", -3, 1,
UpdateStrategy.BIGGER);
List<Vertex> vertices = vertexAPI.update(req);
assertBatchResponse(vertices, "price", 1);
req = batchVertexRequest("price", 7, 3, UpdateStrategy.BIGGER);
vertices = vertexAPI.update(req);
assertBatchResponse(vertices, "price", 7);
}
@Test
public void testVertexBatchUpdateStrategySmaller() {
BatchVertexRequest req = batchVertexRequest("price", -3, 1,
UpdateStrategy.SMALLER);
List<Vertex> vertices = vertexAPI.update(req);
assertBatchResponse(vertices, "price", -3);
req = batchVertexRequest("price", 7, 3, UpdateStrategy.SMALLER);
vertices = vertexAPI.update(req);
assertBatchResponse(vertices, "price", 3);
}
@Test
public void testVertexBatchUpdateStrategyUnion() {
BatchVertexRequest req = batchVertexRequest("set", "old", "new",
UpdateStrategy.UNION);
List<Vertex> vertices = vertexAPI.update(req);
assertBatchResponse(vertices, "set", "new", "old");
req = batchVertexRequest("set", "old", "old", UpdateStrategy.UNION);
vertices = vertexAPI.update(req);
assertBatchResponse(vertices, "set", "old");
}
@Test
public void testVertexBatchUpdateStrategyIntersection() {
BatchVertexRequest req = batchVertexRequest("set", "old", "new",
INTERSECTION);
List<Vertex> vertices = vertexAPI.update(req);
assertBatchResponse(vertices, "set");
req = batchVertexRequest("set", "old", "old", INTERSECTION);
vertices = vertexAPI.update(req);
assertBatchResponse(vertices, "set", "old");
}
@Test
public void testVertexBatchUpdateStrategyAppend() {
BatchVertexRequest req = batchVertexRequest("list", "old", "old",
UpdateStrategy.APPEND);
List<Vertex> vertices = vertexAPI.update(req);
assertBatchResponse(vertices, "list", "old", "old");
req = batchVertexRequest("list", "old", "new", UpdateStrategy.APPEND);
vertices = vertexAPI.update(req);
assertBatchResponse(vertices, "list", "old", "new");
}
@Test
public void testVertexBatchUpdateStrategyEliminate() {
BatchVertexRequest req = batchVertexRequest("list", "old", "old",
UpdateStrategy.ELIMINATE);
List<Vertex> vertices = vertexAPI.update(req);
assertBatchResponse(vertices, "list");
req = batchVertexRequest("list", "old", "x", UpdateStrategy.ELIMINATE);
vertices = vertexAPI.update(req);
assertBatchResponse(vertices, "list", "old");
}
@Test
public void testVertexBatchUpdateStrategyOverride() {
BatchVertexRequest req = batchVertexRequest("price", -1, 1,
UpdateStrategy.OVERRIDE);
assertBatchResponse(vertexAPI.update(req), "price", 1);
// Construct a specialized test case
graph().addVertices(this.createNVertexBatch("object", -1, 2));
List<String> list = ImmutableList.of("newStr1", "newStr2");
Vertex v1 = new Vertex("object");
v1.property("name", "tom");
v1.property("price", 1);
v1.property("list", list);
Vertex v2 = new Vertex("object");
v2.property("name", "tom");
Map<String, UpdateStrategy> strategies;
strategies = ImmutableMap.of("price", UpdateStrategy.OVERRIDE,
"list", UpdateStrategy.OVERRIDE);
req = BatchVertexRequest.createBuilder()
.vertices(ImmutableList.of(v1, v2))
.updatingStrategies(strategies)
.createIfNotExist(true)
.build();
List<Vertex> vertices = vertexAPI.update(req);
Assert.assertEquals(1, vertices.size());
Map<String, Object> expectProperties = ImmutableMap.of("name", "tom",
"price", 1,
"list", list);
Assert.assertEquals(vertices.get(0).properties(), expectProperties);
}
@Test
public void testVertexBatchUpdateWithNullValues() {
BatchVertexRequest req = batchVertexRequest("price", 1, null,
UpdateStrategy.OVERRIDE);
List<Vertex> vertices = vertexAPI.update(req);
assertBatchResponse(vertices, "price", 1);
}
@Test
public void testVertexBatchUpdateWithInvalidArgs() {
BatchVertexRequest req1 = batchVertexRequest("set", "old", "old",
UpdateStrategy.UNION);
Assert.assertThrows(ServerException.class, () -> {
List<Vertex> vertices = Whitebox.getInternalState(req1, "vertices");
vertices.set(1, null);
Whitebox.setInternalState(req1, "vertices", vertices);
vertexAPI.update(req1);
}, e -> {
Assert.assertContains("The batch body can't contain null record",
e.toString());
});
BatchVertexRequest req2 = batchVertexRequest("list", "old", "old",
UpdateStrategy.ELIMINATE);
Assert.assertThrows(ServerException.class, () -> {
Whitebox.setInternalState(req2, "vertices", null);
vertexAPI.update(req2);
}, e -> {
String expect = "Parameter 'vertices' can't be null";
Assert.assertContains(expect, e.getMessage());
});
BatchVertexRequest req3 = batchVertexRequest("list", "old", "old",
UpdateStrategy.ELIMINATE);
Assert.assertThrows(ServerException.class, () -> {
Whitebox.setInternalState(req3, "vertices", ImmutableList.of());
vertexAPI.update(req3);
}, e -> {
String expect = "The number of vertices can't be 0";
Assert.assertContains(expect, e.getMessage());
});
BatchVertexRequest req4 = batchVertexRequest("list", "old", "old",
UpdateStrategy.ELIMINATE);
Assert.assertThrows(ServerException.class, () -> {
Whitebox.setInternalState(req4, "createIfNotExist", false);
vertexAPI.update(req4);
}, e -> {
String expect = "Parameter 'create_if_not_exist' " +
"dose not support false now";
Assert.assertContains(expect, e.getMessage());
});
BatchVertexRequest req5 = batchVertexRequest("list", "old", "old",
UpdateStrategy.ELIMINATE);
Assert.assertThrows(ServerException.class, () -> {
Whitebox.setInternalState(req5, "updateStrategies", null);
vertexAPI.update(req5);
}, e -> {
String expect = "Parameter 'update_strategies' can't be empty";
Assert.assertContains(expect, e.getMessage());
});
BatchVertexRequest req6 = batchVertexRequest("list", "old", "old",
UpdateStrategy.ELIMINATE);
Assert.assertThrows(ServerException.class, () -> {
Whitebox.setInternalState(req6, "updateStrategies",
ImmutableMap.of());
vertexAPI.update(req6);
}, e -> {
String expect = "Parameter 'update_strategies' can't be empty";
Assert.assertContains(expect, e.getMessage());
});
}
@Test
public void testVertexInvalidUpdateStrategy() {
BatchVertexRequest req1 = batchVertexRequest("name", "old", "new",
UpdateStrategy.SUM);
Assert.assertThrows(ServerException.class, () -> {
vertexAPI.update(req1);
}, e -> {
String expect = "Property type must be Number for strategy SUM, " +
"but got type String, String";
Assert.assertContains(expect, e.getMessage());
});
BatchVertexRequest req2 = batchVertexRequest("name", "old", "new",
UpdateStrategy.BIGGER);
Assert.assertThrows(ServerException.class, () -> {
vertexAPI.update(req2);
}, e -> {
String expect = "Property type must be Date or Number " +
"for strategy BIGGER, but got type String, String";
Assert.assertContains(expect, e.getMessage());
});
BatchVertexRequest req3 = batchVertexRequest("name", "old", "new",
UpdateStrategy.SMALLER);
Assert.assertThrows(ServerException.class, () -> {
vertexAPI.update(req3);
}, e -> {
String expect = "Property type must be Date or Number " +
"for strategy SMALLER, but got type String, String";
Assert.assertContains(expect, e.getMessage());
});
BatchVertexRequest req4 = batchVertexRequest("price", 1, -1,
UpdateStrategy.UNION);
Assert.assertThrows(ServerException.class, () -> {
vertexAPI.update(req4);
}, e -> {
String expect = "Property type must be Set or List " +
"for strategy UNION, but got type Integer, Integer";
Assert.assertContains(expect, e.getMessage());
});
BatchVertexRequest req5 = batchVertexRequest("date", "old", "new",
INTERSECTION);
Assert.assertThrows(ServerException.class, () -> {
vertexAPI.update(req5);
}, e -> {
String expect = "Property type must be Set or List for " +
"strategy INTERSECTION, but got type Date, Long";
Assert.assertContains(expect, e.getMessage());
});
BatchVertexRequest req6 = batchVertexRequest("price", 1, -1,
UpdateStrategy.APPEND);
Assert.assertThrows(ServerException.class, () -> {
vertexAPI.update(req6);
}, e -> {
String expect = "Property type must be Set or List for " +
"strategy APPEND, but got type Integer, Integer";
Assert.assertContains(expect, e.getMessage());
});
BatchVertexRequest req7 = batchVertexRequest("name", "old", "new",
UpdateStrategy.ELIMINATE);
Assert.assertThrows(ServerException.class, () -> {
vertexAPI.update(req7);
}, e -> {
String expect = "Property type must be Set or List for " +
"strategy ELIMINATE, but got type String, String";
Assert.assertContains(expect, e.getMessage());
});
}
/* Edge Test */
@Test
public void testEdgeBatchUpdateStrategySum() {
BatchEdgeRequest req = batchEdgeRequest("price", -1, 1,
UpdateStrategy.SUM);
List<Edge> edges = edgeAPI.update(req);
assertBatchResponse(edges, "price", 0);
req = batchEdgeRequest("price", 2, 3, UpdateStrategy.SUM);
edges = edgeAPI.update(req);
assertBatchResponse(edges, "price", 5);
}
@Test
public void testEdgeBatchUpdateStrategyBigger() {
// TODO: Add date comparison after fixing the date serialization bug
BatchEdgeRequest req = batchEdgeRequest("price", -3, 1,
UpdateStrategy.BIGGER);
List<Edge> edges = edgeAPI.update(req);
assertBatchResponse(edges, "price", 1);
req = batchEdgeRequest("price", 7, 3, UpdateStrategy.BIGGER);
edges = edgeAPI.update(req);
assertBatchResponse(edges, "price", 7);
}
@Test
public void testEdgeBatchUpdateStrategySmaller() {
BatchEdgeRequest req = batchEdgeRequest("price", -3, 1,
UpdateStrategy.SMALLER);
List<Edge> edges = edgeAPI.update(req);
assertBatchResponse(edges, "price", -3);
req = batchEdgeRequest("price", 7, 3, UpdateStrategy.SMALLER);
edges = edgeAPI.update(req);
assertBatchResponse(edges, "price", 3);
}
@Test
public void testEdgeBatchUpdateStrategyUnion() {
BatchEdgeRequest req = batchEdgeRequest("set", "old", "new",
UpdateStrategy.UNION);
List<Edge> edges = edgeAPI.update(req);
assertBatchResponse(edges, "set", "new", "old");
req = batchEdgeRequest("set", "old", "old", UpdateStrategy.UNION);
edges = edgeAPI.update(req);
assertBatchResponse(edges, "set", "old");
}
@Test
public void testEdgeBatchUpdateStrategyIntersection() {
BatchEdgeRequest req = batchEdgeRequest("set", "old", "new",
INTERSECTION);
List<Edge> edges = edgeAPI.update(req);
assertBatchResponse(edges, "set");
req = batchEdgeRequest("set", "old", "old", INTERSECTION);
edges = edgeAPI.update(req);
assertBatchResponse(edges, "set", "old");
}
@Test
public void testEdgeBatchUpdateStrategyAppend() {
BatchEdgeRequest req = batchEdgeRequest("list", "old", "old",
UpdateStrategy.APPEND);
List<Edge> edges = edgeAPI.update(req);
assertBatchResponse(edges, "list", "old", "old");
req = batchEdgeRequest("list", "old", "new", UpdateStrategy.APPEND);
edges = edgeAPI.update(req);
assertBatchResponse(edges, "list", "old", "new");
}
@Test
public void testEdgeBatchUpdateStrategyEliminate() {
BatchEdgeRequest req = batchEdgeRequest("list", "old", "old",
UpdateStrategy.ELIMINATE);
List<Edge> edges = edgeAPI.update(req);
assertBatchResponse(edges, "list");
req = batchEdgeRequest("list", "old", "new", UpdateStrategy.ELIMINATE);
edges = edgeAPI.update(req);
assertBatchResponse(edges, "list", "old");
}
@Test
public void testEdgeBatchUpdateStrategyOverride() {
BatchEdgeRequest req = batchEdgeRequest("price", -1, 1,
UpdateStrategy.OVERRIDE);
assertBatchResponse(edgeAPI.update(req), "price", 1);
// Construct a specialized test case
graph().addEdges(this.createNEdgesBatch("object", "updates", -1, 2));
List<String> list = ImmutableList.of("newStr1", "newStr2");
String vid = "1:a";
Edge e1 = new Edge("updates");
e1.sourceLabel("object");
e1.targetLabel("object");
e1.sourceId(vid);
e1.targetId(vid);
e1.property("name", "tom");
e1.property("price", 1);
e1.property("list", list);
Edge e2 = new Edge("updates");
e2.sourceLabel("object");
e2.targetLabel("object");
e2.sourceId(vid);
e2.targetId(vid);
e2.property("name", "tom");
Map<String, UpdateStrategy> strategies;
strategies = ImmutableMap.of("price", UpdateStrategy.OVERRIDE,
"list", UpdateStrategy.OVERRIDE);
req = BatchEdgeRequest.createBuilder()
.edges(ImmutableList.of(e1, e2))
.updatingStrategies(strategies)
.checkVertex(false)
.createIfNotExist(true)
.build();
List<Edge> edges = edgeAPI.update(req);
Assert.assertEquals(1, edges.size());
Map<String, Object> expectProperties = ImmutableMap.of("name", "tom",
"price", 1,
"list", list);
Assert.assertEquals(edges.get(0).properties(), expectProperties);
}
@Test
public void testEdgeBatchUpdateWithNullValues() {
BatchEdgeRequest req = batchEdgeRequest("price", 1, null,
UpdateStrategy.OVERRIDE);
List<Edge> edges = edgeAPI.update(req);
assertBatchResponse(edges, "price", 1);
}
@Test
public void testEdgeBatchUpdateWithInvalidArgs() {
BatchEdgeRequest req1 = batchEdgeRequest("list", "old", "old",
UpdateStrategy.ELIMINATE);
Assert.assertThrows(ServerException.class, () -> {
List<Edge> edges = Whitebox.getInternalState(req1, "edges");
edges.set(1, null);
Whitebox.setInternalState(req1, "edges", edges);
edgeAPI.update(req1);
}, e -> {
String expect = "The batch body can't contain null record";
Assert.assertContains(expect, e.getMessage());
});
BatchEdgeRequest req2 = batchEdgeRequest("list", "old", "old",
UpdateStrategy.ELIMINATE);
Assert.assertThrows(ServerException.class, () -> {
Whitebox.setInternalState(req2, "edges", null);
edgeAPI.update(req2);
}, e -> {
String expect = "Parameter 'edges' can't be null";
Assert.assertContains(expect, e.getMessage());
});
BatchEdgeRequest req3 = batchEdgeRequest("list", "old", "old",
UpdateStrategy.ELIMINATE);
Assert.assertThrows(ServerException.class, () -> {
Whitebox.setInternalState(req3, "edges", ImmutableList.of());
edgeAPI.update(req3);
}, e -> {
String expect = "The number of edges can't be 0";
Assert.assertContains(expect, e.getMessage());
});
BatchEdgeRequest req4 = batchEdgeRequest("list", "old", "old",
UpdateStrategy.ELIMINATE);
Assert.assertThrows(ServerException.class, () -> {
Whitebox.setInternalState(req4, "createIfNotExist", false);
edgeAPI.update(req4);
}, e -> {
String expect = "Parameter 'create_if_not_exist' " +
"dose not support false now";
Assert.assertContains(expect, e.getMessage());
});
BatchEdgeRequest req5 = batchEdgeRequest("list", "old", "old",
UpdateStrategy.ELIMINATE);
Assert.assertThrows(ServerException.class, () -> {
Whitebox.setInternalState(req5, "updateStrategies", null);
edgeAPI.update(req5);
}, e -> {
String expect = "Parameter 'update_strategies' can't be empty";
Assert.assertContains(expect, e.getMessage());
});
BatchEdgeRequest req6 = batchEdgeRequest("list", "old", "old",
UpdateStrategy.ELIMINATE);
Assert.assertThrows(ServerException.class, () -> {
Whitebox.setInternalState(req6, "updateStrategies",
ImmutableMap.of());
edgeAPI.update(req6);
}, e -> {
String expect = "Parameter 'update_strategies' can't be empty";
Assert.assertContains(expect, e.getMessage());
});
BatchEdgeRequest req7 = batchEdgeRequest("list", "old", "old",
UpdateStrategy.ELIMINATE);
Assert.assertThrows(ServerException.class, () -> {
List<Edge> edges = this.createNEdgesBatch("object", "updates",
"old", 501);
Whitebox.setInternalState(req7, "edges", edges);
edgeAPI.update(req7);
}, e -> {
String expect = "Too many edges for one time post";
Assert.assertContains(expect, e.getMessage());
});
}
@Test
public void testEdgeInvalidUpdateStrategy() {
BatchEdgeRequest req1 = batchEdgeRequest("name", "old", "new",
UpdateStrategy.SUM);
Assert.assertThrows(ServerException.class, () -> {
edgeAPI.update(req1);
}, e -> {
String expect = "Property type must be Number for strategy SUM, " +
"but got type String, String";
Assert.assertContains(expect, e.getMessage());
});
BatchEdgeRequest req2 = batchEdgeRequest("name", "old", "new",
UpdateStrategy.BIGGER);
Assert.assertThrows(ServerException.class, () -> {
edgeAPI.update(req2);
}, e -> {
String expect = "Property type must be Date or Number " +
"for strategy BIGGER, but got type String, String";
Assert.assertContains(expect, e.getMessage());
});
BatchEdgeRequest req3 = batchEdgeRequest("name", "old", "new",
UpdateStrategy.SMALLER);
Assert.assertThrows(ServerException.class, () -> {
edgeAPI.update(req3);
}, e -> {
String expect = "Property type must be Date or Number " +
"for strategy SMALLER, but got type String, String";
Assert.assertContains(expect, e.getMessage());
});
BatchEdgeRequest req4 = batchEdgeRequest("price", 1, -1,
UpdateStrategy.UNION);
Assert.assertThrows(ServerException.class, () -> {
edgeAPI.update(req4);
}, e -> {
String expect = "Property type must be Set or List " +
"for strategy UNION, but got type Integer, Integer";
Assert.assertContains(expect, e.getMessage());
});
BatchEdgeRequest req5 = batchEdgeRequest("date", "old", "new",
INTERSECTION);
Assert.assertThrows(ServerException.class, () -> {
edgeAPI.update(req5);
}, e -> {
String expect = "Property type must be Set or List for " +
"strategy INTERSECTION, but got type Date, Long";
Assert.assertContains(expect, e.getMessage());
});
BatchEdgeRequest req6 = batchEdgeRequest("price", 1, -1,
UpdateStrategy.APPEND);
Assert.assertThrows(ServerException.class, () -> {
edgeAPI.update(req6);
}, e -> {
String expect = "Property type must be Set or List for " +
"strategy APPEND, but got type Integer, Integer";
Assert.assertContains(expect, e.getMessage());
});
BatchEdgeRequest req7 = batchEdgeRequest("name", "old", "new",
UpdateStrategy.ELIMINATE);
Assert.assertThrows(ServerException.class, () -> {
edgeAPI.update(req7);
}, e -> {
String expect = "Property type must be Set or List for " +
"strategy ELIMINATE, but got type String, String";
Assert.assertContains(expect, e.getMessage());
});
}
private BatchVertexRequest batchVertexRequest(String key, Object oldData,
Object newData,
UpdateStrategy strategy) {
// Init old & new vertices
graph().addVertices(this.createNVertexBatch("object", oldData,
BATCH_SIZE));
List<Vertex> vertices = this.createNVertexBatch("object", newData,
BATCH_SIZE);
Map<String, UpdateStrategy> strategies = ImmutableMap.of(key, strategy);
BatchVertexRequest req;
req = new BatchVertexRequest.Builder().vertices(vertices)
.updatingStrategies(strategies)
.createIfNotExist(true)
.build();
return req;
}
private BatchEdgeRequest batchEdgeRequest(String key, Object oldData,
Object newData,
UpdateStrategy strategy) {
// Init old vertices & edges
graph().addVertices(this.createNVertexBatch("object", oldData,
BATCH_SIZE * 2));
graph().addEdges(this.createNEdgesBatch("object", "updates",
oldData, BATCH_SIZE));
List<Edge> edges = this.createNEdgesBatch("object", "updates",
newData, BATCH_SIZE);
Map<String, UpdateStrategy> strategies = ImmutableMap.of(key, strategy);
BatchEdgeRequest req;
req = new BatchEdgeRequest.Builder().edges(edges)
.updatingStrategies(strategies)
.checkVertex(false)
.createIfNotExist(true)
.build();
return req;
}
private List<Vertex> createNVertexBatch(String vertexLabel,
Object symbol, int num) {
List<Vertex> vertices = new ArrayList<>(num);
for (int i = 1; i <= num; i++) {
Vertex vertex = new Vertex(vertexLabel);
vertex.property("name", String.valueOf(i));
if (symbol instanceof Number) {
vertex.property("price", (int) symbol * i);
}
vertex.property("date", new Date(System.currentTimeMillis() + i));
vertex.property("set", ImmutableSet.of(String.valueOf(symbol) + i));
vertex.property("list",
ImmutableList.of(String.valueOf(symbol) + i));
vertices.add(vertex);
}
return vertices;
}
private List<Edge> createNEdgesBatch(String vertexLabel, String edgeLabel,
Object symbol, int num) {
VertexLabel vLabel = schema().getVertexLabel(vertexLabel);
List<Edge> edges = new ArrayList<>(num);
for (int i = 1; i <= num; i++) {
Edge edge = new Edge(edgeLabel);
edge.sourceLabel(vertexLabel);
edge.targetLabel(vertexLabel);
edge.sourceId(vLabel.id() + ":" + i);
edge.targetId(vLabel.id() + ":" + i * 2);
edge.property("name", String.valueOf(i));
if (symbol instanceof Number) {
edge.property("price", (int) symbol * i);
}
edge.property("date", new Date(System.currentTimeMillis() + i));
edge.property("set", ImmutableSet.of(String.valueOf(symbol) + i));
edge.property("list", ImmutableList.of(String.valueOf(symbol) + i));
edges.add(edge);
}
return edges;
}
private static void assertBatchResponse(List<? extends GraphElement> list,
String property, int result) {
Assert.assertEquals(BATCH_SIZE, list.size());
list.forEach(element -> {
String index = String.valueOf(element.property("name"));
Object value = element.property(property);
Assert.assertTrue(value instanceof Number);
Assert.assertEquals(result * Integer.parseInt(index), value);
});
}
private static void assertBatchResponse(List<? extends GraphElement> list,
String property, String... data) {
Assert.assertEquals(BATCH_SIZE, list.size());
list.forEach(element -> {
String index = String.valueOf(element.property("name"));
Object value = element.property(property);
Assert.assertTrue(value instanceof List);
if (data.length == 0) {
Assert.assertTrue(((List<?>) value).isEmpty());
} else if (data.length == 1) {
Assert.assertEquals(ImmutableList.of(data[0] + index), value);
} else {
Assert.assertEquals(ImmutableList.of(data[0] + index,
data[1] + index), value);
}
});
}
}