You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@s2graph.apache.org by da...@apache.org on 2016/01/04 07:40:43 UTC

[10/46] incubator-s2graph git commit: performance tunning for IN clause on where parser

performance tunning for IN clause on where parser


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

Branch: refs/heads/feature/test_daewon
Commit: e974852433ebedb2dcd9e0e6a6da1317f359ae6d
Parents: a6acec7
Author: SteamShon <sh...@gmail.com>
Authored: Tue Dec 22 17:28:47 2015 +0900
Committer: SteamShon <sh...@gmail.com>
Committed: Tue Dec 22 17:28:47 2015 +0900

----------------------------------------------------------------------
 .../s2graph/core/parsers/WhereParser.scala      | 30 ++++++++++++++++----
 .../kakao/s2graph/core/rest/RequestParser.scala |  8 +++---
 2 files changed, 28 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-s2graph/blob/e9748524/s2core/src/main/scala/com/kakao/s2graph/core/parsers/WhereParser.scala
----------------------------------------------------------------------
diff --git a/s2core/src/main/scala/com/kakao/s2graph/core/parsers/WhereParser.scala b/s2core/src/main/scala/com/kakao/s2graph/core/parsers/WhereParser.scala
index 15996ea..2a62b3b 100644
--- a/s2core/src/main/scala/com/kakao/s2graph/core/parsers/WhereParser.scala
+++ b/s2core/src/main/scala/com/kakao/s2graph/core/parsers/WhereParser.scala
@@ -98,15 +98,28 @@ case class Eq(propKey: String, value: String) extends Clause {
   override def filter(edge: Edge): Boolean = binaryOp(_ == _)(propKey, value)(edge)
 }
 
+case class InWithoutParent(label: Label, propKey: String, values: Set[String]) extends Clause {
+  val innerValLikeLs = values.map { value =>
+    val labelMeta = label.metaPropsInvMap.getOrElse(propKey, throw WhereParserException(s"Where clause contains not existing property name: $propKey"))
+    val dataType = propKey match {
+      case "_to" | "to" => label.tgtColumn.columnType
+      case "_from" | "from" => label.srcColumn.columnType
+      case _ => labelMeta.dataType
+    }
+    toInnerVal(value, dataType, label.schemaVersion)
+  }
+  override def filter(edge: Edge): Boolean = {
+    val propVal = propToInnerVal(edge, propKey)
+    innerValLikeLs.contains(propVal)
+  }
+}
+
 case class IN(propKey: String, values: Set[String]) extends Clause {
   override def filter(edge: Edge): Boolean = {
     val propVal = propToInnerVal(edge, propKey)
     values.exists { value =>
       valueToCompare(edge, propKey, value) == propVal
     }
-//    val valuesToCompare = values.map { value => valueToCompare(edge, propKey, value) }
-//
-//    valuesToCompare.contains(propVal)
   }
 }
 
@@ -136,7 +149,7 @@ object WhereParser {
   val success = Where()
 }
 
-case class WhereParser(labelMap: Map[String, Label]) extends JavaTokenParsers with JSONParser {
+case class WhereParser(label: Label) extends JavaTokenParsers with JSONParser {
 
   val anyStr = "[^\\s(),]+".r
 
@@ -174,8 +187,13 @@ case class WhereParser(labelMap: Map[String, Label]) extends JavaTokenParsers wi
       case f ~ minV ~ maxV => Between(f, minV, maxV)
     } | identWithDot ~ (notIn | in) ~ ("(" ~> repsep(anyStr, ",") <~ ")") ^^ {
       case f ~ op ~ values =>
-        if (op.toLowerCase == "in") IN(f, values.toSet)
-        else Not(IN(f, values.toSet))
+        val inClause =
+          if (f.startsWith("_parent")) IN(f, values.toSet)
+          else InWithoutParent(label, f, values.toSet)
+        if (op.toLowerCase == "in") inClause
+        else Not(inClause)
+
+
       case _ => throw WhereParserException(s"Failed to parse where clause. ")
     }
   }

http://git-wip-us.apache.org/repos/asf/incubator-s2graph/blob/e9748524/s2core/src/main/scala/com/kakao/s2graph/core/rest/RequestParser.scala
----------------------------------------------------------------------
diff --git a/s2core/src/main/scala/com/kakao/s2graph/core/rest/RequestParser.scala b/s2core/src/main/scala/com/kakao/s2graph/core/rest/RequestParser.scala
index 96d8f60..f9a6d01 100644
--- a/s2core/src/main/scala/com/kakao/s2graph/core/rest/RequestParser.scala
+++ b/s2core/src/main/scala/com/kakao/s2graph/core/rest/RequestParser.scala
@@ -92,11 +92,11 @@ class RequestParser(config: Config) extends JSONParser {
     ret.map(_.toMap).getOrElse(Map.empty[Byte, InnerValLike])
   }
 
-  def extractWhere(labelMap: Map[String, Label], whereClauseOpt: Option[String]) = {
+  def extractWhere(label: Label, whereClauseOpt: Option[String]) = {
     whereClauseOpt match {
       case None => Success(WhereParser.success)
       case Some(where) =>
-        WhereParser(labelMap).parse(where) match {
+        WhereParser(label).parse(where) match {
           case s@Success(_) => s
           case Failure(ex) => throw BadQueryException(ex.getMessage, ex)
         }
@@ -251,7 +251,7 @@ class RequestParser(config: Config) extends JSONParser {
     }
   }
 
-  private def parseQueryParam(labelMap: Map[String, Label], labelGroup: JsValue): Option[QueryParam] = {
+  private def parseQueryParam(labelGroup: JsValue): Option[QueryParam] = {
     for {
       labelName <- parse[Option[String]](labelGroup, "label")
     } yield {
@@ -280,7 +280,7 @@ class RequestParser(config: Config) extends JSONParser {
         case Some(indexName) => label.indexNameMap.get(indexName).map(_.seq).getOrElse(throw new RuntimeException("cannot find index"))
       }
       val whereClauseOpt = (labelGroup \ "where").asOpt[String]
-      val where = extractWhere(labelMap, whereClauseOpt)
+      val where = extractWhere(label, whereClauseOpt)
       val includeDegree = (labelGroup \ "includeDegree").asOpt[Boolean].getOrElse(true)
       val rpcTimeout = (labelGroup \ "rpcTimeout").asOpt[Int].getOrElse(DefaultRpcTimeout)
       val maxAttempt = (labelGroup \ "maxAttempt").asOpt[Int].getOrElse(DefaultMaxAttempt)