{"action":"created","comment":{"url":"https://api.github.com/repos/ISG-ICS/cloudberry/pulls/comments/71416187","id":71416187,"diff_hunk":"@@ -0,0 +1,171 @@\n+package edu.uci.ics.cloudberry.zion.model.impl\n+\n+import edu.uci.ics.cloudberry.zion.model.datastore.QueryParsingException\n+import edu.uci.ics.cloudberry.zion.model.schema.Relation.Relation\n+import edu.uci.ics.cloudberry.zion.model.schema._\n+import org.joda.time.format.DateTimeFormat\n+\n+import scala.reflect.runtime.universe.{TypeTag, typeOf}\n+\n+object AQLFuncVisitor {\n+\n+  val TimeFormat = DateTimeFormat.forPattern(\"yyyy-MM-dd'T'HH:mm:ss'Z'\")\n+\n+  def isAnyVal[T: TypeTag](t: T): Boolean = {\n+    implicitly[TypeTag[T]].tpe <:< typeOf[AnyVal]\n+  }\n+\n+  def translateRelation(field: Field,\n+                        funcOpt: Option[TransformFunc],\n+                        sourceVar: String,\n+                        relation: Relation,\n+                        values: Seq[Any]\n+                       ): String = {\n+    //TODO add the functions\n+    if (!Schema.Type2Relations.get(field.dataType).get.contains(relation)) {\n+      throw QueryParsingException(s\"field ${field.name} of type ${field.dataType} can not apply to relation: ${relation}\")\n+    }\n+    field.dataType match {\n+      case DataType.Number =>\n+        if (!values.forall(isAnyVal)) {\n+          throw QueryParsingException(s\"values contain non compatible data type for relation: ${relation}\")\n+        }\n+        translateNumberRelation(field, funcOpt, sourceVar, relation, values.map(_.asInstanceOf[AnyVal]))\n+      case DataType.Time =>\n+        //required string format : http://www.joda.org/joda-time/apidocs/org/joda/time/format/DateTimeFormat.html\n+        try {\n+          if (!values.forall(_.isInstanceOf[String])) {\n+            throw new IllegalArgumentException\n+          }\n+          // This parseDateTime will throw an exception if the format is invalid\n+          values.foreach(t => TimeFormat.parseDateTime(t.asInstanceOf[String]))\n+        } catch {\n+          case ex: IllegalArgumentException => throw QueryParsingException(\"invalid time format\")\n+        }\n+        translateTimeRelation(field, funcOpt, sourceVar, relation, values.map(_.asInstanceOf[String]))\n+      case DataType.Point =>\n+        //TODO support circle and polygon\n+        if (!values.forall(_.isInstanceOf[Seq[Number]]) || values.size != 2\n+          || values.map(_.asInstanceOf[Seq[Number]]).forall(_.size != 2)) {\n+          throw QueryParsingException(s\"the ${relation} on point type requires a pair of value pairs\")\n+        }\n+        translatePointRelation(field, funcOpt, sourceVar, relation, values.map(_.asInstanceOf[Seq[Number]].map(_.doubleValue())))\n+      case DataType.Boolean => ???\n+      case DataType.String => ???\n+      case DataType.Text =>\n+        if (!values.forall(_.isInstanceOf[String])) {\n+          throw QueryParsingException(s\"the ${relation} on text type requires string parameters\")\n+        }\n+        translateTextRelation(field, funcOpt, sourceVar, relation, values.map(_.asInstanceOf[String]))\n+      case DataType.Bag => ???\n+      case DataType.Hierarchy => ???\n+      case _ => throw QueryParsingException(s\"unknown datatype: ${field.dataType}\")\n+    }\n+  }\n+\n+  private def translateNumberRelation(field: Field,\n+                                      funcOpt: Option[TransformFunc],\n+                                      sourceVar: String,\n+                                      relation: Relation,\n+                                      values: Seq[AnyVal]): String = {\n+    relation match {\n+      case Relation.inRange => {\n+        if (values.size != 2) throw QueryParsingException(s\"relation: ${relation} require two parameters\")\n+        return s\"$sourceVar.${field.name} >= ${values(0)} and $sourceVar.${field.name} < ${values(1)}\"\n+      }\n+      case Relation.in => {\n+        val setVar = s\"${sourceVar}s\"\n+        val ret =\n+          s\"\"\"|for $setVar in [ ${values.mkString(\",\")} ]\n+              |where $sourceVar.${field.name} = $setVar\n+              |\"\"\".stripMargin\n+        return ret\n+      }\n+      case _ => {\n+        if (values.size != 1) throw QueryParsingException(s\"relation: ${relation} require one parameter\")\n+        return s\"$sourceVar.${field.name} $relation ${values.head}\"\n+      }\n+    }\n+  }\n+\n+  private def translateTimeRelation(field: Field,\n+                                    funcOpt: Option[TransformFunc],\n+                                    sourceVar: String,\n+                                    relation: Relation,\n+                                    values: Seq[String]): String = {\n+    relation match {\n+      case Relation.inRange => {\n+        if (values.size != 2) throw QueryParsingException(s\"relation: ${relation} require two parameters\")\n+        return s\"$sourceVar.${field.name} >= datetime('${values(0)}') and $sourceVar.${field.name} < datetime('${values(1)}')\"\n+      }\n+      case _ => {\n+        if (values.size != 1) throw QueryParsingException(s\"relation: ${relation} require one parameter\")\n+        s\"$sourceVar.${field.name} $relation datetime('${values.head}')\"\n+      }\n+    }\n+  }\n+\n+  private def translatePointRelation(field: Field,\n+                                     funcOpt: Option[TransformFunc],\n+                                     sourceVar: String,\n+                                     relation: Relation,\n+                                     values: Seq[Seq[Double]]): String = {\n+    relation match {\n+      case Relation.inRange => {\n+        s\"\"\"\n+           |spatial-intersect($sourceVar.${field.name},\n+           |  create-rectangle(create-point(${values(0)(0)},${values(0)(1)}),\n+           |  create-point(${values(1)(0)},${values(1)(1)})))\n+           |\"\"\".stripMargin\n+      }\n+      case _ => throw QueryParsingException(s\"point type doesn't support relation $relation\")\n+    }\n+  }\n+\n+  private def translateTextRelation(field: Field,\n+                                    funcOpt: Option[TransformFunc],\n+                                    sourceVar: String,\n+                                    relation: Relation,\n+                                    values: Seq[String]): String = {\n+    val first =s\"\"\"similarity-jaccard(word-tokens($sourceVar.'${field.name}'), word-tokens(\"${values.head}\")) > 0.0\"\"\"\n+    val rest = values.tail.map(\n+      keyword => s\"\"\"and contains($sourceVar.'${field.name}', \"$keyword\")\"\"\"\n+    )\n+    (first +: rest).mkString(\"\\n\")\n+  }\n+\n+  def translateGroupFunc(field: Field,\n+                         funcOpt: Option[GroupFunc],\n+                         sourceVar: String\n+                        ): String = {\n+    funcOpt.map { func =>\n+      IFunction.verifyField(func, field).map { msg => throw QueryParsingException(msg) }\n+      func match {\n+        case bin: Bin => ???\n+        case interval: Interval =>\n+          import TimeUnit._\n+          //PnYnMnDTnHnMn.mmmS\n+          val duration = interval.unit match {\n+            case Second => s\"\"\" day-time-duration(\"PT${interval.x}S\") \"\"\"","path":"zion/src/main/scala/edu/uci/ics/cloudberry/zion/model/impl/AQLFuncVisitor.scala","position":149,"original_position":149,"commit_id":"f35daf9f18b08d32ee5b115f616f1948811ce389","original_commit_id":"f35daf9f18b08d32ee5b115f616f1948811ce389","user":{"login":"JavierJia","id":910229,"avatar_url":"https://avatars.githubusercontent.com/u/910229?v=3","gravatar_id":"","url":"https://api.github.com/users/JavierJia","html_url":"https://github.com/JavierJia","followers_url":"https://api.github.com/users/JavierJia/followers","following_url":"https://api.github.com/users/JavierJia/following{/other_user}","gists_url":"https://api.github.com/users/JavierJia/gists{/gist_id}","starred_url":"https://api.github.com/users/JavierJia/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/JavierJia/subscriptions","organizations_url":"https://api.github.com/users/JavierJia/orgs","repos_url":"https://api.github.com/users/JavierJia/repos","events_url":"https://api.github.com/users/JavierJia/events{/privacy}","received_events_url":"https://api.github.com/users/JavierJia/received_events","type":"User","site_admin":false},"body":"unify the function?","created_at":"2016-07-19T20:24:48Z","updated_at":"2016-07-19T20:24:48Z","html_url":"https://github.com/ISG-ICS/cloudberry/pull/140#discussion_r71416187","pull_request_url":"https://api.github.com/repos/ISG-ICS/cloudberry/pulls/140","_links":{"self":{"href":"https://api.github.com/repos/ISG-ICS/cloudberry/pulls/comments/71416187"},"html":{"href":"https://github.com/ISG-ICS/cloudberry/pull/140#discussion_r71416187"},"pull_request":{"href":"https://api.github.com/repos/ISG-ICS/cloudberry/pulls/140"}}},"pull_request":{"url":"https://api.github.com/repos/ISG-ICS/cloudberry/pulls/140","id":77940815,"html_url":"https://github.com/ISG-ICS/cloudberry/pull/140","diff_url":"https://github.com/ISG-ICS/cloudberry/pull/140.diff","patch_url":"https://github.com/ISG-ICS/cloudberry/pull/140.patch","issue_url":"https://api.github.com/repos/ISG-ICS/cloudberry/issues/140","number":140,"state":"open","locked":false,"title":"Aql parser","user":{"login":"JavierJia","id":910229,"avatar_url":"https://avatars.githubusercontent.com/u/910229?v=3","gravatar_id":"","url":"https://api.github.com/users/JavierJia","html_url":"https://github.com/JavierJia","followers_url":"https://api.github.com/users/JavierJia/followers","following_url":"https://api.github.com/users/JavierJia/following{/other_user}","gists_url":"https://api.github.com/users/JavierJia/gists{/gist_id}","starred_url":"https://api.github.com/users/JavierJia/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/JavierJia/subscriptions","organizations_url":"https://api.github.com/users/JavierJia/orgs","repos_url":"https://api.github.com/users/JavierJia/repos","events_url":"https://api.github.com/users/JavierJia/events{/privacy}","received_events_url":"https://api.github.com/users/JavierJia/received_events","type":"User","site_admin":false},"body":"Implement a preliminary query parser. Most of the implementations are still not implemented. Just tried a simple query to make a POC test and verify those interfaces.\r\n\r\n#30 \r\n@MoniMoledo @aishwaryakapse \r\n","created_at":"2016-07-19T09:03:29Z","updated_at":"2016-07-19T20:24:48Z","closed_at":null,"merged_at":null,"merge_commit_sha":"33c662125202d97430b39a05693099a5cab295a4","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/ISG-ICS/cloudberry/pulls/140/commits","review_comments_url":"https://api.github.com/repos/ISG-ICS/cloudberry/pulls/140/comments","review_comment_url":"https://api.github.com/repos/ISG-ICS/cloudberry/pulls/comments{/number}","comments_url":"https://api.github.com/repos/ISG-ICS/cloudberry/issues/140/comments","statuses_url":"https://api.github.com/repos/ISG-ICS/cloudberry/statuses/f35daf9f18b08d32ee5b115f616f1948811ce389","head":{"label":"JavierJia:aql-parser","ref":"aql-parser","sha":"f35daf9f18b08d32ee5b115f616f1948811ce389","user":{"login":"JavierJia","id":910229,"avatar_url":"https://avatars.githubusercontent.com/u/910229?v=3","gravatar_id":"","url":"https://api.github.com/users/JavierJia","html_url":"https://github.com/JavierJia","followers_url":"https://api.github.com/users/JavierJia/followers","following_url":"https://api.github.com/users/JavierJia/following{/other_user}","gists_url":"https://api.github.com/users/JavierJia/gists{/gist_id}","starred_url":"https://api.github.com/users/JavierJia/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/JavierJia/subscriptions","organizations_url":"https://api.github.com/users/JavierJia/orgs","repos_url":"https://api.github.com/users/JavierJia/repos","events_url":"https://api.github.com/users/JavierJia/events{/privacy}","received_events_url":"https://api.github.com/users/JavierJia/received_events","type":"User","site_admin":false},"repo":{"id":60398921,"name":"cloudberry","full_name":"JavierJia/cloudberry","owner":{"login":"JavierJia","id":910229,"avatar_url":"https://avatars.githubusercontent.com/u/910229?v=3","gravatar_id":"","url":"https://api.github.com/users/JavierJia","html_url":"https://github.com/JavierJia","followers_url":"https://api.github.com/users/JavierJia/followers","following_url":"https://api.github.com/users/JavierJia/following{/other_user}","gists_url":"https://api.github.com/users/JavierJia/gists{/gist_id}","starred_url":"https://api.github.com/users/JavierJia/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/JavierJia/subscriptions","organizations_url":"https://api.github.com/users/JavierJia/orgs","repos_url":"https://api.github.com/users/JavierJia/repos","events_url":"https://api.github.com/users/JavierJia/events{/privacy}","received_events_url":"https://api.github.com/users/JavierJia/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/JavierJia/cloudberry","description":"Interactive Twitter map analytic application","fork":true,"url":"https://api.github.com/repos/JavierJia/cloudberry","forks_url":"https://api.github.com/repos/JavierJia/cloudberry/forks","keys_url":"https://api.github.com/repos/JavierJia/cloudberry/keys{/key_id}","collaborators_url":"https://api.github.com/repos/JavierJia/cloudberry/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/JavierJia/cloudberry/teams","hooks_url":"https://api.github.com/repos/JavierJia/cloudberry/hooks","issue_events_url":"https://api.github.com/repos/JavierJia/cloudberry/issues/events{/number}","events_url":"https://api.github.com/repos/JavierJia/cloudberry/events","assignees_url":"https://api.github.com/repos/JavierJia/cloudberry/assignees{/user}","branches_url":"https://api.github.com/repos/JavierJia/cloudberry/branches{/branch}","tags_url":"https://api.github.com/repos/JavierJia/cloudberry/tags","blobs_url":"https://api.github.com/repos/JavierJia/cloudberry/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/JavierJia/cloudberry/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/JavierJia/cloudberry/git/refs{/sha}","trees_url":"https://api.github.com/repos/JavierJia/cloudberry/git/trees{/sha}","statuses_url":"https://api.github.com/repos/JavierJia/cloudberry/statuses/{sha}","languages_url":"https://api.github.com/repos/JavierJia/cloudberry/languages","stargazers_url":"https://api.github.com/repos/JavierJia/cloudberry/stargazers","contributors_url":"https://api.github.com/repos/JavierJia/cloudberry/contributors","subscribers_url":"https://api.github.com/repos/JavierJia/cloudberry/subscribers","subscription_url":"https://api.github.com/repos/JavierJia/cloudberry/subscription","commits_url":"https://api.github.com/repos/JavierJia/cloudberry/commits{/sha}","git_commits_url":"https://api.github.com/repos/JavierJia/cloudberry/git/commits{/sha}","comments_url":"https://api.github.com/repos/JavierJia/cloudberry/comments{/number}","issue_comment_url":"https://api.github.com/repos/JavierJia/cloudberry/issues/comments{/number}","contents_url":"https://api.github.com/repos/JavierJia/cloudberry/contents/{+path}","compare_url":"https://api.github.com/repos/JavierJia/cloudberry/compare/{base}...{head}","merges_url":"https://api.github.com/repos/JavierJia/cloudberry/merges","archive_url":"https://api.github.com/repos/JavierJia/cloudberry/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/JavierJia/cloudberry/downloads","issues_url":"https://api.github.com/repos/JavierJia/cloudberry/issues{/number}","pulls_url":"https://api.github.com/repos/JavierJia/cloudberry/pulls{/number}","milestones_url":"https://api.github.com/repos/JavierJia/cloudberry/milestones{/number}","notifications_url":"https://api.github.com/repos/JavierJia/cloudberry/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/JavierJia/cloudberry/labels{/name}","releases_url":"https://api.github.com/repos/JavierJia/cloudberry/releases{/id}","deployments_url":"https://api.github.com/repos/JavierJia/cloudberry/deployments","created_at":"2016-06-04T07:36:03Z","updated_at":"2016-06-04T07:36:06Z","pushed_at":"2016-07-19T17:13:15Z","git_url":"git://github.com/JavierJia/cloudberry.git","ssh_url":"git@github.com:JavierJia/cloudberry.git","clone_url":"https://github.com/JavierJia/cloudberry.git","svn_url":"https://github.com/JavierJia/cloudberry","homepage":"http://cloudberry.ics.uci.edu","size":88944,"stargazers_count":0,"watchers_count":0,"language":"Scala","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"ISG-ICS:master","ref":"master","sha":"db9a9301c37e1fef6670d3bd6f9031ed926b5a57","user":{"login":"ISG-ICS","id":17169982,"avatar_url":"https://avatars.githubusercontent.com/u/17169982?v=3","gravatar_id":"","url":"https://api.github.com/users/ISG-ICS","html_url":"https://github.com/ISG-ICS","followers_url":"https://api.github.com/users/ISG-ICS/followers","following_url":"https://api.github.com/users/ISG-ICS/following{/other_user}","gists_url":"https://api.github.com/users/ISG-ICS/gists{/gist_id}","starred_url":"https://api.github.com/users/ISG-ICS/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ISG-ICS/subscriptions","organizations_url":"https://api.github.com/users/ISG-ICS/orgs","repos_url":"https://api.github.com/users/ISG-ICS/repos","events_url":"https://api.github.com/users/ISG-ICS/events{/privacy}","received_events_url":"https://api.github.com/users/ISG-ICS/received_events","type":"Organization","site_admin":false},"repo":{"id":46375119,"name":"cloudberry","full_name":"ISG-ICS/cloudberry","owner":{"login":"ISG-ICS","id":17169982,"avatar_url":"https://avatars.githubusercontent.com/u/17169982?v=3","gravatar_id":"","url":"https://api.github.com/users/ISG-ICS","html_url":"https://github.com/ISG-ICS","followers_url":"https://api.github.com/users/ISG-ICS/followers","following_url":"https://api.github.com/users/ISG-ICS/following{/other_user}","gists_url":"https://api.github.com/users/ISG-ICS/gists{/gist_id}","starred_url":"https://api.github.com/users/ISG-ICS/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ISG-ICS/subscriptions","organizations_url":"https://api.github.com/users/ISG-ICS/orgs","repos_url":"https://api.github.com/users/ISG-ICS/repos","events_url":"https://api.github.com/users/ISG-ICS/events{/privacy}","received_events_url":"https://api.github.com/users/ISG-ICS/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/ISG-ICS/cloudberry","description":"Interactive Twitter map analytic application","fork":false,"url":"https://api.github.com/repos/ISG-ICS/cloudberry","forks_url":"https://api.github.com/repos/ISG-ICS/cloudberry/forks","keys_url":"https://api.github.com/repos/ISG-ICS/cloudberry/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ISG-ICS/cloudberry/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ISG-ICS/cloudberry/teams","hooks_url":"https://api.github.com/repos/ISG-ICS/cloudberry/hooks","issue_events_url":"https://api.github.com/repos/ISG-ICS/cloudberry/issues/events{/number}","events_url":"https://api.github.com/repos/ISG-ICS/cloudberry/events","assignees_url":"https://api.github.com/repos/ISG-ICS/cloudberry/assignees{/user}","branches_url":"https://api.github.com/repos/ISG-ICS/cloudberry/branches{/branch}","tags_url":"https://api.github.com/repos/ISG-ICS/cloudberry/tags","blobs_url":"https://api.github.com/repos/ISG-ICS/cloudberry/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ISG-ICS/cloudberry/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ISG-ICS/cloudberry/git/refs{/sha}","trees_url":"https://api.github.com/repos/ISG-ICS/cloudberry/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ISG-ICS/cloudberry/statuses/{sha}","languages_url":"https://api.github.com/repos/ISG-ICS/cloudberry/languages","stargazers_url":"https://api.github.com/repos/ISG-ICS/cloudberry/stargazers","contributors_url":"https://api.github.com/repos/ISG-ICS/cloudberry/contributors","subscribers_url":"https://api.github.com/repos/ISG-ICS/cloudberry/subscribers","subscription_url":"https://api.github.com/repos/ISG-ICS/cloudberry/subscription","commits_url":"https://api.github.com/repos/ISG-ICS/cloudberry/commits{/sha}","git_commits_url":"https://api.github.com/repos/ISG-ICS/cloudberry/git/commits{/sha}","comments_url":"https://api.github.com/repos/ISG-ICS/cloudberry/comments{/number}","issue_comment_url":"https://api.github.com/repos/ISG-ICS/cloudberry/issues/comments{/number}","contents_url":"https://api.github.com/repos/ISG-ICS/cloudberry/contents/{+path}","compare_url":"https://api.github.com/repos/ISG-ICS/cloudberry/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ISG-ICS/cloudberry/merges","archive_url":"https://api.github.com/repos/ISG-ICS/cloudberry/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ISG-ICS/cloudberry/downloads","issues_url":"https://api.github.com/repos/ISG-ICS/cloudberry/issues{/number}","pulls_url":"https://api.github.com/repos/ISG-ICS/cloudberry/pulls{/number}","milestones_url":"https://api.github.com/repos/ISG-ICS/cloudberry/milestones{/number}","notifications_url":"https://api.github.com/repos/ISG-ICS/cloudberry/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ISG-ICS/cloudberry/labels{/name}","releases_url":"https://api.github.com/repos/ISG-ICS/cloudberry/releases{/id}","deployments_url":"https://api.github.com/repos/ISG-ICS/cloudberry/deployments","created_at":"2015-11-17T20:59:29Z","updated_at":"2016-07-17T13:33:46Z","pushed_at":"2016-07-19T18:12:51Z","git_url":"git://github.com/ISG-ICS/cloudberry.git","ssh_url":"git@github.com:ISG-ICS/cloudberry.git","clone_url":"https://github.com/ISG-ICS/cloudberry.git","svn_url":"https://github.com/ISG-ICS/cloudberry","homepage":"http://cloudberry.ics.uci.edu","size":98035,"stargazers_count":6,"watchers_count":6,"language":"Scala","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":14,"mirror_url":null,"open_issues_count":33,"forks":14,"open_issues":33,"watchers":6,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/ISG-ICS/cloudberry/pulls/140"},"html":{"href":"https://github.com/ISG-ICS/cloudberry/pull/140"},"issue":{"href":"https://api.github.com/repos/ISG-ICS/cloudberry/issues/140"},"comments":{"href":"https://api.github.com/repos/ISG-ICS/cloudberry/issues/140/comments"},"review_comments":{"href":"https://api.github.com/repos/ISG-ICS/cloudberry/pulls/140/comments"},"review_comment":{"href":"https://api.github.com/repos/ISG-ICS/cloudberry/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/ISG-ICS/cloudberry/pulls/140/commits"},"statuses":{"href":"https://api.github.com/repos/ISG-ICS/cloudberry/statuses/f35daf9f18b08d32ee5b115f616f1948811ce389"}}}}
{"actor":{"display_login":"JavierJia"}}