{"action":"created","comment":{"url":"https://api.github.com/repos/locationtech/geomesa/pulls/comments/187111268","pull_request_review_id":118825956,"id":187111268,"diff_hunk":"@@ -0,0 +1,292 @@\n+/***********************************************************************\n+ * Copyright (c) 2013-2018 Commonwealth Computer Research, Inc.\n+ * All rights reserved. This program and the accompanying materials\n+ * are made available under the terms of the Apache License, Version 2.0\n+ * which accompanies this distribution and is available at\n+ * http://www.opensource.org/licenses/apache2.0.php.\n+ ***********************************************************************/\n+\n+package org.locationtech.geomesa.tools.utils\n+\n+import java.io.InputStream\n+import java.{lang => jl}\n+import java.time.format.DateTimeParseException\n+\n+import com.vividsolutions.jts.geom._\n+import com.typesafe.config.{Config, ConfigFactory, ConfigValueFactory}\n+import com.fasterxml.jackson.core.{JsonFactory, JsonParser, JsonToken}\n+import com.fasterxml.jackson.core.JsonToken._\n+import org.geotools.feature.AttributeTypeBuilder\n+import org.geotools.feature.simple.SimpleFeatureTypeBuilder\n+import org.opengis.feature.`type`.AttributeDescriptor\n+import org.opengis.feature.simple.SimpleFeatureType\n+import org.locationtech.geomesa.utils.io.PathUtils\n+import org.locationtech.geomesa.utils.io.fs.FileSystemDelegate\n+import org.locationtech.geomesa.utils.geotools.{AttributeSpec, CRS_EPSG_4326}\n+import org.locationtech.geomesa.utils.geotools.SimpleFeatureSpecConfig.TypeNamePath\n+import org.locationtech.geomesa.utils.text.DateParsing\n+\n+import scala.collection.JavaConversions._\n+import scala.collection.JavaConverters._\n+import scala.reflect.ClassTag\n+\n+object GeoJsonInference {\n+\n+  val FieldsPath = \"fields\"\n+  val OptionsPath = \"options\"\n+\n+  val attributeBuilder = new AttributeTypeBuilder()\n+\n+  val baseConfig: Config = ConfigFactory.empty()\n+    .withValue(\"type\", ConfigValueFactory.fromAnyRef(\"json\"))\n+    .withValue(\"feature-path\", ConfigValueFactory.fromAnyRef(\"$[*]\"))\n+    .withValue(\"options\", ConfigValueFactory.fromMap(Map((\"line-mode\", \"multi\"))))\n+\n+  def inferSft(filePath: String): SimpleFeatureType = {\n+    val fileHandle: FileSystemDelegate.FileHandle = PathUtils.interpretPath(filePath).head\n+    inferSft(fileHandle.open)\n+  }\n+\n+  def inferSft(is: InputStream, sftName: String = \"geojson\", maxToRead: Int = 10): SimpleFeatureType = {\n+    val sftBuilder = new SimpleFeatureTypeBuilder()\n+    val factory = new JsonFactory()\n+    val parser = factory.createParser(is)\n+    parser.nextToken()\n+\n+    var attributes: Map[String, AttributeDescriptor] = Map()\n+    var geomTypes: Array[String] = Array()\n+\n+    var numRead = 0\n+    while (parser.hasCurrentToken && numRead < maxToRead) {\n+\n+      // Advance to the geometry object and store type\n+      while(nextUntil(parser, \"geometry\")) { parser.nextToken() }\n+      geomTypes = geomTypes :+ getKeyValue(parser, \"type\")\n+\n+      // Advance to the properties object\n+      while(nextUntil(parser, \"properties\")) { parser.nextToken() }\n+      while(nextUntil(parser, START_OBJECT)) { parser.nextToken() }\n+      parser.nextToken()\n+\n+      // parse the properties\n+      var properties: Array[AttributeDescriptor] = Array()\n+      while (parser.hasCurrentToken && !parser.getCurrentToken.isStructEnd) {\n+        val prop = inferField(parser)\n+        properties = properties :+  prop\n+        parser.nextToken()\n+      }\n+\n+      // merge any conflicts\n+      val propMap = properties.map{ a => (a.getLocalName, a) }.toMap\n+      attributes = mergeMaps(attributes, propMap)\n+\n+      // advance to next object\n+      while(nextUntil(parser, FIELD_NAME)) { parser.nextToken() }\n+      parser.nextToken()\n+      numRead+=1\n+    }\n+    is.close()\n+\n+    // add geometry\n+    val mergedGeomType = mergeGeomTypes(geomTypes)\n+    val allAttrs = attributes.values.toArray :+ buildGeomAttr(mergedGeomType)\n+\n+    sftBuilder.addAll(allAttrs)\n+    sftBuilder.setName(sftName)\n+    sftBuilder.setDefaultGeometry(\"geometry\")\n+    sftBuilder.buildFeatureType()\n+  }\n+\n+  def inferConfig(sft: SimpleFeatureType, idFieldName: Option[String] = None): Config = {\n+    val attributes = sft.getAttributeDescriptors.map { ad =>\n+      val config = AttributeSpec(sft, ad).toConfigMap\n+      val attrMap: java.util.HashMap[String,String] = new java.util.HashMap[String,String](config.asJava)\n+      val typeVal = attrMap.get(\"type\").toLowerCase()\n+      ad.getType.getBinding match {\n+        case t if classOf[java.util.List[_]].isAssignableFrom(t) =>\n+          attrMap.put(\"json-type\", \"list\")\n+          attrMap.put(\"transform\", \"jsonList('string', $0)\")\n+          attrMap.put(\"path\", \"$.properties.\" + attrMap.get(\"name\"))\n+        case g if classOf[Geometry].isAssignableFrom(g) =>\n+          val geomType = attrMap.get(\"type\").toLowerCase()\n+          attrMap.put(\"json-type\", \"geometry\")\n+          attrMap.put(\"transform\", s\"$geomType($$0)\")\n+          attrMap.put(\"path\", \"$.geometry\")\n+        case _ =>\n+          attrMap.put(\"json-type\", typeVal)\n+          attrMap.put(\"path\", \"$.properties.\" + attrMap.get(\"name\"))\n+      }\n+\n+      attrMap.put(\"name\", attrMap.get(\"name\"))\n+      attrMap\n+    }\n+\n+    baseConfig\n+      .withValue(TypeNamePath, ConfigValueFactory.fromAnyRef(sft.getTypeName))\n+      .withValue(FieldsPath, ConfigValueFactory.fromIterable(attributes))\n+  }\n+\n+  def mergeMaps(attrsA: Map[String, AttributeDescriptor],\n+                attrsB: Map[String, AttributeDescriptor]): Map[String, AttributeDescriptor] = {\n+    val (overlappingKeys, disjointKeys) = attrsB.keys.partition(attrsA.contains)\n+\n+    // start with fields unique to A\n+    var newMap = attrsA.filter( p => !attrsB.contains(p._1)).toSeq\n+    // Add fields unique to B\n+    disjointKeys.foreach{ name => newMap = newMap :+ (name, attrsB(name)) }\n+    // Merge overlaps\n+    val merged = overlappingKeys.map { name =>\n+      val bindingA = attrsA(name).getType.getBinding\n+      val bindingB = attrsB(name).getType.getBinding\n+      if (bindingB == classOf[jl.Object] || bindingA == bindingB) {\n+        (name, attrsA(name))\n+      } else if (bindingA == classOf[jl.Object]) {\n+        (name, attrsB(name))\n+      } else {\n+        val JDouble = classOf[jl.Double]\n+        val JInteger = classOf[jl.Integer]\n+        val JLong = classOf[jl.Long]\n+        (bindingA, bindingB) match {\n+          case (JDouble, JInteger) => (name, attrsA(name))\n+          case (JInteger, JDouble) => (name, attrsB(name))\n+          case (JLong, JInteger) => (name, attrsA(name))\n+          case (JInteger, JLong) => (name, attrsB(name))\n+          case _ => (name, attrsA(name))\n+        }\n+      }\n+    }\n+    newMap = newMap ++ merged\n+    newMap.toMap\n+  }\n+\n+  def mergeGeomTypes(geomTypes: Array[String]): String = {\n+    val firstNonNull = geomTypes.find(t => t != null)\n+    firstNonNull match {\n+      case Some(geomType) =>\n+        if (geomTypes.forall(_.equals(geomType))) {\n+          geomType\n+        } else {\n+          \"Geometry\"\n+        }\n+      case None => throw new UnsupportedOperationException(\"Could not locate geometry in geojson file.\")\n+    }\n+  }\n+\n+  // NB: This method is adapted from Apache Spark's JsonInferSchema class","path":"geomesa-tools/src/main/scala/org/locationtech/geomesa/tools/utils/GeoJsonInference.scala","position":187,"original_position":175,"commit_id":"f8420b3b83b89641542f465ffc00915866d3c892","original_commit_id":"4ccc35a273ebfa615ba533878b1ea244e60dc0f1","user":{"login":"elahrvivaz","id":7715322,"avatar_url":"https://avatars0.githubusercontent.com/u/7715322?v=4","gravatar_id":"","url":"https://api.github.com/users/elahrvivaz","html_url":"https://github.com/elahrvivaz","followers_url":"https://api.github.com/users/elahrvivaz/followers","following_url":"https://api.github.com/users/elahrvivaz/following{/other_user}","gists_url":"https://api.github.com/users/elahrvivaz/gists{/gist_id}","starred_url":"https://api.github.com/users/elahrvivaz/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/elahrvivaz/subscriptions","organizations_url":"https://api.github.com/users/elahrvivaz/orgs","repos_url":"https://api.github.com/users/elahrvivaz/repos","events_url":"https://api.github.com/users/elahrvivaz/events{/privacy}","received_events_url":"https://api.github.com/users/elahrvivaz/received_events","type":"User","site_admin":false},"body":"does this count as 'redistribution'? we already have a CQ for spark, so I thought adding the copyright would be good enough, as we are 'taking ownership' of this piece of code","created_at":"2018-05-09T17:14:02Z","updated_at":"2018-05-09T17:14:02Z","html_url":"https://github.com/locationtech/geomesa/pull/1942#discussion_r187111268","pull_request_url":"https://api.github.com/repos/locationtech/geomesa/pulls/1942","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/locationtech/geomesa/pulls/comments/187111268"},"html":{"href":"https://github.com/locationtech/geomesa/pull/1942#discussion_r187111268"},"pull_request":{"href":"https://api.github.com/repos/locationtech/geomesa/pulls/1942"}},"in_reply_to_id":184164758},"pull_request":{"url":"https://api.github.com/repos/locationtech/geomesa/pulls/1942","id":184084880,"html_url":"https://github.com/locationtech/geomesa/pull/1942","diff_url":"https://github.com/locationtech/geomesa/pull/1942.diff","patch_url":"https://github.com/locationtech/geomesa/pull/1942.patch","issue_url":"https://api.github.com/repos/locationtech/geomesa/issues/1942","number":1942,"state":"open","locked":false,"title":"GEOMESA-2270 Infer schema and converter from geojson file","user":{"login":"atallahhezbor","id":7144661,"avatar_url":"https://avatars3.githubusercontent.com/u/7144661?v=4","gravatar_id":"","url":"https://api.github.com/users/atallahhezbor","html_url":"https://github.com/atallahhezbor","followers_url":"https://api.github.com/users/atallahhezbor/followers","following_url":"https://api.github.com/users/atallahhezbor/following{/other_user}","gists_url":"https://api.github.com/users/atallahhezbor/gists{/gist_id}","starred_url":"https://api.github.com/users/atallahhezbor/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/atallahhezbor/subscriptions","organizations_url":"https://api.github.com/users/atallahhezbor/orgs","repos_url":"https://api.github.com/users/atallahhezbor/repos","events_url":"https://api.github.com/users/atallahhezbor/events{/privacy}","received_events_url":"https://api.github.com/users/atallahhezbor/received_events","type":"User","site_admin":false},"body":"Signed-off-by: Atallah Hezbor <atallahhezbor@gmail.com>","created_at":"2018-04-25T15:58:45Z","updated_at":"2018-05-09T17:14:02Z","closed_at":null,"merged_at":null,"merge_commit_sha":"5442994fae2a30882ced0bb9cc80a91347b5d30c","assignee":null,"assignees":[],"requested_reviewers":[{"login":"jahhulbert-ccri","id":7433591,"avatar_url":"https://avatars3.githubusercontent.com/u/7433591?v=4","gravatar_id":"","url":"https://api.github.com/users/jahhulbert-ccri","html_url":"https://github.com/jahhulbert-ccri","followers_url":"https://api.github.com/users/jahhulbert-ccri/followers","following_url":"https://api.github.com/users/jahhulbert-ccri/following{/other_user}","gists_url":"https://api.github.com/users/jahhulbert-ccri/gists{/gist_id}","starred_url":"https://api.github.com/users/jahhulbert-ccri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jahhulbert-ccri/subscriptions","organizations_url":"https://api.github.com/users/jahhulbert-ccri/orgs","repos_url":"https://api.github.com/users/jahhulbert-ccri/repos","events_url":"https://api.github.com/users/jahhulbert-ccri/events{/privacy}","received_events_url":"https://api.github.com/users/jahhulbert-ccri/received_events","type":"User","site_admin":false}],"requested_teams":[],"labels":[],"milestone":{"url":"https://api.github.com/repos/locationtech/geomesa/milestones/20","html_url":"https://github.com/locationtech/geomesa/milestone/20","labels_url":"https://api.github.com/repos/locationtech/geomesa/milestones/20/labels","id":3248301,"number":20,"title":"2.1.0","description":null,"creator":{"login":"elahrvivaz","id":7715322,"avatar_url":"https://avatars0.githubusercontent.com/u/7715322?v=4","gravatar_id":"","url":"https://api.github.com/users/elahrvivaz","html_url":"https://github.com/elahrvivaz","followers_url":"https://api.github.com/users/elahrvivaz/followers","following_url":"https://api.github.com/users/elahrvivaz/following{/other_user}","gists_url":"https://api.github.com/users/elahrvivaz/gists{/gist_id}","starred_url":"https://api.github.com/users/elahrvivaz/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/elahrvivaz/subscriptions","organizations_url":"https://api.github.com/users/elahrvivaz/orgs","repos_url":"https://api.github.com/users/elahrvivaz/repos","events_url":"https://api.github.com/users/elahrvivaz/events{/privacy}","received_events_url":"https://api.github.com/users/elahrvivaz/received_events","type":"User","site_admin":false},"open_issues":9,"closed_issues":2,"state":"open","created_at":"2018-04-06T16:42:07Z","updated_at":"2018-05-07T19:14:44Z","due_on":null,"closed_at":null},"commits_url":"https://api.github.com/repos/locationtech/geomesa/pulls/1942/commits","review_comments_url":"https://api.github.com/repos/locationtech/geomesa/pulls/1942/comments","review_comment_url":"https://api.github.com/repos/locationtech/geomesa/pulls/comments{/number}","comments_url":"https://api.github.com/repos/locationtech/geomesa/issues/1942/comments","statuses_url":"https://api.github.com/repos/locationtech/geomesa/statuses/f8420b3b83b89641542f465ffc00915866d3c892","head":{"label":"ccri:ahezbor-fcr_geojson-ingest","ref":"ahezbor-fcr_geojson-ingest","sha":"f8420b3b83b89641542f465ffc00915866d3c892","user":{"login":"ccri","id":1089783,"avatar_url":"https://avatars3.githubusercontent.com/u/1089783?v=4","gravatar_id":"","url":"https://api.github.com/users/ccri","html_url":"https://github.com/ccri","followers_url":"https://api.github.com/users/ccri/followers","following_url":"https://api.github.com/users/ccri/following{/other_user}","gists_url":"https://api.github.com/users/ccri/gists{/gist_id}","starred_url":"https://api.github.com/users/ccri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ccri/subscriptions","organizations_url":"https://api.github.com/users/ccri/orgs","repos_url":"https://api.github.com/users/ccri/repos","events_url":"https://api.github.com/users/ccri/events{/privacy}","received_events_url":"https://api.github.com/users/ccri/received_events","type":"Organization","site_admin":false},"repo":{"id":16865543,"name":"geomesa","full_name":"ccri/geomesa","owner":{"login":"ccri","id":1089783,"avatar_url":"https://avatars3.githubusercontent.com/u/1089783?v=4","gravatar_id":"","url":"https://api.github.com/users/ccri","html_url":"https://github.com/ccri","followers_url":"https://api.github.com/users/ccri/followers","following_url":"https://api.github.com/users/ccri/following{/other_user}","gists_url":"https://api.github.com/users/ccri/gists{/gist_id}","starred_url":"https://api.github.com/users/ccri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ccri/subscriptions","organizations_url":"https://api.github.com/users/ccri/orgs","repos_url":"https://api.github.com/users/ccri/repos","events_url":"https://api.github.com/users/ccri/events{/privacy}","received_events_url":"https://api.github.com/users/ccri/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/ccri/geomesa","description":"docs","fork":true,"url":"https://api.github.com/repos/ccri/geomesa","forks_url":"https://api.github.com/repos/ccri/geomesa/forks","keys_url":"https://api.github.com/repos/ccri/geomesa/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ccri/geomesa/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ccri/geomesa/teams","hooks_url":"https://api.github.com/repos/ccri/geomesa/hooks","issue_events_url":"https://api.github.com/repos/ccri/geomesa/issues/events{/number}","events_url":"https://api.github.com/repos/ccri/geomesa/events","assignees_url":"https://api.github.com/repos/ccri/geomesa/assignees{/user}","branches_url":"https://api.github.com/repos/ccri/geomesa/branches{/branch}","tags_url":"https://api.github.com/repos/ccri/geomesa/tags","blobs_url":"https://api.github.com/repos/ccri/geomesa/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ccri/geomesa/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ccri/geomesa/git/refs{/sha}","trees_url":"https://api.github.com/repos/ccri/geomesa/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ccri/geomesa/statuses/{sha}","languages_url":"https://api.github.com/repos/ccri/geomesa/languages","stargazers_url":"https://api.github.com/repos/ccri/geomesa/stargazers","contributors_url":"https://api.github.com/repos/ccri/geomesa/contributors","subscribers_url":"https://api.github.com/repos/ccri/geomesa/subscribers","subscription_url":"https://api.github.com/repos/ccri/geomesa/subscription","commits_url":"https://api.github.com/repos/ccri/geomesa/commits{/sha}","git_commits_url":"https://api.github.com/repos/ccri/geomesa/git/commits{/sha}","comments_url":"https://api.github.com/repos/ccri/geomesa/comments{/number}","issue_comment_url":"https://api.github.com/repos/ccri/geomesa/issues/comments{/number}","contents_url":"https://api.github.com/repos/ccri/geomesa/contents/{+path}","compare_url":"https://api.github.com/repos/ccri/geomesa/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ccri/geomesa/merges","archive_url":"https://api.github.com/repos/ccri/geomesa/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ccri/geomesa/downloads","issues_url":"https://api.github.com/repos/ccri/geomesa/issues{/number}","pulls_url":"https://api.github.com/repos/ccri/geomesa/pulls{/number}","milestones_url":"https://api.github.com/repos/ccri/geomesa/milestones{/number}","notifications_url":"https://api.github.com/repos/ccri/geomesa/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ccri/geomesa/labels{/name}","releases_url":"https://api.github.com/repos/ccri/geomesa/releases{/id}","deployments_url":"https://api.github.com/repos/ccri/geomesa/deployments","created_at":"2014-02-15T15:39:50Z","updated_at":"2017-06-15T18:04:32Z","pushed_at":"2018-05-08T14:08:33Z","git_url":"git://github.com/ccri/geomesa.git","ssh_url":"git@github.com:ccri/geomesa.git","clone_url":"https://github.com/ccri/geomesa.git","svn_url":"https://github.com/ccri/geomesa","homepage":"","size":75117,"stargazers_count":0,"watchers_count":0,"language":"Scala","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0"},"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"locationtech:master","ref":"master","sha":"a408b2ea1adee44582bdb6062326906d2391bf34","user":{"login":"locationtech","id":1991411,"avatar_url":"https://avatars2.githubusercontent.com/u/1991411?v=4","gravatar_id":"","url":"https://api.github.com/users/locationtech","html_url":"https://github.com/locationtech","followers_url":"https://api.github.com/users/locationtech/followers","following_url":"https://api.github.com/users/locationtech/following{/other_user}","gists_url":"https://api.github.com/users/locationtech/gists{/gist_id}","starred_url":"https://api.github.com/users/locationtech/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/locationtech/subscriptions","organizations_url":"https://api.github.com/users/locationtech/orgs","repos_url":"https://api.github.com/users/locationtech/repos","events_url":"https://api.github.com/users/locationtech/events{/privacy}","received_events_url":"https://api.github.com/users/locationtech/received_events","type":"Organization","site_admin":false},"repo":{"id":13226069,"name":"geomesa","full_name":"locationtech/geomesa","owner":{"login":"locationtech","id":1991411,"avatar_url":"https://avatars2.githubusercontent.com/u/1991411?v=4","gravatar_id":"","url":"https://api.github.com/users/locationtech","html_url":"https://github.com/locationtech","followers_url":"https://api.github.com/users/locationtech/followers","following_url":"https://api.github.com/users/locationtech/following{/other_user}","gists_url":"https://api.github.com/users/locationtech/gists{/gist_id}","starred_url":"https://api.github.com/users/locationtech/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/locationtech/subscriptions","organizations_url":"https://api.github.com/users/locationtech/orgs","repos_url":"https://api.github.com/users/locationtech/repos","events_url":"https://api.github.com/users/locationtech/events{/privacy}","received_events_url":"https://api.github.com/users/locationtech/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/locationtech/geomesa","description":"GeoMesa is a suite of tools for working with big geo-spatial data in a distributed fashion.","fork":false,"url":"https://api.github.com/repos/locationtech/geomesa","forks_url":"https://api.github.com/repos/locationtech/geomesa/forks","keys_url":"https://api.github.com/repos/locationtech/geomesa/keys{/key_id}","collaborators_url":"https://api.github.com/repos/locationtech/geomesa/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/locationtech/geomesa/teams","hooks_url":"https://api.github.com/repos/locationtech/geomesa/hooks","issue_events_url":"https://api.github.com/repos/locationtech/geomesa/issues/events{/number}","events_url":"https://api.github.com/repos/locationtech/geomesa/events","assignees_url":"https://api.github.com/repos/locationtech/geomesa/assignees{/user}","branches_url":"https://api.github.com/repos/locationtech/geomesa/branches{/branch}","tags_url":"https://api.github.com/repos/locationtech/geomesa/tags","blobs_url":"https://api.github.com/repos/locationtech/geomesa/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/locationtech/geomesa/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/locationtech/geomesa/git/refs{/sha}","trees_url":"https://api.github.com/repos/locationtech/geomesa/git/trees{/sha}","statuses_url":"https://api.github.com/repos/locationtech/geomesa/statuses/{sha}","languages_url":"https://api.github.com/repos/locationtech/geomesa/languages","stargazers_url":"https://api.github.com/repos/locationtech/geomesa/stargazers","contributors_url":"https://api.github.com/repos/locationtech/geomesa/contributors","subscribers_url":"https://api.github.com/repos/locationtech/geomesa/subscribers","subscription_url":"https://api.github.com/repos/locationtech/geomesa/subscription","commits_url":"https://api.github.com/repos/locationtech/geomesa/commits{/sha}","git_commits_url":"https://api.github.com/repos/locationtech/geomesa/git/commits{/sha}","comments_url":"https://api.github.com/repos/locationtech/geomesa/comments{/number}","issue_comment_url":"https://api.github.com/repos/locationtech/geomesa/issues/comments{/number}","contents_url":"https://api.github.com/repos/locationtech/geomesa/contents/{+path}","compare_url":"https://api.github.com/repos/locationtech/geomesa/compare/{base}...{head}","merges_url":"https://api.github.com/repos/locationtech/geomesa/merges","archive_url":"https://api.github.com/repos/locationtech/geomesa/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/locationtech/geomesa/downloads","issues_url":"https://api.github.com/repos/locationtech/geomesa/issues{/number}","pulls_url":"https://api.github.com/repos/locationtech/geomesa/pulls{/number}","milestones_url":"https://api.github.com/repos/locationtech/geomesa/milestones{/number}","notifications_url":"https://api.github.com/repos/locationtech/geomesa/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/locationtech/geomesa/labels{/name}","releases_url":"https://api.github.com/repos/locationtech/geomesa/releases{/id}","deployments_url":"https://api.github.com/repos/locationtech/geomesa/deployments","created_at":"2013-09-30T20:13:46Z","updated_at":"2018-05-09T14:47:50Z","pushed_at":"2018-05-09T17:10:55Z","git_url":"git://github.com/locationtech/geomesa.git","ssh_url":"git@github.com:locationtech/geomesa.git","clone_url":"https://github.com/locationtech/geomesa.git","svn_url":"https://github.com/locationtech/geomesa","homepage":"https://www.locationtech.org/projects/technology.geomesa","size":51388,"stargazers_count":443,"watchers_count":443,"language":"Scala","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":185,"mirror_url":null,"archived":false,"open_issues_count":13,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0"},"forks":185,"open_issues":13,"watchers":443,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/locationtech/geomesa/pulls/1942"},"html":{"href":"https://github.com/locationtech/geomesa/pull/1942"},"issue":{"href":"https://api.github.com/repos/locationtech/geomesa/issues/1942"},"comments":{"href":"https://api.github.com/repos/locationtech/geomesa/issues/1942/comments"},"review_comments":{"href":"https://api.github.com/repos/locationtech/geomesa/pulls/1942/comments"},"review_comment":{"href":"https://api.github.com/repos/locationtech/geomesa/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/locationtech/geomesa/pulls/1942/commits"},"statuses":{"href":"https://api.github.com/repos/locationtech/geomesa/statuses/f8420b3b83b89641542f465ffc00915866d3c892"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"elahrvivaz"}}