forked from hugegraph/hugegraph
chore: fix TinkerPop unit test (#2055)
* chore: don't support persistence for memory backend
* chore: setup graph by first step graph when graph is null
* chore: apply relations optimize logic
* chore: don't support null properties
* fix: g.V().has(empty).count() and g.V().count().as('a').select('a')
* fix: specify the code generation directory for raft.proto (#2057)
* fix: tinkerpop unit schema no define
* fix the style & clean some outdated code
Co-authored-by: Simon Cheung <ming@apache.org>
Co-authored-by: imbajin <jin@apache.org>
This commit is contained in:
parent
fc27f2c200
commit
6c3170c496
|
|
@ -17,20 +17,20 @@ jobs:
|
|||
distribution: 'zulu'
|
||||
|
||||
- name: Cache Maven packages
|
||||
uses: actions/cache@v2
|
||||
uses: actions/cache@v3
|
||||
with:
|
||||
path: ~/.m2
|
||||
key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }}
|
||||
restore-keys: ${{ runner.os }}-m2
|
||||
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v2
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
fetch-depth: 2
|
||||
|
||||
- name: Package
|
||||
run: |
|
||||
mvn clean package -DskipTests
|
||||
mvn clean package -DskipTests -ntp
|
||||
|
||||
- name: Rename file
|
||||
if: contains(env.TAG_NAME, "-")
|
||||
|
|
@ -37,7 +37,7 @@ jobs:
|
|||
distribution: 'zulu'
|
||||
|
||||
- name: Cache Maven packages
|
||||
uses: actions/cache@v2
|
||||
uses: actions/cache@v3
|
||||
with:
|
||||
path: ~/.m2
|
||||
key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }}
|
||||
|
|
@ -68,18 +68,6 @@ jobs:
|
|||
java-version: ${{ matrix.JAVA_VERSION }}
|
||||
distribution: 'zulu'
|
||||
|
||||
# - name: Init MySQL Env
|
||||
# if: ${{ env.BACKEND == 'mysql' }}
|
||||
# uses: mirromutth/mysql-action@v1.1
|
||||
# with:
|
||||
# host port: 3306 # Optional, default value is 3306. The port of host
|
||||
# container port: 3306 # Optional, default value is 3306. The port of container
|
||||
# character set server: 'utf8mb4' # Optional, default value is 'utf8mb4'. The '--character-set-server' option for mysqld
|
||||
# collation server: 'utf8mb4_general_ci' # Optional, default value is 'utf8mb4_general_ci'. The '--collation-server' option for mysqld
|
||||
# mysql version: '5.7' # Optional, default value is "latest". The version of the MySQL
|
||||
# mysql database: 'test' # Optional, default value is "test". The specified database which will be create
|
||||
# mysql root password: "******" # Required if "mysql user" is empty, default is empty. The root superuser password
|
||||
|
||||
- name: Run unit test
|
||||
run: |
|
||||
$TRAVIS_DIR/run-unit-test.sh $BACKEND
|
||||
|
|
|
|||
|
|
@ -193,8 +193,6 @@ public class StandardHugeGraph implements HugeGraph {
|
|||
|
||||
this.taskManager = TaskManager.instance();
|
||||
|
||||
this.features = new HugeFeatures(this, true);
|
||||
|
||||
this.name = config.get(CoreOptions.STORE);
|
||||
this.started = false;
|
||||
this.closed = false;
|
||||
|
|
@ -214,6 +212,8 @@ public class StandardHugeGraph implements HugeGraph {
|
|||
|
||||
try {
|
||||
this.tx = new TinkerPopTransaction(this);
|
||||
boolean supportsPersistence = this.backendStoreFeatures().supportsPersistence();
|
||||
this.features = new HugeFeatures(this, supportsPersistence);
|
||||
|
||||
SnowflakeIdGenerator.init(this.params);
|
||||
|
||||
|
|
|
|||
|
|
@ -35,13 +35,14 @@ import org.apache.hugegraph.type.define.HugeKeys;
|
|||
import org.apache.hugegraph.util.E;
|
||||
import org.apache.hugegraph.util.InsertionOrderUtil;
|
||||
import org.apache.hugegraph.util.NumericUtil;
|
||||
|
||||
import com.google.common.collect.ImmutableList;
|
||||
import com.google.common.collect.ImmutableSet;
|
||||
|
||||
public final class ConditionQueryFlatten {
|
||||
|
||||
private static final Set<HugeKeys> SPECIAL_KEYS = ImmutableSet.of(
|
||||
HugeKeys.LABEL
|
||||
HugeKeys.LABEL
|
||||
);
|
||||
|
||||
public static List<ConditionQuery> flatten(ConditionQuery query) {
|
||||
|
|
@ -51,7 +52,7 @@ public final class ConditionQueryFlatten {
|
|||
public static List<ConditionQuery> flatten(ConditionQuery query,
|
||||
boolean supportIn) {
|
||||
if (query.isFlattened() && !query.mayHasDupKeys(SPECIAL_KEYS)) {
|
||||
return ImmutableList.of(query);
|
||||
return flattenRelations(query);
|
||||
}
|
||||
|
||||
List<ConditionQuery> queries = new ArrayList<>();
|
||||
|
|
@ -123,8 +124,8 @@ public final class ConditionQueryFlatten {
|
|||
return new Condition.Or(flattenIn(or.left(), supportIn),
|
||||
flattenIn(or.right(), supportIn));
|
||||
default:
|
||||
throw new AssertionError(String.format(
|
||||
"Wrong condition type: '%s'", condition.type()));
|
||||
throw new AssertionError(String.format("Wrong condition type: '%s'",
|
||||
condition.type()));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -144,8 +145,7 @@ public final class ConditionQueryFlatten {
|
|||
(key == HugeKeys.OWNER_VERTEX || key == HugeKeys.ID)) {
|
||||
// TODO: Should not rely on HugeKeys here, improve key judgment
|
||||
// Just mark flatten
|
||||
return new Condition.FlattenSyspropRelation(
|
||||
(SyspropRelation) relation);
|
||||
return new Condition.FlattenSyspropRelation((SyspropRelation) relation);
|
||||
}
|
||||
|
||||
// Do IN flatten, return null if values.size() == 0
|
||||
|
|
@ -214,8 +214,8 @@ public final class ConditionQueryFlatten {
|
|||
flattenAndOr(or.right()));
|
||||
break;
|
||||
default:
|
||||
throw new AssertionError(String.format(
|
||||
"Wrong condition type: '%s'", condition.type()));
|
||||
throw new AssertionError(String.format("Wrong condition type: '%s'",
|
||||
condition.type()));
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
|
@ -251,6 +251,25 @@ public final class ConditionQueryFlatten {
|
|||
return cq;
|
||||
}
|
||||
|
||||
private static List<ConditionQuery> flattenRelations(ConditionQuery query) {
|
||||
Relations relations = new Relations();
|
||||
List<Condition> nonRelations = new ArrayList<>();
|
||||
for (Condition condition : query.conditions()) {
|
||||
if (condition.isRelation()) {
|
||||
relations.add((Relation) condition);
|
||||
} else {
|
||||
nonRelations.add(condition);
|
||||
}
|
||||
}
|
||||
relations = optimizeRelations(relations);
|
||||
if (relations != null) {
|
||||
ConditionQuery cq = newQueryFromRelations(query, relations);
|
||||
cq.query(nonRelations);
|
||||
return ImmutableList.of(cq);
|
||||
}
|
||||
return ImmutableList.of(query);
|
||||
}
|
||||
|
||||
private static Relations optimizeRelations(Relations relations) {
|
||||
// Optimize and-relations in one query
|
||||
// e.g. (age>1 and age>2) -> (age>2)
|
||||
|
|
@ -289,8 +308,9 @@ public final class ConditionQueryFlatten {
|
|||
|
||||
/**
|
||||
* Reduce and merge relations linked with 'AND' for same key
|
||||
* @param relations linked with 'AND' having same key, may contains 'in',
|
||||
* 'not in', '>', '<', '>=', '<=', '==', '!='
|
||||
*
|
||||
* @param relations linked with 'AND' having same key, may contain 'in', 'not in',
|
||||
* '>', '<', '>=', '<=', '==', '!='
|
||||
* @return merged relations
|
||||
*/
|
||||
private static Relations mergeRelations(Relations relations) {
|
||||
|
|
@ -410,8 +430,8 @@ public final class ConditionQueryFlatten {
|
|||
return true;
|
||||
}
|
||||
return compare(low, high) < 0 || compare(low, high) == 0 &&
|
||||
low.relation() == Condition.RelationType.GTE &&
|
||||
high.relation() == Condition.RelationType.LTE;
|
||||
low.relation() == Condition.RelationType.GTE &&
|
||||
high.relation() == Condition.RelationType.LTE;
|
||||
}
|
||||
|
||||
private static boolean validEq(Relation eq, Relation low, Relation high) {
|
||||
|
|
@ -460,8 +480,7 @@ public final class ConditionQueryFlatten {
|
|||
return selectRelation(first, second, false);
|
||||
}
|
||||
|
||||
private static Relation selectRelation(Relation first, Relation second,
|
||||
boolean high) {
|
||||
private static Relation selectRelation(Relation first, Relation second, boolean high) {
|
||||
if (first == null) {
|
||||
return second;
|
||||
}
|
||||
|
|
@ -491,8 +510,8 @@ public final class ConditionQueryFlatten {
|
|||
} else if (firstValue instanceof Date && secondValue instanceof Date) {
|
||||
return ((Date) firstValue).compareTo((Date) secondValue);
|
||||
} else {
|
||||
throw new IllegalArgumentException(String.format(
|
||||
"Can't compare between %s and %s", first, second));
|
||||
throw new IllegalArgumentException(String.format("Can't compare between %s and %s",
|
||||
first, second));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -271,6 +271,11 @@ public class HugeFeatures implements Graph.Features {
|
|||
return VertexProperty.Cardinality.single;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean supportsNullPropertyValues() {
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean supportsDefaultLabel() {
|
||||
return true;
|
||||
}
|
||||
|
|
@ -291,6 +296,11 @@ public class HugeFeatures implements Graph.Features {
|
|||
public EdgePropertyFeatures properties() {
|
||||
return this.edgePropertyFeatures;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean supportsNullPropertyValues() {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public class HugeDataTypeFeatures implements DataTypeFeatures {
|
||||
|
|
|
|||
|
|
@ -104,6 +104,7 @@ public final class HugeCountStepStrategy
|
|||
graphStep.queryInfo().aggregate(Aggregate.AggregateFunc.COUNT, null);
|
||||
HugeCountStep<?> countStep = new HugeCountStep<>(traversal, graphStep);
|
||||
for (Step<?, ?> origin : originSteps) {
|
||||
TraversalHelper.copyLabels(origin, countStep, false);
|
||||
traversal.removeStep(origin);
|
||||
}
|
||||
traversal.addStep(0, countStep);
|
||||
|
|
|
|||
|
|
@ -72,6 +72,10 @@ public final class HugeGraphStep<S, E extends Element>
|
|||
}
|
||||
|
||||
protected long count() {
|
||||
if (this.ids == null) {
|
||||
return 0L;
|
||||
}
|
||||
|
||||
if (this.returnsVertex()) {
|
||||
return this.verticesCount();
|
||||
} else {
|
||||
|
|
@ -144,14 +148,13 @@ public final class HugeGraphStep<S, E extends Element>
|
|||
}
|
||||
|
||||
private Query makeQuery(HugeGraph graph, HugeType type) {
|
||||
Query query = null;
|
||||
Query query;
|
||||
if (this.hasContainers.isEmpty()) {
|
||||
// Query all
|
||||
query = new Query(type);
|
||||
} else {
|
||||
ConditionQuery q = new ConditionQuery(type);
|
||||
query = TraversalUtil.fillConditionQuery(q, this.hasContainers,
|
||||
graph);
|
||||
query = TraversalUtil.fillConditionQuery(q, this.hasContainers, graph);
|
||||
}
|
||||
|
||||
query = this.injectQueryInfo(query);
|
||||
|
|
@ -198,6 +201,7 @@ public final class HugeGraphStep<S, E extends Element>
|
|||
return this.lastTimeResults;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (!(obj instanceof HugeGraphStep)) {
|
||||
return false;
|
||||
|
|
|
|||
|
|
@ -54,6 +54,9 @@ public final class HugeGraphStepStrategy
|
|||
List<GraphStep> steps = TraversalHelper.getStepsOfClass(
|
||||
GraphStep.class, traversal);
|
||||
for (GraphStep originStep : steps) {
|
||||
TraversalUtil.trySetGraph(originStep,
|
||||
TraversalUtil.tryGetGraph(steps.get(0)));
|
||||
|
||||
HugeGraphStep<?, ?> newStep = new HugeGraphStep<>(originStep);
|
||||
TraversalHelper.replaceStep(originStep, newStep, traversal);
|
||||
|
||||
|
|
|
|||
|
|
@ -25,6 +25,7 @@ import java.util.HashMap;
|
|||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
import java.util.function.BiPredicate;
|
||||
import java.util.function.Function;
|
||||
import java.util.regex.Matcher;
|
||||
|
|
@ -54,6 +55,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.Step;
|
|||
import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
|
||||
import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
|
||||
import org.apache.tinkerpop.gremlin.process.traversal.step.HasContainerHolder;
|
||||
import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
|
||||
import org.apache.tinkerpop.gremlin.process.traversal.step.filter.FilterStep;
|
||||
import org.apache.tinkerpop.gremlin.process.traversal.step.filter.HasStep;
|
||||
import org.apache.tinkerpop.gremlin.process.traversal.step.filter.RangeGlobalStep;
|
||||
|
|
@ -105,12 +107,61 @@ public final class TraversalUtil {
|
|||
}
|
||||
|
||||
public static HugeGraph tryGetGraph(Step<?, ?> step) {
|
||||
Graph graph = step.getTraversal().getGraph().get();
|
||||
if (graph instanceof HugeGraph) {
|
||||
return (HugeGraph) graph;
|
||||
// TODO: remove these EmptyGraph judgments when upgrade tinkerpop (refer-tinkerpop#1699)
|
||||
Optional<Graph> graph = step.getTraversal()
|
||||
.getGraph()
|
||||
.filter(g -> !(g instanceof EmptyGraph));
|
||||
if (!graph.isPresent()) {
|
||||
TraversalParent parent = step.getTraversal().getParent();
|
||||
if (parent instanceof Traversal) {
|
||||
Optional<Graph> parentGraph;
|
||||
parentGraph = ((Traversal<?, ?>) parent).asAdmin()
|
||||
.getGraph()
|
||||
.filter(g -> !(g instanceof EmptyGraph));
|
||||
if (parentGraph.isPresent()) {
|
||||
step.getTraversal().setGraph(parentGraph.get());
|
||||
return (HugeGraph) parentGraph.get();
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
assert graph == null || graph instanceof EmptyGraph;
|
||||
return null;
|
||||
|
||||
assert graph.get() instanceof HugeGraph;
|
||||
return (HugeGraph) graph.get();
|
||||
}
|
||||
|
||||
public static void trySetGraph(Step<?, ?> step, HugeGraph graph) {
|
||||
if (graph == null || step == null || step.getTraversal() == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
// TODO: remove these EmptyGraph judgments when upgrade tinkerpop (refer-tinkerpop#1699)
|
||||
Optional<Graph> stepGraph = step.getTraversal()
|
||||
.getGraph()
|
||||
.filter(g -> !(g instanceof EmptyGraph));
|
||||
|
||||
if (step instanceof TraversalParent) {
|
||||
for (final Traversal.Admin<?, ?> local : ((TraversalParent) step).getLocalChildren()) {
|
||||
if (local.getGraph().filter(g -> !(g instanceof EmptyGraph)).isPresent()) {
|
||||
continue;
|
||||
}
|
||||
local.setGraph(graph);
|
||||
}
|
||||
for (final Traversal.Admin<?, ?> global : ((TraversalParent) step).getGlobalChildren()) {
|
||||
if (global.getGraph().filter(g -> !(g instanceof EmptyGraph)).isPresent()) {
|
||||
continue;
|
||||
}
|
||||
global.setGraph(graph);
|
||||
}
|
||||
}
|
||||
|
||||
if (stepGraph.isPresent()) {
|
||||
assert stepGraph.get() instanceof HugeGraph;
|
||||
return;
|
||||
}
|
||||
|
||||
step.getTraversal().setGraph(graph);
|
||||
}
|
||||
|
||||
public static void extractHasContainer(HugeGraphStep<?, ?> newStep,
|
||||
|
|
@ -154,7 +205,6 @@ public final class TraversalUtil {
|
|||
step = step.getNextStep();
|
||||
if (step instanceof OrderGlobalStep) {
|
||||
QueryHolder holder = (QueryHolder) newStep;
|
||||
@SuppressWarnings("resource")
|
||||
OrderGlobalStep<?, ?> orderStep = (OrderGlobalStep<?, ?>) step;
|
||||
orderStep.getComparators().forEach(comp -> {
|
||||
ElementValueComparator<?> comparator =
|
||||
|
|
@ -225,7 +275,6 @@ public final class TraversalUtil {
|
|||
do {
|
||||
step = step.getNextStep();
|
||||
if (step instanceof PropertiesStep) {
|
||||
@SuppressWarnings("resource")
|
||||
PropertiesStep<?> propStep = (PropertiesStep<?>) step;
|
||||
if (propStep.getReturnType() == PropertyType.VALUE &&
|
||||
propStep.getPropertyKeys().length == 1) {
|
||||
|
|
@ -580,14 +629,29 @@ public final class TraversalUtil {
|
|||
List<HasStep> steps =
|
||||
TraversalHelper.getStepsOfAssignableClassRecursively(
|
||||
HasStep.class, traversal);
|
||||
|
||||
if (steps.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* The graph in traversal may be null, for example:
|
||||
* `g.V().hasLabel('person').union(__.has('name', 'tom'))`
|
||||
* Here `__.has()` will create a new traversal, but the graph is null
|
||||
*/
|
||||
if (steps.isEmpty() || !traversal.getGraph().isPresent()) {
|
||||
return;
|
||||
if (!traversal.getGraph().filter(g -> !(g instanceof EmptyGraph)).isPresent()) {
|
||||
if (traversal.getParent() == null || !(traversal.getParent() instanceof Traversal)) {
|
||||
return;
|
||||
}
|
||||
|
||||
Optional<Graph> parentGraph = ((Traversal<?, ?>) traversal.getParent())
|
||||
.asAdmin()
|
||||
.getGraph();
|
||||
if (parentGraph.filter(g -> !(g instanceof EmptyGraph)).isPresent()) {
|
||||
traversal.setGraph(parentGraph.get());
|
||||
}
|
||||
}
|
||||
|
||||
HugeGraph graph = (HugeGraph) traversal.getGraph().get();
|
||||
for (HasStep<?> step : steps) {
|
||||
TraversalUtil.convHasStep(graph, step);
|
||||
|
|
@ -603,7 +667,7 @@ public final class TraversalUtil {
|
|||
|
||||
private static void convPredicateValue(HugeGraph graph,
|
||||
HasContainer has) {
|
||||
// No need to convert if key is sysprop
|
||||
// No need to convert if key is sys-prop
|
||||
if (isSysProp(has.getKey())) {
|
||||
return;
|
||||
}
|
||||
|
|
@ -719,8 +783,7 @@ public final class TraversalUtil {
|
|||
|
||||
public static void retrieveSysprop(List<HasContainer> hasContainers,
|
||||
Function<HasContainer, Boolean> func) {
|
||||
for (Iterator<HasContainer> iter = hasContainers.iterator();
|
||||
iter.hasNext();) {
|
||||
for (Iterator<HasContainer> iter = hasContainers.iterator(); iter.hasNext();) {
|
||||
HasContainer container = iter.next();
|
||||
if (container.getKey().startsWith("~") && func.apply(container)) {
|
||||
iter.remove();
|
||||
|
|
|
|||
|
|
@ -53,8 +53,7 @@ import com.google.common.collect.ImmutableList;
|
|||
|
||||
public class MultiGraphsTest extends BaseCoreTest {
|
||||
|
||||
private static final String NAME48 =
|
||||
"g12345678901234567890123456789012345678901234567";
|
||||
private static final String NAME48 = "g12345678901234567890123456789012345678901234567";
|
||||
|
||||
@Test
|
||||
public void testWriteAndReadVersion() {
|
||||
|
|
@ -233,16 +232,12 @@ public class MultiGraphsTest extends BaseCoreTest {
|
|||
|
||||
@Test
|
||||
public void testCreateGraphsWithInvalidNames() {
|
||||
List<String> invalidNames = ImmutableList.of(
|
||||
"", " ", " g", "g 1", " .", ". .",
|
||||
"@", "$", "%", "^", "&", "*", "(", ")",
|
||||
"_", "+", "`", "-", "=", "{", "}", "|",
|
||||
"[", "]", "\"", "<", "?", ";", "'", "~",
|
||||
",", ".", "/", "\\",
|
||||
"~g", "g~", "g'",
|
||||
"_1", "_a",
|
||||
"1a", "123",
|
||||
NAME48 + "8");
|
||||
List<String> invalidNames = ImmutableList.of("", " ", " g", "g 1", " .", ". .",
|
||||
"@", "$", "%", "^", "&", "*", "(", ")",
|
||||
"_", "+", "`", "-", "=", "{", "}", "|",
|
||||
"[", "]", "\"", "<", "?", ";", "'", "~",
|
||||
",", ".", "/", "\\", "~g", "g~", "g'",
|
||||
"_1", "_a", "1a", "123", NAME48 + "8");
|
||||
for (String name : invalidNames) {
|
||||
Assert.assertThrows(RuntimeException.class, () -> openGraphs(name));
|
||||
}
|
||||
|
|
@ -267,8 +262,7 @@ public class MultiGraphsTest extends BaseCoreTest {
|
|||
() -> g2.vertexLabel("node"));
|
||||
Assert.assertThrows(IllegalArgumentException.class,
|
||||
() -> g3.vertexLabel("node"));
|
||||
g1.schema().vertexLabel("node").useCustomizeNumberId()
|
||||
.ifNotExist().create();
|
||||
g1.schema().vertexLabel("node").useCustomizeNumberId().ifNotExist().create();
|
||||
g2.vertexLabel("node");
|
||||
g3.vertexLabel("node");
|
||||
|
||||
|
|
@ -294,13 +288,11 @@ public class MultiGraphsTest extends BaseCoreTest {
|
|||
}
|
||||
|
||||
@Test
|
||||
public void testCreateGraphWithSameNameDifferentBackends()
|
||||
throws Exception {
|
||||
public void testCreateGraphWithSameNameDifferentBackends() throws Exception {
|
||||
HugeGraph g1 = openGraphWithBackend("graph", "memory", "text");
|
||||
g1.initBackend();
|
||||
Assert.assertThrows(RuntimeException.class,
|
||||
() -> openGraphWithBackend("graph", "rocksdb",
|
||||
"binary"));
|
||||
() -> openGraphWithBackend("graph", "rocksdb", "binary"));
|
||||
g1.clearBackend();
|
||||
g1.close();
|
||||
}
|
||||
|
|
@ -323,17 +315,15 @@ public class MultiGraphsTest extends BaseCoreTest {
|
|||
|
||||
@Test
|
||||
public void testCreateGraphsWithMultiDisksForRocksDB() {
|
||||
HugeGraph g1 = openGraphWithBackend(
|
||||
"g1", "rocksdb", "binary",
|
||||
"rocksdb.data_disks",
|
||||
"[g/secondary_index:rocksdb-index1," +
|
||||
" g/range_int_index:rocksdb-index1," +
|
||||
" g/range_long_index:rocksdb-index2]");
|
||||
HugeGraph g1 = openGraphWithBackend("g1", "rocksdb", "binary", "rocksdb.data_disks",
|
||||
"[g/secondary_index:rocksdb-index1," +
|
||||
" g/range_int_index:rocksdb-index1," +
|
||||
" g/range_long_index:rocksdb-index2]");
|
||||
g1.initBackend();
|
||||
g1.clearBackend();
|
||||
|
||||
final HugeGraph[] g2 = new HugeGraph[1];
|
||||
Assert.assertThrows(ConnectionException.class, () -> {
|
||||
Assert.assertThrows(RuntimeException.class, () -> {
|
||||
g2[0] = openGraphWithBackend("g2", "rocksdb", "binary",
|
||||
"rocksdb.data_disks",
|
||||
"[g/range_int_index:rocksdb-index1]");
|
||||
|
|
@ -348,7 +338,7 @@ public class MultiGraphsTest extends BaseCoreTest {
|
|||
});
|
||||
|
||||
final HugeGraph[] g3 = new HugeGraph[1];
|
||||
Assert.assertThrows(ConnectionException.class, () -> {
|
||||
Assert.assertThrows(RuntimeException.class, () -> {
|
||||
g3[0] = openGraphWithBackend("g3", "rocksdb", "binary",
|
||||
"rocksdb.data_disks",
|
||||
"[g/secondary_index:/]");
|
||||
|
|
@ -388,7 +378,7 @@ public class MultiGraphsTest extends BaseCoreTest {
|
|||
Configuration config = buildConfig(graph);
|
||||
config.setProperty(CoreOptions.BACKEND.name(), backend);
|
||||
config.setProperty(CoreOptions.SERIALIZER.name(), serializer);
|
||||
for (int i = 0; i < configs.length;) {
|
||||
for (int i = 0; i < configs.length; ) {
|
||||
config.setProperty(configs[i++], configs[i++]);
|
||||
}
|
||||
return ((HugeGraph) GraphFactory.open(config));
|
||||
|
|
@ -397,7 +387,7 @@ public class MultiGraphsTest extends BaseCoreTest {
|
|||
private static Configuration buildConfig(String graphName) {
|
||||
PropertiesConfiguration conf = Utils.getConf();
|
||||
Configuration config = new BaseConfiguration();
|
||||
for (Iterator<String> keys = conf.getKeys(); keys.hasNext();) {
|
||||
for (Iterator<String> keys = conf.getKeys(); keys.hasNext(); ) {
|
||||
String key = keys.next();
|
||||
config.setProperty(key, conf.getProperty(key));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -457,6 +457,7 @@ public class TestGraph implements Graph {
|
|||
schema.propertyKey("ripple").ifNotExist().create();
|
||||
schema.propertyKey("lop").ifNotExist().create();
|
||||
schema.propertyKey("test").ifNotExist().create();
|
||||
schema.propertyKey("p").ifNotExist().create();
|
||||
|
||||
switch (idStrategy) {
|
||||
case AUTOMATIC:
|
||||
|
|
@ -475,8 +476,8 @@ public class TestGraph implements Graph {
|
|||
.nullableKeys("name")
|
||||
.ifNotExist().create();
|
||||
schema.vertexLabel(DEFAULT_VL)
|
||||
.properties("name", "age")
|
||||
.nullableKeys("name", "age")
|
||||
.properties("name", "age", "p")
|
||||
.nullableKeys("name", "age", "p")
|
||||
.ifNotExist().create();
|
||||
schema.vertexLabel("animal")
|
||||
.properties("name", "age", "peter", "josh", "marko",
|
||||
|
|
@ -499,8 +500,8 @@ public class TestGraph implements Graph {
|
|||
.nullableKeys("name")
|
||||
.useCustomizeStringId().ifNotExist().create();
|
||||
schema.vertexLabel(DEFAULT_VL)
|
||||
.properties("name", "age")
|
||||
.nullableKeys("name", "age")
|
||||
.properties("name", "age", "p")
|
||||
.nullableKeys("name", "age", "p")
|
||||
.useCustomizeStringId().ifNotExist().create();
|
||||
schema.vertexLabel("animal")
|
||||
.properties("name", "age")
|
||||
|
|
@ -557,6 +558,8 @@ public class TestGraph implements Graph {
|
|||
.range().ifNotExist().create();
|
||||
schema.indexLabel("personByNameAge").onV("person").by("name", "age")
|
||||
.ifNotExist().create();
|
||||
schema.indexLabel("vertexByP").onV("vertex").by("p")
|
||||
.ifNotExist().create();
|
||||
}
|
||||
|
||||
@Watched
|
||||
|
|
@ -659,6 +662,8 @@ public class TestGraph implements Graph {
|
|||
schema.propertyKey("f").asFloat().ifNotExist().create();
|
||||
schema.propertyKey("i").asInt().ifNotExist().create();
|
||||
schema.propertyKey("l").asLong().ifNotExist().create();
|
||||
schema.propertyKey("p").ifNotExist().create();
|
||||
schema.propertyKey("k").ifNotExist().create();
|
||||
schema.propertyKey("here").ifNotExist().create();
|
||||
schema.propertyKey("to-change").ifNotExist().create();
|
||||
schema.propertyKey("to-remove").ifNotExist().create();
|
||||
|
|
@ -704,7 +709,7 @@ public class TestGraph implements Graph {
|
|||
"favoriteColor", "aKey", "age", "boolean",
|
||||
"float", "double", "string", "integer",
|
||||
"long", "myId", "location", "x", "y", "s",
|
||||
"n", "d", "f", "i", "l", "to-change",
|
||||
"n", "d", "f", "i", "l", "p", "k", "to-change",
|
||||
"to-remove", "to-keep", "old", "new",
|
||||
"gremlin.partitionGraphStrategy.partition",
|
||||
"color", "blah")
|
||||
|
|
@ -714,7 +719,7 @@ public class TestGraph implements Graph {
|
|||
"favoriteColor", "aKey", "age", "boolean",
|
||||
"float", "double", "string", "integer",
|
||||
"long", "myId", "location", "x", "y", "s",
|
||||
"n", "d", "f", "i", "l", "to-change",
|
||||
"n", "d", "f", "i", "l", "p", "k", "to-change",
|
||||
"to-remove", "to-keep", "old", "new",
|
||||
"gremlin.partitionGraphStrategy.partition",
|
||||
"color", "blah")
|
||||
|
|
@ -729,7 +734,7 @@ public class TestGraph implements Graph {
|
|||
"favoriteColor", "aKey", "age", "boolean",
|
||||
"float", "double", "string", "integer",
|
||||
"long", "myId", "location", "x", "y", "s",
|
||||
"n", "d", "f", "i", "l", "to-change",
|
||||
"n", "d", "f", "i", "l", "p", "k", "to-change",
|
||||
"to-remove", "to-keep", "old", "new",
|
||||
"gremlin.partitionGraphStrategy.partition",
|
||||
"color", "blah")
|
||||
|
|
@ -739,7 +744,7 @@ public class TestGraph implements Graph {
|
|||
"favoriteColor", "aKey", "age", "boolean",
|
||||
"float", "double", "string", "integer",
|
||||
"long", "myId", "location", "x", "y", "s",
|
||||
"n", "d", "f", "i", "l", "to-change",
|
||||
"n", "d", "f", "i", "l", "p", "k", "to-change",
|
||||
"to-remove", "to-keep", "old", "new",
|
||||
"gremlin.partitionGraphStrategy.partition",
|
||||
"color", "blah")
|
||||
|
|
@ -754,6 +759,10 @@ public class TestGraph implements Graph {
|
|||
.ifNotExist().create();
|
||||
schema.indexLabel("defaultVLByName").onV(defaultVL).by("name")
|
||||
.ifNotExist().create();
|
||||
schema.indexLabel("defaultVLBySome").onV(defaultVL).by("some")
|
||||
.ifNotExist().create();
|
||||
schema.indexLabel("defaultVLByK").onV(defaultVL).by("k")
|
||||
.ifNotExist().create();
|
||||
}
|
||||
|
||||
@Watched
|
||||
|
|
|
|||
|
|
@ -165,6 +165,7 @@ org.apache.tinkerpop.gremlin.process.traversal.step.filter.HasTest.Traversals.g_
|
|||
org.apache.tinkerpop.gremlin.process.traversal.step.filter.HasTest.Traversals.g_V_hasXname_not_endingWithXasXX: Unsupported predicate 'notEndingWith(as)'
|
||||
org.apache.tinkerpop.gremlin.process.traversal.step.filter.HasTest.Traversals.g_V_hasXage_withoutX27_29X_count: Unsupported relation 'NEQ'
|
||||
org.apache.tinkerpop.gremlin.process.traversal.step.filter.HasTest.Traversals.g_V_hasXname_gtXmX_andXcontainingXoXXX: Unsupported predicate 'containing(o)'
|
||||
org.apache.tinkerpop.gremlin.process.traversal.step.filter.HasTest.g_V_hasXp_neqXvXX: Unsupported relation 'NEQ'
|
||||
|
||||
# Unsupport edge label 'created': 'software' -> 'person', has existed an edgelabel (created: person -> software) in this case
|
||||
org.apache.tinkerpop.gremlin.process.traversal.step.map.AddEdgeTest.Traversals.g_V_hasXname_markoX_asXaX_outEXcreatedX_asXbX_inV_addEXselectXbX_labelX_toXaX: Unsupport edge from inV to outV
|
||||
|
|
|
|||
|
|
@ -128,6 +128,7 @@ org.apache.tinkerpop.gremlin.process.traversal.step.filter.HasTest.Traversals.g_
|
|||
org.apache.tinkerpop.gremlin.process.traversal.step.filter.HasTest.Traversals.g_V_hasXname_not_endingWithXasXX: Unsupported predicate 'notEndingWith(as)'
|
||||
org.apache.tinkerpop.gremlin.process.traversal.step.filter.HasTest.Traversals.g_V_hasXage_withoutX27_29X_count: Unsupported relation 'NEQ'
|
||||
org.apache.tinkerpop.gremlin.process.traversal.step.filter.HasTest.Traversals.g_V_hasXname_gtXmX_andXcontainingXoXXX: Unsupported predicate 'containing(o)'
|
||||
org.apache.tinkerpop.gremlin.process.traversal.step.filter.HasTest.g_V_hasXp_neqXvXX: Unsupported relation 'NEQ'
|
||||
|
||||
# Unsupport edge label 'created': 'software' -> 'person', has existed an edgelabel (created: person -> software) in this case
|
||||
org.apache.tinkerpop.gremlin.process.traversal.step.map.AddEdgeTest.Traversals.g_V_hasXname_markoX_asXaX_outEXcreatedX_asXbX_inV_addEXselectXbX_labelX_toXaX: Unsupport edge from inV to outV
|
||||
|
|
|
|||
Loading…
Reference in New Issue