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 + } +}
