From 9bdb72bf0f4eab71f82f10b6a170dcb28b4c7498 Mon Sep 17 00:00:00 2001 From: bicouy0 Date: Fri, 11 Dec 2015 14:52:55 +0100 Subject: [PATCH] disable classname prefixing * OrientGraphFactory.setLabelAsClassName() to disable the default prefixing of classnames with V_ or E_ * OrientGraph.labelToClassName() and OrientGraph.classNameToLabel() helpers * OrientGraph.getEdgeIndexedKeys() and OrientGraph.getVertexIndexedKeys() verify the super class * OrientGraph.createClass() throws if creating the same class with a different base class * test suites modified --- .../gremlin/orientdb/OrientElement.java | 2 +- .../gremlin/orientdb/OrientGraph.java | 55 +++- .../gremlin/orientdb/OrientGraphFactory.java | 13 + .../gremlin/orientdb/OrientVertex.java | 3 +- .../step/sideEffect/OrientGraphStep.java | 2 +- .../gremlin/orientdb/OrientGraphTest.java | 21 ++ tests-scala/src/test/scala/OrientSpec.scala | 255 ++--------------- .../src/test/scala/OrientSpecBehaviours.scala | 256 ++++++++++++++++++ 8 files changed, 361 insertions(+), 246 deletions(-) create mode 100644 tests-scala/src/test/scala/OrientSpecBehaviours.scala diff --git a/driver/src/main/java/org/apache/tinkerpop/gremlin/orientdb/OrientElement.java b/driver/src/main/java/org/apache/tinkerpop/gremlin/orientdb/OrientElement.java index 89ca83aa..76f9dbba 100644 --- a/driver/src/main/java/org/apache/tinkerpop/gremlin/orientdb/OrientElement.java +++ b/driver/src/main/java/org/apache/tinkerpop/gremlin/orientdb/OrientElement.java @@ -44,7 +44,7 @@ public ORID id() { public String label() { String internalClassName = getRawDocument().getClassName(); // User labels on edges/vertices are prepended with E_ or V_ . The user should not see that. - return internalClassName.length() == 1 ? INTERNAL_CLASSES_TO_TINKERPOP_CLASSES.get(internalClassName) : internalClassName.substring(2); + return internalClassName.length() == 1 ? INTERNAL_CLASSES_TO_TINKERPOP_CLASSES.get(internalClassName) : graph.classNameToLabel(internalClassName); } public Graph graph() { diff --git a/driver/src/main/java/org/apache/tinkerpop/gremlin/orientdb/OrientGraph.java b/driver/src/main/java/org/apache/tinkerpop/gremlin/orientdb/OrientGraph.java index b6b012c1..91a57b75 100644 --- a/driver/src/main/java/org/apache/tinkerpop/gremlin/orientdb/OrientGraph.java +++ b/driver/src/main/java/org/apache/tinkerpop/gremlin/orientdb/OrientGraph.java @@ -66,6 +66,7 @@ public final class OrientGraph implements Graph { public static String CONFIG_OPEN = "orient-open"; public static String CONFIG_TRANSACTIONAL = "orient-transactional"; public static String CONFIG_POOL_SIZE = "orient-max-poolsize"; + public static String CONFIG_LABEL_AS_CLASSNAME = "orient-label-as-classname"; protected final ODatabaseDocumentTx database; protected final Features features; @@ -127,9 +128,7 @@ public Vertex addVertex(Object... keyValues) { if (ElementHelper.getIdValue(keyValues).isPresent()) throw Vertex.Exceptions.userSuppliedIdsNotSupported(); String label = ElementHelper.getLabelValue(keyValues).orElse(OImmutableClass.VERTEX_CLASS_NAME); - String className = label.equals(OImmutableClass.VERTEX_CLASS_NAME) ? - OImmutableClass.VERTEX_CLASS_NAME : - OImmutableClass.VERTEX_CLASS_NAME + "_" + label; + String className = labelToClassName(label, OImmutableClass.VERTEX_CLASS_NAME); OrientVertex vertex = new OrientVertex(this, className); vertex.property(keyValues); @@ -166,6 +165,26 @@ public Iterator vertices(Object... vertexIds) { vertexIds); } + /** + * Convert a label to orientdb class name + */ + public String labelToClassName(String label, String prefix) { + if (configuration.getBoolean(CONFIG_LABEL_AS_CLASSNAME, false)) { + return label; + } + return label.equals(prefix) ? prefix : prefix + "_" + label; + } + + /** + * Convert a orientdb class name to label + */ + public String classNameToLabel(String className) { + if (configuration.getBoolean(CONFIG_LABEL_AS_CLASSNAME, false)) { + return className; + } + return className.substring(2); + } + protected Object convertValue(final OIndex idx, Object iValue) { if (iValue != null) { final OType[] types = idx.getKeyTypes(); @@ -209,6 +228,10 @@ public Stream getIndexedVertices(OIndex index, Optional getIndexedKeys(String className) { @@ -241,11 +264,21 @@ public Set getIndexedKeys(final Class elementClass) { } public Set getVertexIndexedKeys(final String label) { - return getIndexedKeys(OImmutableClass.VERTEX_CLASS_NAME + "_" + label); + String className = labelToClassName(label, OImmutableClass.VERTEX_CLASS_NAME); + OClass cls = getSchema().getClass(className); + if (cls != null && cls.isSubClassOf(OImmutableClass.VERTEX_CLASS_NAME)) { + return getIndexedKeys(className); + } + return new HashSet(); } public Set getEdgeIndexedKeys(final String label) { - return getIndexedKeys(OImmutableClass.EDGE_CLASS_NAME + "_" + label); + String className = labelToClassName(label, OImmutableClass.EDGE_CLASS_NAME); + OClass cls = getSchema().getClass(className); + if (cls != null && cls.isSubClassOf(OImmutableClass.EDGE_CLASS_NAME)) { + return getIndexedKeys(className); + } + return new HashSet(); } @Override @@ -438,7 +471,8 @@ public void createClass(final String className, final String superClassName) { public void createClass(final String className, final OClass superClass) { makeActive(); OSchemaProxy schema = database.getMetadata().getSchema(); - if (schema.getClass(className) == null) { + OClass cls = schema.getClass(className); + if (cls == null) { try { schema.createClass(className, superClass); @@ -449,6 +483,11 @@ public void createClass(final String className, final OClass superClass) { } OLogManager.instance().info(this, "created class '" + className + "' as subclass of '" + superClass + "'"); } + else { + if (!cls.isSubClassOf(superClass)) { + throw new IllegalArgumentException("unable to create class '" + className + "' as subclass of '" + superClass + "'. different super class."); + } + } } public ODatabaseDocumentTx getRawDatabase() { @@ -500,14 +539,14 @@ protected void prepareIndexConfiguration(Configuration config) { public void createVertexIndex(final String key, final String label, final Configuration configuration) { - String className = OrientVertexType.CLASS_NAME + "_" + label; + String className = labelToClassName(label, OrientVertexType.CLASS_NAME); createVertexClass(className); createIndex(key, className, configuration); } public void createEdgeIndex(final String key, final String label, final Configuration configuration) { - String className = OrientEdgeType.CLASS_NAME + "_" + label; + String className = labelToClassName(label, OrientEdgeType.CLASS_NAME); createEdgeClass(className); createIndex(key, className, configuration); } diff --git a/driver/src/main/java/org/apache/tinkerpop/gremlin/orientdb/OrientGraphFactory.java b/driver/src/main/java/org/apache/tinkerpop/gremlin/orientdb/OrientGraphFactory.java index a77bf111..1c21b2d5 100644 --- a/driver/src/main/java/org/apache/tinkerpop/gremlin/orientdb/OrientGraphFactory.java +++ b/driver/src/main/java/org/apache/tinkerpop/gremlin/orientdb/OrientGraphFactory.java @@ -17,6 +17,7 @@ public final class OrientGraphFactory { protected final String password; protected Configuration configuration; protected volatile OPartitionedDatabasePool pool; + protected boolean labelAsClassName; public OrientGraphFactory(String url) { this(url, ADMIN, ADMIN); @@ -26,6 +27,7 @@ public OrientGraphFactory(String url, String user, String password) { this.url = url; this.user = user; this.password = password; + this.labelAsClassName = false; } public OrientGraphFactory(Configuration config) { @@ -104,6 +106,7 @@ protected Configuration getConfiguration(boolean create, boolean open, boolean t setProperty(OrientGraph.CONFIG_CREATE, create); setProperty(OrientGraph.CONFIG_OPEN, open); setProperty(OrientGraph.CONFIG_TRANSACTIONAL, transactional); + setProperty(OrientGraph.CONFIG_LABEL_AS_CLASSNAME, labelAsClassName); }}; } @@ -121,6 +124,16 @@ protected ODatabaseDocumentTx getDatabase(boolean create, boolean open) { return db; } + /** + * Enable or disable the prefixing of class names with V_