Changed DataTypeFeatures.
Project: http://git-wip-us.apache.org/repos/asf/incubator-s2graph/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-s2graph/commit/b8033e76 Tree: http://git-wip-us.apache.org/repos/asf/incubator-s2graph/tree/b8033e76 Diff: http://git-wip-us.apache.org/repos/asf/incubator-s2graph/diff/b8033e76 Branch: refs/heads/master Commit: b8033e768b8b61b9ac0d88cd168447ca5f9c8206 Parents: 507cfcf Author: DO YUNG YOON <steams...@apache.org> Authored: Fri Apr 14 14:47:52 2017 +0900 Committer: DO YUNG YOON <steams...@apache.org> Committed: Fri Apr 14 14:47:52 2017 +0900 ---------------------------------------------------------------------- .../scala/org/apache/s2graph/core/S2Graph.scala | 72 +++++++++++++------- .../core/features/S2DataTypeFeatures.scala | 32 +++++---- 2 files changed, 65 insertions(+), 39 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-s2graph/blob/b8033e76/s2core/src/main/scala/org/apache/s2graph/core/S2Graph.scala ---------------------------------------------------------------------- diff --git a/s2core/src/main/scala/org/apache/s2graph/core/S2Graph.scala b/s2core/src/main/scala/org/apache/s2graph/core/S2Graph.scala index 5669b2e..ec02dd5 100644 --- a/s2core/src/main/scala/org/apache/s2graph/core/S2Graph.scala +++ b/s2core/src/main/scala/org/apache/s2graph/core/S2Graph.scala @@ -20,8 +20,8 @@ package org.apache.s2graph.core import java.util -import java.util.concurrent.atomic.{AtomicBoolean, AtomicLong} -import java.util.concurrent.{ExecutorService, Executors, TimeUnit} +import java.util.concurrent.atomic.AtomicBoolean +import java.util.concurrent.{Executors, TimeUnit} import com.typesafe.config.{Config, ConfigFactory} import org.apache.commons.configuration.{BaseConfiguration, Configuration} @@ -34,15 +34,12 @@ import org.apache.s2graph.core.types._ import org.apache.s2graph.core.utils.{DeferCache, Extensions, logger} import org.apache.tinkerpop.gremlin.process.computer.GraphComputer import org.apache.tinkerpop.gremlin.structure -import org.apache.tinkerpop.gremlin.structure.Graph.Features.EdgeFeatures import org.apache.tinkerpop.gremlin.structure.Graph.{Features, Variables} -import org.apache.tinkerpop.gremlin.structure.util.ElementHelper -import org.apache.tinkerpop.gremlin.structure.{Edge, Element, Graph, Property, T, Transaction, Vertex} +import org.apache.tinkerpop.gremlin.structure.{Edge, Element, Graph, T, Transaction, Vertex} import play.api.libs.json.{JsObject, Json} import scala.annotation.tailrec import scala.collection.JavaConversions._ -import scala.collection.JavaConverters._ import scala.collection.mutable import scala.collection.mutable.{ArrayBuffer, ListBuffer} import scala.concurrent._ @@ -548,22 +545,22 @@ object S2Graph { // passed: all, failed: none new Graph.OptOut(test="org.apache.tinkerpop.gremlin.structure.FeatureSupportTest", method="*", reason="no"), - // passed: , failed: shouldEnableFeatureOnEdgeIfNotEnabled, shouldEnableFeatureOnVertexIfNotEnabled, shouldSupportUserSuppliedIdsOfTypeAny + // passed: all, failed: none + // shouldEnableFeatureOnEdgeIfNotEnabled, shouldEnableFeatureOnVertexIfNotEnabled, shouldSupportUserSuppliedIdsOfTypeAny new Graph.OptOut(test="org.apache.tinkerpop.gremlin.structure.VertexTest$BasicVertexTest", method="shouldHaveExceptionConsistencyWhenAssigningSameIdOnEdge", reason="S2Vertex.addEdge behave as upsert."), // passed: , failed: shouldHaveExceptionConsistencyWhenAssigningSameIdOnEdge - new Graph.OptOut(test="org.apache.tinkerpop.gremlin.structure.util.detached.DetachedEdgeTest", method="*", reason="no"), + new Graph.OptOut(test="org.apache.tinkerpop.gremlin.structure.util.detached.DetachedEdgeTest", method="shouldNotEvaluateToEqualDifferentId", reason="reference equals is not supported."), // passed: all, failed: shouldNotEvaluateToEqualDifferentId - new Graph.OptOut(test="org.apache.tinkerpop.gremlin.structure.util.detached.DetachedVertexTest", method="*", reason="no"), // passed: all, failed: none new Graph.OptOut(test="org.apache.tinkerpop.gremlin.structure.util.detached.DetachedGraphTest", method="*", reason="no"), // passed: all, failed: none, all ignored - new Graph.OptOut(test="org.apache.tinkerpop.gremlin.structure.util.detached.DetachedPropertyTest", method="*", reason="no"), + new Graph.OptOut(test="org.apache.tinkerpop.gremlin.structure.util.detached.DetachedPropertyTest", method="shouldNotBeEqualPropertiesAsThereIsDifferentKey", reason="reference equals is not supported."), // passed: , failed: shouldNotBeEqualPropertiesAsThereIsDifferentKey new Graph.OptOut(test="org.apache.tinkerpop.gremlin.structure.util.detached.DetachedVertexPropertyTest", method="*", reason="no"), @@ -1608,25 +1605,52 @@ class S2Graph(_config: Config)(implicit val ec: ExecutionContext) extends Graph } val kvsMap = S2Property.kvsToProps(kvs) + if (kvsMap.contains(T.label.name()) && kvsMap(T.label.name).toString.isEmpty) throw Element.Exceptions.labelCanNotBeEmpty - val id = kvsMap.getOrElse(T.id.toString, Random.nextLong) - - val serviceColumnNames = kvsMap.getOrElse(T.label.toString, DefaultColumn.columnName).toString - - val names = serviceColumnNames.split(S2Vertex.VertexLabelDelimiter) - val (serviceName, columnName) = - if (names.length == 1) (DefaultService.serviceName, names(0)) - else throw new RuntimeException("malformed data on vertex label.") - - val vertex = toVertex(serviceName, columnName, id, kvsMap) + def validType(t: Any): Boolean = t match { + case t: String => true + case t: java.lang.Integer => true + case t: java.lang.Long => true + case t: scala.Long => true + case t: scala.Int => true + case _ => false + } - val future = mutateVertices(Seq(vertex), withWait = true).map { vs => - if (vs.forall(identity)) vertex - else throw new RuntimeException("addVertex failed.") + val vertex = kvsMap.get(T.id.name()) match { + case None => // do nothing + val id = Random.nextLong + val serviceColumnNames = kvsMap.getOrElse(T.label.toString, DefaultColumn.columnName).toString + + val names = serviceColumnNames.split(S2Vertex.VertexLabelDelimiter) + val (serviceName, columnName) = + if (names.length == 1) (DefaultService.serviceName, names(0)) + else throw new RuntimeException("malformed data on vertex label.") + + toVertex(serviceName, columnName, id, kvsMap) + case Some(idValue) => + idValue match { + case vId: VertexId => + toVertex(vId.column.service.serviceName, vId.column.columnName, vId, kvsMap) + + case _: Any if validType(idValue) => + val serviceColumnNames = kvsMap.getOrElse(T.label.toString, DefaultColumn.columnName).toString + val names = serviceColumnNames.split(S2Vertex.VertexLabelDelimiter) + + val (serviceName, columnName) = + if (names.length == 1) (DefaultService.serviceName, names(0)) + else throw new RuntimeException("malformed data on vertex label.") + + toVertex(serviceName, columnName, idValue, kvsMap) + + case _ => + logger.error(s"[S2Graph.addVertex]: ${idValue.getClass.getName}") + throw Vertex.Exceptions.userSuppliedIdsOfThisTypeNotSupported + } } - Await.result(future, WaitTimeout) + + addVertex(vertex) } def addVertex(id: VertexId, http://git-wip-us.apache.org/repos/asf/incubator-s2graph/blob/b8033e76/s2core/src/main/scala/org/apache/s2graph/core/features/S2DataTypeFeatures.scala ---------------------------------------------------------------------- diff --git a/s2core/src/main/scala/org/apache/s2graph/core/features/S2DataTypeFeatures.scala b/s2core/src/main/scala/org/apache/s2graph/core/features/S2DataTypeFeatures.scala index a94ead3..3db4930 100644 --- a/s2core/src/main/scala/org/apache/s2graph/core/features/S2DataTypeFeatures.scala +++ b/s2core/src/main/scala/org/apache/s2graph/core/features/S2DataTypeFeatures.scala @@ -4,40 +4,42 @@ import org.apache.tinkerpop.gremlin.structure.Graph.Features case class S2DataTypeFeatures() extends Features.DataTypeFeatures { - override def supportsStringValues(): Boolean = true + // primitive types + override def supportsBooleanValues(): Boolean = true - override def supportsFloatValues(): Boolean = true + override def supportsByteValues(): Boolean = false override def supportsDoubleValues(): Boolean = true + override def supportsFloatValues(): Boolean = true + override def supportsIntegerValues(): Boolean = true override def supportsLongValues(): Boolean = true - override def supportsBooleanValues(): Boolean = true - - override def supportsDoubleArrayValues(): Boolean = false + // non-primitive types + override def supportsMapValues(): Boolean = false - override def supportsStringArrayValues(): Boolean = false + override def supportsMixedListValues(): Boolean = false - override def supportsIntegerArrayValues(): Boolean = false + override def supportsBooleanArrayValues(): Boolean = false - override def supportsByteValues(): Boolean = false + override def supportsByteArrayValues(): Boolean = false - override def supportsUniformListValues(): Boolean = false + override def supportsDoubleArrayValues(): Boolean = false - override def supportsMapValues(): Boolean = false + override def supportsFloatArrayValues(): Boolean = false - override def supportsBooleanArrayValues(): Boolean = false + override def supportsIntegerArrayValues(): Boolean = false - override def supportsSerializableValues(): Boolean = false + override def supportsStringArrayValues(): Boolean = false override def supportsLongArrayValues(): Boolean = false - override def supportsMixedListValues(): Boolean = false + override def supportsSerializableValues(): Boolean = true - override def supportsFloatArrayValues(): Boolean = false + override def supportsStringValues(): Boolean = true - override def supportsByteArrayValues(): Boolean = false + override def supportsUniformListValues(): Boolean = false }