- Separate SearchParam from VertexQueryParam.
Project: http://git-wip-us.apache.org/repos/asf/incubator-s2graph/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-s2graph/commit/8e86536a Tree: http://git-wip-us.apache.org/repos/asf/incubator-s2graph/tree/8e86536a Diff: http://git-wip-us.apache.org/repos/asf/incubator-s2graph/diff/8e86536a Branch: refs/heads/master Commit: 8e86536a547dc1fe4c4f3aef29181ac8f2388eed Parents: f47622f Author: DO YUNG YOON <steams...@apache.org> Authored: Fri Jun 15 16:16:46 2018 +0900 Committer: DO YUNG YOON <steams...@apache.org> Committed: Fri Jun 15 16:16:46 2018 +0900 ---------------------------------------------------------------------- .../org/apache/s2graph/core/QueryParam.scala | 11 +++++++---- .../s2graph/core/index/ESIndexProvider.scala | 10 +++++----- .../s2graph/core/index/LuceneIndexProvider.scala | 8 ++++---- .../apache/s2graph/core/rest/RequestParser.scala | 18 +++++++++++++++--- .../s2graph/core/Integrate/VertexTestHelper.scala | 10 +++++++--- .../s2graph/core/index/IndexProviderTest.scala | 2 +- .../s2graph/graphql/types/FieldResolver.scala | 11 +++++++++-- 7 files changed, 48 insertions(+), 22 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-s2graph/blob/8e86536a/s2core/src/main/scala/org/apache/s2graph/core/QueryParam.scala ---------------------------------------------------------------------- diff --git a/s2core/src/main/scala/org/apache/s2graph/core/QueryParam.scala b/s2core/src/main/scala/org/apache/s2graph/core/QueryParam.scala index cb1434f..5fdd3ee 100644 --- a/s2core/src/main/scala/org/apache/s2graph/core/QueryParam.scala +++ b/s2core/src/main/scala/org/apache/s2graph/core/QueryParam.scala @@ -294,17 +294,20 @@ object QueryParam { } object VertexQueryParam { - def Empty: VertexQueryParam = VertexQueryParam(Nil, 0, 1, None) + def Empty: VertexQueryParam = VertexQueryParam(Nil) def apply(vertexIds: Seq[VertexId]): VertexQueryParam = { VertexQueryParam(vertexIds) } } +object SearchParam { + def Empty: SearchParam = SearchParam("", 0, 1) +} +case class SearchParam(searchString: String, offset: Int, limit: Int) + case class VertexQueryParam(vertexIds: Seq[VertexId], - offset: Int = 0, - limit: Int = 1, - searchString: Option[String] = None, + searchParamOpt: Option[SearchParam] = None, fetchProp: Boolean = true, where: Try[Where] = Success(WhereParser.success)) { } http://git-wip-us.apache.org/repos/asf/incubator-s2graph/blob/8e86536a/s2core/src/main/scala/org/apache/s2graph/core/index/ESIndexProvider.scala ---------------------------------------------------------------------- diff --git a/s2core/src/main/scala/org/apache/s2graph/core/index/ESIndexProvider.scala b/s2core/src/main/scala/org/apache/s2graph/core/index/ESIndexProvider.scala index be1ad6e..c047be2 100644 --- a/s2core/src/main/scala/org/apache/s2graph/core/index/ESIndexProvider.scala +++ b/s2core/src/main/scala/org/apache/s2graph/core/index/ESIndexProvider.scala @@ -202,12 +202,12 @@ class ESIndexProvider(config: Config)(implicit ec: ExecutionContext) extends Ind val field = vidField val empty = new util.ArrayList[VertexId]() - vertexQueryParam.searchString match { - case Some(queryString) => + vertexQueryParam.searchParamOpt match { + case Some(searchParam) => fetchInner[VertexId]( - queryString, - vertexQueryParam.offset, - vertexQueryParam.limit, + searchParam.searchString, + searchParam.offset, + searchParam.limit, VertexIndexName, field, Conversions.s2VertexIdReads)(v => VertexId.isValid(v).isDefined) http://git-wip-us.apache.org/repos/asf/incubator-s2graph/blob/8e86536a/s2core/src/main/scala/org/apache/s2graph/core/index/LuceneIndexProvider.scala ---------------------------------------------------------------------- diff --git a/s2core/src/main/scala/org/apache/s2graph/core/index/LuceneIndexProvider.scala b/s2core/src/main/scala/org/apache/s2graph/core/index/LuceneIndexProvider.scala index 00f2e20..efb44f6 100644 --- a/s2core/src/main/scala/org/apache/s2graph/core/index/LuceneIndexProvider.scala +++ b/s2core/src/main/scala/org/apache/s2graph/core/index/LuceneIndexProvider.scala @@ -242,16 +242,16 @@ class LuceneIndexProvider(config: Config) extends IndexProvider { override def fetchVertexIdsAsync(hasContainers: java.util.List[HasContainer]): Future[util.List[VertexId]] = Future.successful(fetchVertexIds(hasContainers)) override def fetchVertexIdsAsyncRaw(vertexQueryParam: VertexQueryParam): Future[util.List[VertexId]] = { - val ret = vertexQueryParam.searchString.fold(util.Arrays.asList[VertexId]()) { queryString => + val ret = vertexQueryParam.searchParamOpt.fold(util.Arrays.asList[VertexId]()) { searchParam => val field = vidField try { val qp = createQueryParser(field, analyzer) - val q = qp.parse(queryString) + val q = qp.parse(searchParam.searchString) - fetchInner[VertexId](q, vertexQueryParam.offset, vertexQueryParam.limit, VertexIndexName, vidField, Conversions.s2VertexIdReads) + fetchInner[VertexId](q, searchParam.offset, searchParam.limit, VertexIndexName, vidField, Conversions.s2VertexIdReads) } catch { case ex: ParseException => - logger.error(s"[IndexProvider]: ${queryString} parse failed.", ex) + logger.error(s"[IndexProvider]: ${searchParam.searchString} parse failed.", ex) util.Arrays.asList[VertexId]() } } http://git-wip-us.apache.org/repos/asf/incubator-s2graph/blob/8e86536a/s2core/src/main/scala/org/apache/s2graph/core/rest/RequestParser.scala ---------------------------------------------------------------------- diff --git a/s2core/src/main/scala/org/apache/s2graph/core/rest/RequestParser.scala b/s2core/src/main/scala/org/apache/s2graph/core/rest/RequestParser.scala index 7f8b280..b71da8e 100644 --- a/s2core/src/main/scala/org/apache/s2graph/core/rest/RequestParser.scala +++ b/s2core/src/main/scala/org/apache/s2graph/core/rest/RequestParser.scala @@ -219,12 +219,16 @@ class RequestParser(graph: S2GraphLike) { ret.map(_.toMap).getOrElse(Map.empty[String, InnerValLike]) } - def extractWhere(label: Label, whereClauseOpt: Option[String]): Try[Where] = { + private def toWhereParserKey(column: ServiceColumn, whereString: String): String = + s"${column.service.serviceName}_${column.columnName}_${whereString}" + + private def toWhereParserKey(label: Label, whereString: String): String = + s"${label.label}_${whereString}" + + private def extractWhereInner(whereParserKey: String, whereClauseOpt: Option[String]): Try[Where] = { whereClauseOpt match { case None => Success(WhereParser.success) case Some(where) => - val whereParserKey = s"${label.label}_${where}" - parserCache.get(whereParserKey, new Callable[Try[Where]] { override def call(): Try[Where] = { val _where = TemplateHelper.replaceVariable(System.currentTimeMillis(), where) @@ -239,6 +243,14 @@ class RequestParser(graph: S2GraphLike) { } } + def extractWhere(column: ServiceColumn, whereClauseOpt: Option[String]): Try[Where] = { + extractWhereInner(toWhereParserKey(column, whereClauseOpt.getOrElse("")), whereClauseOpt) + } + + def extractWhere(label: Label, whereClauseOpt: Option[String]): Try[Where] = { + extractWhereInner(toWhereParserKey(label, whereClauseOpt.getOrElse("")), whereClauseOpt) + } + def extractGroupBy(value: Option[JsValue]): GroupBy = value.map { case obj: JsObject => val keys = (obj \ "keys").asOpt[Seq[String]].getOrElse(Nil) http://git-wip-us.apache.org/repos/asf/incubator-s2graph/blob/8e86536a/s2core/src/test/scala/org/apache/s2graph/core/Integrate/VertexTestHelper.scala ---------------------------------------------------------------------- diff --git a/s2core/src/test/scala/org/apache/s2graph/core/Integrate/VertexTestHelper.scala b/s2core/src/test/scala/org/apache/s2graph/core/Integrate/VertexTestHelper.scala index 62c7e00..c4136ab 100644 --- a/s2core/src/test/scala/org/apache/s2graph/core/Integrate/VertexTestHelper.scala +++ b/s2core/src/test/scala/org/apache/s2graph/core/Integrate/VertexTestHelper.scala @@ -19,7 +19,7 @@ package org.apache.s2graph.core.Integrate -import org.apache.s2graph.core.PostProcess +import org.apache.s2graph.core.{PostProcess, VertexQueryParam} import play.api.libs.json.{JsValue, Json} import scala.concurrent.Await @@ -43,9 +43,11 @@ class VertexTestHelper extends IntegrateCommon { val vertices = parser.toVertices(payload, "insert", Option(serviceName), Option(columnName)) val srcVertices = vertices + val srcVertexIds = srcVertices.map(_.id) + val queryParam = VertexQueryParam(vertexIds = srcVertexIds) Await.result(graph.mutateVertices(srcVertices, withWait = true), HttpRequestWaitingTime) - val res = graph.getVertices(srcVertices).map { vertices => + val res = graph.getVertices(queryParam).map { vertices => PostProcess.verticesToJson(vertices) } @@ -70,9 +72,11 @@ class VertexTestHelper extends IntegrateCommon { val vertices = parser.toVertices(payload, "insert", Option(serviceName), Option(stringColumnName)) val srcVertices = vertices + val srcVertexIds = srcVertices.map(_.id) + val queryParam = VertexQueryParam(vertexIds = srcVertexIds) Await.result(graph.mutateVertices(srcVertices, withWait = true), HttpRequestWaitingTime) - val res = graph.getVertices(srcVertices).map { vertices => + val res = graph.getVertices(queryParam).map { vertices => PostProcess.verticesToJson(vertices) } http://git-wip-us.apache.org/repos/asf/incubator-s2graph/blob/8e86536a/s2core/src/test/scala/org/apache/s2graph/core/index/IndexProviderTest.scala ---------------------------------------------------------------------- diff --git a/s2core/src/test/scala/org/apache/s2graph/core/index/IndexProviderTest.scala b/s2core/src/test/scala/org/apache/s2graph/core/index/IndexProviderTest.scala index c12ad7d..12cec21 100644 --- a/s2core/src/test/scala/org/apache/s2graph/core/index/IndexProviderTest.scala +++ b/s2core/src/test/scala/org/apache/s2graph/core/index/IndexProviderTest.scala @@ -80,7 +80,7 @@ class IndexProviderTest extends IntegrateCommon { // val hasContainer = new HasContainer(indexPropsColumnMeta.name, P.eq(Long.box(1))) val hasContainer = new HasContainer(serviceColumnField, P.eq(testColumn.columnName)) - val f = graph.searchVertices(VertexQueryParam(0, 100, Option(s"${serviceColumnField}:${testColumn.columnName}"))) + val f = graph.searchVertices(VertexQueryParam(Nil, Option(SearchParam(s"${serviceColumnField}:${testColumn.columnName}", 0, 100)))) val a = Await.result(f, Duration("60 sec")) println(a) http://git-wip-us.apache.org/repos/asf/incubator-s2graph/blob/8e86536a/s2graphql/src/main/scala/org/apache/s2graph/graphql/types/FieldResolver.scala ---------------------------------------------------------------------- diff --git a/s2graphql/src/main/scala/org/apache/s2graph/graphql/types/FieldResolver.scala b/s2graphql/src/main/scala/org/apache/s2graph/graphql/types/FieldResolver.scala index 6e1a7cc..43b3de6 100644 --- a/s2graphql/src/main/scala/org/apache/s2graph/graphql/types/FieldResolver.scala +++ b/s2graphql/src/main/scala/org/apache/s2graph/graphql/types/FieldResolver.scala @@ -76,6 +76,8 @@ object FieldResolver { val ids = c.argOpt[Any]("id").toSeq ++ c.argOpt[List[Any]]("ids").toList.flatten val offset = c.arg[Int]("offset") val limit = c.arg[Int]("limit") + val whereClauseOpt = c.argOpt[String]("filter") + val where = c.ctx.parser.extractWhere(column, whereClauseOpt) val vertices = ids.map(vid => c.ctx.toS2VertexLike(vid, column)) val searchOpt = c.argOpt[String]("search").map { qs => @@ -87,7 +89,9 @@ object FieldResolver { val selectedFields = AstHelper.selectedFields(c.astFields) val canSkipFetch = selectedFields.forall(f => f == "id" || !columnFields(f)) - val vertexQueryParam = VertexQueryParam(vertices.map(_.id), offset, limit, searchOpt, !canSkipFetch) + val searchParamOpt = searchOpt.map(search => SearchParam(search, offset, limit)) + val vertexQueryParam = VertexQueryParam(vertices.map(_.id), + searchParamOpt, fetchProp = !canSkipFetch, where = where) vertexQueryParam } @@ -102,7 +106,10 @@ object FieldResolver { val columnFields = column.metasInvMap.keySet val canSkipFetch = selectedFields.forall(f => f == "id" || !columnFields(f)) - val vertexQueryParam = VertexQueryParam(Seq(vertex.id), 0, 1, None, !canSkipFetch) + val whereClauseOpt = c.argOpt[String]("filter") + val where = c.ctx.parser.extractWhere(column, whereClauseOpt) + + val vertexQueryParam = VertexQueryParam(Seq(vertex.id), None, fetchProp = !canSkipFetch, where = where) vertexQueryParam }