add addPropToServiceColumn

Project: http://git-wip-us.apache.org/repos/asf/incubator-s2graph/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-s2graph/commit/2b5d9190
Tree: http://git-wip-us.apache.org/repos/asf/incubator-s2graph/tree/2b5d9190
Diff: http://git-wip-us.apache.org/repos/asf/incubator-s2graph/diff/2b5d9190

Branch: refs/heads/master
Commit: 2b5d9190b12cd4189c0ba1cbae7d69d06496a018
Parents: eb9bb0f
Author: daewon <[email protected]>
Authored: Mon Mar 5 14:48:33 2018 +0900
Committer: daewon <[email protected]>
Committed: Mon Mar 5 14:48:33 2018 +0900

----------------------------------------------------------------------
 .../s2graph/graphql/marshaller/package.scala    | 34 ++++++--
 .../graphql/repository/GraphRepository.scala    | 43 ++++++++---
 .../graphql/types/S2ManagementType.scala        | 81 ++++++++++++--------
 .../apache/s2graph/graphql/types/S2Type.scala   |  4 +-
 .../apache/s2graph/graphql/types/package.scala  |  3 +-
 .../s2graph/graphql/ArgumentParseTest.scala     | 18 +++++
 6 files changed, 133 insertions(+), 50 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-s2graph/blob/2b5d9190/s2graphql/src/main/scala/org/apache/s2graph/graphql/marshaller/package.scala
----------------------------------------------------------------------
diff --git 
a/s2graphql/src/main/scala/org/apache/s2graph/graphql/marshaller/package.scala 
b/s2graphql/src/main/scala/org/apache/s2graph/graphql/marshaller/package.scala
index cb7f705..7584fc2 100644
--- 
a/s2graphql/src/main/scala/org/apache/s2graph/graphql/marshaller/package.scala
+++ 
b/s2graphql/src/main/scala/org/apache/s2graph/graphql/marshaller/package.scala
@@ -7,6 +7,8 @@ import sangria.marshalling._
 
 package object marshaller {
 
+  def unwrap(map: Map[String, Any]): Map[String, Any] = map.map { case (k, v: 
Some[_]) => k -> v.get }
+
   implicit object IndexFromInput extends FromInput[Index] {
     val marshaller = CoercedScalaResultMarshaller.default
 
@@ -20,22 +22,40 @@ package object marshaller {
     val marshaller = CoercedScalaResultMarshaller.default
 
     def fromResult(node: marshaller.Node) = {
-      val input = node.asInstanceOf[Map[String, String]]
-      Prop(input("name"), input("defaultValue"), input("dataType"))
+      val input = node.asInstanceOf[Map[String, Any]]
+
+      val name = input("name").asInstanceOf[String]
+      val defaultValue = input("defaultValue").asInstanceOf[String]
+      val dataType = input("dataType").asInstanceOf[String]
+      val storeInGlobalIndex = 
input("storeInGlobalIndex").asInstanceOf[Boolean]
+
+      Prop(name, defaultValue, dataType, storeInGlobalIndex)
     }
   }
 
   implicit object PartialServiceColumnFromInput extends 
FromInput[PartialServiceColumn] {
     val marshaller = CoercedScalaResultMarshaller.default
 
+    def fromResult(node: marshaller.Node) = 
PartialServiceColumnsFromInput.fromResult(node).head
+  }
+
+  implicit object PartialServiceColumnsFromInput extends 
FromInput[Vector[PartialServiceColumn]] {
+    val marshaller = CoercedScalaResultMarshaller.default
+
     def fromResult(node: marshaller.Node) = {
-      val input = node.asInstanceOf[Map[String, Any]]
-      val serviceColumns = input.collect { case (serviceName, Some(map: 
Map[String, Any])) =>
-        val columnName = map("columnName").asInstanceOf[String]
-        PartialServiceColumn(serviceName = serviceName, columnName = 
columnName)
+      val input = unwrap(node.asInstanceOf[Map[String, Any]])
+
+      val partialServiceColumns = input.map { case (serviceName, 
serviceColumnMap) =>
+        val innerMap = serviceColumnMap.asInstanceOf[Map[String, Any]]
+        val columnName = innerMap("columnName").asInstanceOf[String]
+        val props = innerMap.get("props").toSeq.flatMap { case v: Vector[_] =>
+          v.map(PropFromInput.fromResult)
+        }
+
+        PartialServiceColumn(serviceName, columnName, props)
       }
 
-      serviceColumns.head
+      partialServiceColumns.toVector
     }
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-s2graph/blob/2b5d9190/s2graphql/src/main/scala/org/apache/s2graph/graphql/repository/GraphRepository.scala
----------------------------------------------------------------------
diff --git 
a/s2graphql/src/main/scala/org/apache/s2graph/graphql/repository/GraphRepository.scala
 
b/s2graphql/src/main/scala/org/apache/s2graph/graphql/repository/GraphRepository.scala
index 5697319..9ec039f 100644
--- 
a/s2graphql/src/main/scala/org/apache/s2graph/graphql/repository/GraphRepository.scala
+++ 
b/s2graphql/src/main/scala/org/apache/s2graph/graphql/repository/GraphRepository.scala
@@ -25,19 +25,22 @@ import org.apache.s2graph.core.mysqls._
 import org.apache.s2graph.core.rest.RequestParser
 import org.apache.s2graph.core.storage.MutateResponse
 import org.apache.s2graph.core.types._
-import org.apache.s2graph.graphql.types.S2ManagementType._
+import org.apache.s2graph.graphql.types.S2ManagementType.PropWithColumn
 import org.apache.s2graph.graphql.types.S2Type._
-import sangria.schema.{Action, Args}
+import sangria.schema._
 
 import scala.concurrent._
 import scala.util.{Failure, Try}
 
+object GraphRepository {
+}
 
 /**
   *
   * @param graph
   */
 class GraphRepository(val graph: S2GraphLike) {
+
   val management = graph.management
   val parser = new RequestParser(graph)
 
@@ -85,9 +88,9 @@ class GraphRepository(val graph: S2GraphLike) {
       val innerMap = args.arg[Map[String, 
Vector[PartialVertexParam]]](serviceName)
 
       innerMap.flatMap { case (columnName, params) =>
-          params.map { param =>
-            partialVertexParamToS2Vertex(serviceName, columnName, param)
-          }
+        params.map { param =>
+          partialVertexParamToS2Vertex(serviceName, columnName, param)
+        }
       }
     }
     graph.mutateVertices(vertices, withWait = true)
@@ -113,7 +116,7 @@ class GraphRepository(val graph: S2GraphLike) {
 
   def getVertex(vertex: S2VertexLike): Future[Seq[S2VertexLike]] = {
     val f = graph.getVertices(Seq(vertex))
-    f.foreach{ a =>
+    f.foreach { a =>
       println(a)
     }
     f
@@ -158,13 +161,14 @@ class GraphRepository(val graph: S2GraphLike) {
     val columnType = args.arg[String]("columnType")
     val props = args.argOpt[Vector[Prop]]("props").getOrElse(Vector.empty)
 
-    Try { management.createServiceColumn(serviceName, columnName, columnType, 
props) }
+    Try {
+      management.createServiceColumn(serviceName, columnName, columnType, 
props)
+    }
   }
 
   def deleteServiceColumn(args: Args): List[Try[ServiceColumn]] = {
-    println(args)
-    //Args(Map(s2graph -> Some(Map(columnName -> 
_))),Set(),Set(s2graph),Set(),TrieMap())
-    val serviceColumns = args.raw.collect { case (serviceName, Some(map: 
Map[String, Any])) =>
+    // Args(Map(s2graph -> Some(Map(columnName -> 
_))),Set(),Set(s2graph),Set(),TrieMap())
+    val serviceColumns = args.raw.collect { case (serviceName, Some(map: 
Map[String, _])) =>
       val columnName = map("columnName").asInstanceOf[String]
       Management.deleteColumn(serviceName, columnName)
     }
@@ -172,6 +176,25 @@ class GraphRepository(val graph: S2GraphLike) {
     serviceColumns.toList
   }
 
+  def addPropsOnServiceColumn(args: Args): List[Try[ServiceColumn]] = {
+    val partialColumns = args.arg[Vector[PartialServiceColumn]]("serviceName")
+
+    val ret = partialColumns.map { pc =>
+      val serviceName = pc.serviceName
+      val columnName = pc.columnName
+      Try {
+        pc.props.foreach { prop =>
+          Management.addVertexProp(serviceName, columnName, prop.name, 
prop.dataType, prop.defaultValue, prop.storeInGlobalIndex)
+        }
+
+        val src = Service.findByName(serviceName)
+        ServiceColumn.find(src.get.id.get, columnName, false).get
+      }
+    }
+
+    ret.toList
+  }
+
   def createLabel(args: Args): Try[Label] = {
     val labelName = args.arg[String]("name")
 

http://git-wip-us.apache.org/repos/asf/incubator-s2graph/blob/2b5d9190/s2graphql/src/main/scala/org/apache/s2graph/graphql/types/S2ManagementType.scala
----------------------------------------------------------------------
diff --git 
a/s2graphql/src/main/scala/org/apache/s2graph/graphql/types/S2ManagementType.scala
 
b/s2graphql/src/main/scala/org/apache/s2graph/graphql/types/S2ManagementType.scala
index 67a4b30..9c00153 100644
--- 
a/s2graphql/src/main/scala/org/apache/s2graph/graphql/types/S2ManagementType.scala
+++ 
b/s2graphql/src/main/scala/org/apache/s2graph/graphql/types/S2ManagementType.scala
@@ -38,6 +38,8 @@ object S2ManagementType {
 
   import sangria.schema._
 
+  case class PropWithColumn(name: String, Props: Vector[Prop])
+
   case class MutationResponse[T](result: Try[T])
 
   def makeMutationResponseType[T](name: String, desc: String, tpe: 
ObjectType[_, T]) = {
@@ -56,7 +58,7 @@ object S2ManagementType {
             case Failure(ex) => ex.getMessage
           }
         ),
-        Field("response",
+        Field("object",
           OptionType(tpe),
           resolve = _.value.result.toOption
         )
@@ -71,37 +73,24 @@ class S2ManagementType(repo: GraphRepository) {
 
   import sangria.macros.derive._
 
-  val NameArg = Argument("name", StringType, description = "desc here")
-
-  lazy val ServiceNameArg = Argument("name", OptionInputType(ServiceListType), 
description = "desc here")
-
-  lazy val ServiceNameRawArg = Argument("serviceName", ServiceListType, 
description = "desc here")
-
-  lazy val ColumnNameArg = Argument("columnName", 
OptionInputType(ServiceColumnListType), description = "desc here")
-
-  lazy val ColumnTypeArg = Argument("columnType", DataTypeType, description = 
"desc here")
-
-  lazy val LabelNameArg = Argument("name", OptionInputType(LabelListType), 
description = "desc here")
-
-  lazy val PropArg = Argument("props", 
OptionInputType(ListInputType(InputPropType)), description = "desc here")
-
-  lazy val IndicesArg = Argument("indices", 
OptionInputType(ListInputType(InputIndexType)), description = "desc here")
-
-  lazy val ServiceColumnOnServiceArgs = repo.allServices.map { service =>
-    lazy val ServiceColumnOnServiceType = InputObjectType(
-      "columnName",
+  lazy val serviceColumnOnServiceWithPropInputObjectFields = 
repo.allServices.map { service =>
+    InputField(service.serviceName, OptionInputType(InputObjectType(
+      s"columnWithProp",
       description = "desc here",
-      fields = List(InputField("columnName", 
makeServiceColumnEnumTypeOnService(service)))
-    )
-
-    Argument(service.serviceName, OptionInputType(ServiceColumnOnServiceType))
+      fields = List(
+        InputField("columnName", makeServiceColumnEnumTypeOnService(service)),
+        InputField("props", ListInputType(InputPropType))
+      )
+    )))
   }
 
-  lazy val ServiceColumnOnServiceInputObjectType = repo.allServices.map { 
service =>
+  lazy val serviceColumnOnServiceInputObjectFields = repo.allServices.map { 
service =>
     InputField(service.serviceName, OptionInputType(InputObjectType(
-      "columnName",
+      s"column",
       description = "desc here",
-      fields = List(InputField("columnName", 
makeServiceColumnEnumTypeOnService(service)))
+      fields = List(
+        InputField("columnName", makeServiceColumnEnumTypeOnService(service))
+      )
     )))
   }
 
@@ -216,16 +205,28 @@ class S2ManagementType(repo: GraphRepository) {
     "hTableTTL" -> IntType
   ).map { case (name, _type) => Argument(name, OptionInputType(_type)) }
 
+  val AddPropServiceType = InputObjectType[Vector[PartialServiceColumn]](
+    "serviceName",
+    description = "desc",
+    fields = serviceColumnOnServiceWithPropInputObjectFields
+  )
+
+  val ServiceColumnSelectType = InputObjectType[PartialServiceColumn](
+    "serviceColumnSelect",
+    description = "desc",
+    fields = serviceColumnOnServiceInputObjectFields
+  )
+
   val SourceServiceType = InputObjectType[PartialServiceColumn](
     "sourceService",
     description = "desc",
-    fields = ServiceColumnOnServiceInputObjectType
+    fields = serviceColumnOnServiceInputObjectFields
   )
 
   val TargetServiceType = InputObjectType[PartialServiceColumn](
     "sourceService",
     description = "desc",
-    fields = ServiceColumnOnServiceInputObjectType
+    fields = serviceColumnOnServiceInputObjectFields
   )
 
   lazy val labelRequiredArg = List(
@@ -270,6 +271,21 @@ class S2ManagementType(repo: GraphRepository) {
     * - ...
     */
 
+  val NameArg = Argument("name", StringType, description = "desc here")
+
+  lazy val ServiceNameArg = Argument("name", OptionInputType(ServiceListType), 
description = "desc here")
+
+  lazy val ServiceNameRawArg = Argument("serviceName", ServiceListType, 
description = "desc here")
+
+  lazy val ColumnNameArg = Argument("columnName", 
OptionInputType(ServiceColumnListType), description = "desc here")
+
+  lazy val ColumnTypeArg = Argument("columnType", DataTypeType, description = 
"desc here")
+
+  lazy val LabelNameArg = Argument("name", OptionInputType(LabelListType), 
description = "desc here")
+
+  lazy val PropArg = Argument("props", 
OptionInputType(ListInputType(InputPropType)), description = "desc here")
+
+  lazy val IndicesArg = Argument("indices", 
OptionInputType(ListInputType(InputIndexType)), description = "desc here")
 
   lazy val mutationFields: List[Field[GraphRepository, Any]] = List(
     Field("createService",
@@ -282,9 +298,14 @@ class S2ManagementType(repo: GraphRepository) {
       arguments = List(ServiceNameRawArg, Argument("columnName", StringType), 
ColumnTypeArg, PropArg),
       resolve = c => MutationResponse(c.ctx.createServiceColumn(c.args))
     ),
+    Field("addPropsToServiceColumn",
+      ListType(ServiceColumnMutationResponseType),
+      arguments = Argument("serviceName", AddPropServiceType) :: Nil,
+      resolve = c => c.ctx.addPropsOnServiceColumn(c.args) map 
(MutationResponse(_))
+    ),
     Field("deleteServiceColumn",
       ListType(ServiceColumnMutationResponseType),
-      arguments = ServiceColumnOnServiceArgs,
+      arguments = Argument("serviceName", ServiceColumnSelectType) :: Nil,
       resolve = c => c.ctx.deleteServiceColumn(c.args).map(MutationResponse(_))
     ),
     Field("createLabel",

http://git-wip-us.apache.org/repos/asf/incubator-s2graph/blob/2b5d9190/s2graphql/src/main/scala/org/apache/s2graph/graphql/types/S2Type.scala
----------------------------------------------------------------------
diff --git 
a/s2graphql/src/main/scala/org/apache/s2graph/graphql/types/S2Type.scala 
b/s2graphql/src/main/scala/org/apache/s2graph/graphql/types/S2Type.scala
index 23874e1..605cdd3 100644
--- a/s2graphql/src/main/scala/org/apache/s2graph/graphql/types/S2Type.scala
+++ b/s2graphql/src/main/scala/org/apache/s2graph/graphql/types/S2Type.scala
@@ -35,9 +35,9 @@ import scala.util.{Failure, Success, Try}
 import org.apache.s2graph.graphql.marshaller._
 
 object S2Type {
-
   case class PartialServiceColumn(serviceName: String,
-                                  columnName: String)
+                                  columnName: String,
+                                  props: Seq[Prop] = Nil)
 
   case class PartialServiceParam(service: Service,
                                  vid: Any)

http://git-wip-us.apache.org/repos/asf/incubator-s2graph/blob/2b5d9190/s2graphql/src/main/scala/org/apache/s2graph/graphql/types/package.scala
----------------------------------------------------------------------
diff --git 
a/s2graphql/src/main/scala/org/apache/s2graph/graphql/types/package.scala 
b/s2graphql/src/main/scala/org/apache/s2graph/graphql/types/package.scala
index 46b3114..6f3e2ec 100644
--- a/s2graphql/src/main/scala/org/apache/s2graph/graphql/types/package.scala
+++ b/s2graphql/src/main/scala/org/apache/s2graph/graphql/types/package.scala
@@ -103,7 +103,8 @@ package object types {
     fields = List(
       InputField("name", StringType),
       InputField("dataType", DataTypeType),
-      InputField("defaultValue", StringType)
+      InputField("defaultValue", StringType),
+      InputField("storeInGlobalIndex", BooleanType)
     )
   )
 

http://git-wip-us.apache.org/repos/asf/incubator-s2graph/blob/2b5d9190/s2graphql/src/test/scala/org/apache/s2graph/graphql/ArgumentParseTest.scala
----------------------------------------------------------------------
diff --git 
a/s2graphql/src/test/scala/org/apache/s2graph/graphql/ArgumentParseTest.scala 
b/s2graphql/src/test/scala/org/apache/s2graph/graphql/ArgumentParseTest.scala
new file mode 100644
index 0000000..a1c076a
--- /dev/null
+++ 
b/s2graphql/src/test/scala/org/apache/s2graph/graphql/ArgumentParseTest.scala
@@ -0,0 +1,18 @@
+package org.apache.s2graph.graphql
+
+import org.scalatest.{FunSuite, Matchers}
+import play.api.libs.json.{JsObject, JsString, Json}
+import sangria.ast.Document
+
+import scala.concurrent.Await
+import scala.concurrent.duration._
+import scala.concurrent.ExecutionContext.Implicits.global
+import sangria.macros._
+import sangria.execution.Executor
+import sangria.execution.deferred.DeferredResolver
+
+class ArgumentParseTest extends FunSuite with Matchers {
+  test("parseAddPropsToServiceColumn") {
+    true
+  }
+}

Reply via email to