{"action":"created","comment":{"url":"https://api.github.com/repos/locationtech/geomesa/pulls/comments/111799685","pull_request_review_id":33059148,"id":111799685,"diff_hunk":"@@ -0,0 +1,379 @@\n+/***********************************************************************\n+* Copyright (c) 2013-2016 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.hbase.filters;\n+\n+import com.google.common.base.Throwables;\n+import com.vividsolutions.jts.geom.Coordinate;\n+import com.vividsolutions.jts.geom.Envelope;\n+import com.vividsolutions.jts.geom.Point;\n+import com.vividsolutions.jts.geom.Polygon;\n+import org.apache.hadoop.hbase.Cell;\n+import org.apache.hadoop.hbase.CellUtil;\n+import org.apache.hadoop.hbase.exceptions.DeserializationException;\n+import org.apache.hadoop.hbase.filter.FilterBase;\n+import org.apache.hadoop.hbase.util.Bytes;\n+import org.geotools.factory.Hints;\n+import org.geotools.filter.text.ecql.ECQL;\n+import org.geotools.util.Converters;\n+import org.locationtech.geomesa.features.ScalaSimpleFeature;\n+import org.locationtech.geomesa.features.interop.SerializationOptions;\n+import org.locationtech.geomesa.features.kryo.KryoFeatureSerializer;\n+import org.locationtech.geomesa.index.conf.QueryHints;\n+import org.locationtech.geomesa.utils.geometry.Geometry;\n+import org.locationtech.geomesa.utils.geotools.GridSnap;\n+import org.locationtech.geomesa.utils.geotools.SimpleFeatureTypes;\n+import org.opengis.feature.simple.SimpleFeature;\n+import org.opengis.feature.simple.SimpleFeatureType;\n+import org.slf4j.Logger;\n+import org.slf4j.LoggerFactory;\n+\n+import java.io.*;\n+import java.util.AbstractMap;\n+import java.util.Base64;\n+import java.util.HashMap;\n+import java.util.Map;\n+\n+import org.opengis.feature.type.GeometryDescriptor;\n+import org.opengis.filter.expression.Expression;\n+import scala.Tuple2;\n+\n+public class KryoLazyDensityFilter extends FilterBase {\n+\n+    private String sftString;\n+    private SimpleFeatureType sft;\n+    private KryoFeatureSerializer serializer;\n+    private Hints hints;\n+\n+    private SimpleFeatureType outputsft = SimpleFeatureTypes.createType(\"result\", \"mapkey:string,weight:java.lang.Double\");\n+    private KryoFeatureSerializer output_serializer = new KryoFeatureSerializer(outputsft, SerializationOptions.withoutId());\n+\n+    private final String ENVELOPE_OPT = \"envelope\";\n+    private final String GRID_WIDTH_OPT = \"grid_width\";\n+    private final String GRID_HEIGHT_OPT = \"grid_height\";\n+    private final String WEIGHT_OPT = \"weight\";\n+    private final String GEOM_INDEX = \"geom_index\";\n+    private final String WEIGHT_INDEX = \"weight_index\";\n+\n+    private int weightIndex = -2;\n+    private int geomIndex = -1;\n+\n+    private GridSnap gridSnap = null;\n+    private Map<String, Object> options = new HashMap<>();\n+\n+    private final static Logger logger = LoggerFactory.getLogger(KryoLazyDensityFilter.class);\n+\n+    public void configure(String sftString, Hints hints){\n+        this.sftString = sftString;\n+        configureSFT();\n+        configureOptions(hints);\n+    }\n+\n+    public void configure(SimpleFeatureType sft, Hints hints) {\n+        this.sft = sft;\n+        this.sftString = SimpleFeatureTypes.encodeType(sft, true);\n+        configureOptions(hints);\n+    }\n+\n+    public KryoLazyDensityFilter(String sftString, Hints hints) {\n+        this.sftString = sftString;\n+        configureSFT();\n+        configureOptions(hints);\n+    }\n+\n+    public KryoLazyDensityFilter(String sftString, Map<String, Object> options) {\n+        this.sftString = sftString;\n+        configureSFT();\n+        if (options == null) {\n+            return;\n+        }\n+        this.options = options;\n+\n+        this.weightIndex = (Integer) options.getOrDefault(WEIGHT_INDEX, -2);\n+        this.geomIndex = (Integer) options.getOrDefault(GEOM_INDEX, -1);\n+        Envelope envelope = (Envelope) options.getOrDefault(ENVELOPE_OPT, null);\n+\n+        if(envelope != null){\n+            int width = (Integer) options.get(GRID_WIDTH_OPT);\n+            int height = (Integer) options.get(GRID_HEIGHT_OPT);\n+            this.gridSnap = new GridSnap(envelope, width, height);\n+        }\n+    }\n+\n+    public KryoLazyDensityFilter(SimpleFeatureType sft, Hints hints) {\n+        this.sft = sft;\n+        this.sftString = SimpleFeatureTypes.encodeType(sft, true);\n+        configureOptions(hints);\n+    }\n+\n+    private void configureOptions(Hints hints) {\n+        geomIndex = getGeomIndex();\n+        options.put(GEOM_INDEX, geomIndex);\n+\n+        if (hints == null) {\n+            return;\n+        }\n+\n+        Envelope envelope = getDensityEnvelope(hints);\n+        int width = getDensityWidth(hints);\n+        int height = getDensityHeight(hints);\n+        String weight = getDensityWeight(hints);\n+        options.put(WEIGHT_OPT, weight);\n+        options.put(ENVELOPE_OPT, envelope);\n+        options.put(GRID_WIDTH_OPT, width);\n+        options.put(GRID_HEIGHT_OPT, height);\n+        gridSnap = new GridSnap(envelope, width, height);\n+        int index = sft.indexOf((String) options.get(WEIGHT_OPT));\n+        weightIndex = index;\n+        options.put(WEIGHT_INDEX, weightIndex);\n+    }\n+\n+    private void configureSFT() {\n+        sft = SimpleFeatureTypes.createType(\"densitySft\", sftString);\n+        serializer = new KryoFeatureSerializer(sft, SerializationOptions.withoutId());\n+    }\n+\n+    private String getGeomField() {\n+        GeometryDescriptor gd = sft.getGeometryDescriptor();\n+        if (gd == null) {\n+            return null;\n+        } else {\n+            return gd.getLocalName();\n+        }\n+    }\n+\n+    private int getGeomIndex() {\n+        return sft.indexOf(getGeomField());\n+    }\n+\n+    private Envelope getDensityEnvelope(Hints hints) {\n+        Envelope e = (Envelope) hints.get(QueryHints.DENSITY_BBOX());\n+        return e;\n+    }\n+\n+    private int getDensityWidth(Hints hints) {\n+        int width = (int) hints.get(QueryHints.DENSITY_WIDTH());\n+        return width;\n+    }\n+\n+    private int getDensityHeight(Hints hints) {\n+        int height = (int) hints.get(QueryHints.DENSITY_HEIGHT());\n+        return height;\n+    }\n+\n+    private String getDensityWeight(Hints hints) {\n+        String weight = (String) hints.get(QueryHints.DENSITY_WEIGHT());\n+        return weight;\n+    }\n+\n+\n+    /**\n+     * Gets the weight for a feature from a double attribute\n+     */\n+    private double getWeightFromDouble(int i, SimpleFeature sf) {\n+        Double d = (Double) sf.getAttribute(i);\n+        if (d == null) {\n+            return 0.0;\n+        } else {\n+            return d;\n+        }\n+    }\n+\n+    /**\n+     * Tries to convert a non-double attribute into a double\n+     */\n+    private double getWeightFromNonDouble(int i, SimpleFeature sf) {\n+        Object d = sf.getAttribute(i);\n+        if (d == null) {\n+            return 0.0;\n+        } else {\n+            Double converted = Converters.convert(d, Double.class);\n+            if (converted == null) {\n+                return 1.0;\n+            } else {\n+                return converted;\n+            }\n+        }\n+    }\n+\n+    /**\n+     * Evaluates an arbitrary expression against the simple feature to return a weight\n+     */\n+    private double getWeightFromExpression(Expression e, SimpleFeature sf) {\n+        Double d = e.evaluate(sf, Double.class);\n+        if (d == null) {\n+            return 0.0;\n+        } else {\n+            return d;\n+        }\n+    }\n+\n+    /*\n+     * Returns the weight of a simple feature\n+     */\n+    double weightFn(SimpleFeature sf) {\n+        double returnVal = 0.0;\n+        if (weightIndex == -2) {\n+            returnVal = 1.0;\n+        } else if (weightIndex == -1) {\n+            try {\n+                Expression expression = ECQL.toExpression((String) options.get(WEIGHT_OPT));\n+                returnVal = getWeightFromExpression(expression, sf);\n+            } catch (Exception e) {\n+                logger.error(Throwables.getStackTraceAsString(e));\n+            }\n+        } else if (sft.getDescriptor(weightIndex).getType().getBinding() == Double.class) {\n+            returnVal = getWeightFromDouble(weightIndex, sf);\n+        } else {\n+            returnVal = getWeightFromNonDouble(weightIndex, sf);\n+        }\n+        return returnVal;\n+    }\n+\n+    boolean isPoints() {\n+        GeometryDescriptor gd = sft.getGeometryDescriptor();\n+        return (gd != null && gd.getType().getBinding() == Point.class);\n+    }\n+\n+    Map.Entry<Tuple2<Integer, Integer>, Double> writePoint(SimpleFeature sf, Double weight) {\n+        return writePointToResult((Point) sf.getAttribute(geomIndex), weight);\n+    }\n+\n+    private Map.Entry<Tuple2<Integer, Integer>, Double> writeNonPoint(Geometry geom, Double weight) {\n+        return writePointToResult(safeCentroid(geom), weight);\n+    }\n+\n+    private Point safeCentroid(Geometry geom) {\n+        Polygon p = geom.noPolygon();\n+        Point centroid = p.getCentroid();\n+        if (Double.isNaN(centroid.getCoordinate().x) || Double.isNaN(centroid.getCoordinate().y)) {\n+            return p.getEnvelope().getCentroid();\n+        } else {\n+            return centroid;\n+        }\n+    }\n+\n+    private Map.Entry<Tuple2<Integer, Integer>, Double> writePointToResult(Point pt, Double weight) {\n+        return writeSnappedPoint(gridSnap.i(pt.getX()), gridSnap.j(pt.getY()), weight);\n+    }\n+\n+    private Map.Entry<Tuple2<Integer, Integer>, Double> writeSnappedPoint(int x, int y, Double weight) {\n+        Tuple2 tuple = new Tuple2(x, y);\n+        return new AbstractMap.SimpleEntry(tuple, weight);\n+\n+    }\n+\n+    private void writePointToResult(Coordinate pt, Double weight) {\n+        writeSnappedPoint(gridSnap.i(pt.x), gridSnap.j(pt.y), weight);\n+    }\n+\n+    private void writePointToResult(double x, double y, double weight) {\n+        writeSnappedPoint(gridSnap.i(x), gridSnap.j(y), weight);\n+    }\n+\n+    @Override\n+    public ReturnCode filterKeyValue(Cell cell) throws IOException {\n+        return ReturnCode.INCLUDE;\n+    }\n+\n+    @Override\n+    public Cell transformCell(Cell cell) throws IOException {\n+        byte[] row = CellUtil.cloneRow(cell);","path":"geomesa-hbase/geomesa-hbase-datastore/src/main/java/org/locationtech/geomesa/hbase/filters/KryoLazyDensityFilter.java","position":286,"original_position":286,"commit_id":"642afe248ae70cbe4460859ab38008010720f317","original_commit_id":"642afe248ae70cbe4460859ab38008010720f317","user":{"login":"elahrvivaz","id":7715322,"avatar_url":"https://avatars3.githubusercontent.com/u/7715322?v=3","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":"we should avoid cloning the cell and use a KryoBufferSimpleFeature here","created_at":"2017-04-17T19:10:07Z","updated_at":"2017-04-17T19:29:06Z","html_url":"https://github.com/locationtech/geomesa/pull/1478#discussion_r111799685","pull_request_url":"https://api.github.com/repos/locationtech/geomesa/pulls/1478","_links":{"self":{"href":"https://api.github.com/repos/locationtech/geomesa/pulls/comments/111799685"},"html":{"href":"https://github.com/locationtech/geomesa/pull/1478#discussion_r111799685"},"pull_request":{"href":"https://api.github.com/repos/locationtech/geomesa/pulls/1478"}}},"pull_request":{"url":"https://api.github.com/repos/locationtech/geomesa/pulls/1478","id":116090718,"html_url":"https://github.com/locationtech/geomesa/pull/1478","diff_url":"https://github.com/locationtech/geomesa/pull/1478.diff","patch_url":"https://github.com/locationtech/geomesa/pull/1478.patch","issue_url":"https://api.github.com/repos/locationtech/geomesa/issues/1478","number":1478,"state":"open","locked":false,"title":"Hbase Density Filter","user":{"login":"mahakgrg","id":21136027,"avatar_url":"https://avatars3.githubusercontent.com/u/21136027?v=3","gravatar_id":"","url":"https://api.github.com/users/mahakgrg","html_url":"https://github.com/mahakgrg","followers_url":"https://api.github.com/users/mahakgrg/followers","following_url":"https://api.github.com/users/mahakgrg/following{/other_user}","gists_url":"https://api.github.com/users/mahakgrg/gists{/gist_id}","starred_url":"https://api.github.com/users/mahakgrg/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mahakgrg/subscriptions","organizations_url":"https://api.github.com/users/mahakgrg/orgs","repos_url":"https://api.github.com/users/mahakgrg/repos","events_url":"https://api.github.com/users/mahakgrg/events{/privacy}","received_events_url":"https://api.github.com/users/mahakgrg/received_events","type":"User","site_admin":false},"body":"PR for hbase density filter implementation\r\n\r\nSigned-off-by: Mutahir <kazmi.mutahir@gmail.com>\r\nSigned-off-by: Mahak <mahakgrg@gmail.com>","created_at":"2017-04-17T04:44:33Z","updated_at":"2017-04-17T19:29:06Z","closed_at":null,"merged_at":null,"merge_commit_sha":"8ccd88625be3727636619e9539ad957b53c70d20","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/locationtech/geomesa/pulls/1478/commits","review_comments_url":"https://api.github.com/repos/locationtech/geomesa/pulls/1478/comments","review_comment_url":"https://api.github.com/repos/locationtech/geomesa/pulls/comments{/number}","comments_url":"https://api.github.com/repos/locationtech/geomesa/issues/1478/comments","statuses_url":"https://api.github.com/repos/locationtech/geomesa/statuses/642afe248ae70cbe4460859ab38008010720f317","head":{"label":"MutahirKazmi:fcr_hbase_density_filter","ref":"fcr_hbase_density_filter","sha":"642afe248ae70cbe4460859ab38008010720f317","user":{"login":"MutahirKazmi","id":4002943,"avatar_url":"https://avatars2.githubusercontent.com/u/4002943?v=3","gravatar_id":"","url":"https://api.github.com/users/MutahirKazmi","html_url":"https://github.com/MutahirKazmi","followers_url":"https://api.github.com/users/MutahirKazmi/followers","following_url":"https://api.github.com/users/MutahirKazmi/following{/other_user}","gists_url":"https://api.github.com/users/MutahirKazmi/gists{/gist_id}","starred_url":"https://api.github.com/users/MutahirKazmi/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/MutahirKazmi/subscriptions","organizations_url":"https://api.github.com/users/MutahirKazmi/orgs","repos_url":"https://api.github.com/users/MutahirKazmi/repos","events_url":"https://api.github.com/users/MutahirKazmi/events{/privacy}","received_events_url":"https://api.github.com/users/MutahirKazmi/received_events","type":"User","site_admin":false},"repo":{"id":80958525,"name":"geomesa","full_name":"MutahirKazmi/geomesa","owner":{"login":"MutahirKazmi","id":4002943,"avatar_url":"https://avatars2.githubusercontent.com/u/4002943?v=3","gravatar_id":"","url":"https://api.github.com/users/MutahirKazmi","html_url":"https://github.com/MutahirKazmi","followers_url":"https://api.github.com/users/MutahirKazmi/followers","following_url":"https://api.github.com/users/MutahirKazmi/following{/other_user}","gists_url":"https://api.github.com/users/MutahirKazmi/gists{/gist_id}","starred_url":"https://api.github.com/users/MutahirKazmi/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/MutahirKazmi/subscriptions","organizations_url":"https://api.github.com/users/MutahirKazmi/orgs","repos_url":"https://api.github.com/users/MutahirKazmi/repos","events_url":"https://api.github.com/users/MutahirKazmi/events{/privacy}","received_events_url":"https://api.github.com/users/MutahirKazmi/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/MutahirKazmi/geomesa","description":"GeoMesa is a suite of tools for working with big geo-spatial data in a distributed fashion.","fork":true,"url":"https://api.github.com/repos/MutahirKazmi/geomesa","forks_url":"https://api.github.com/repos/MutahirKazmi/geomesa/forks","keys_url":"https://api.github.com/repos/MutahirKazmi/geomesa/keys{/key_id}","collaborators_url":"https://api.github.com/repos/MutahirKazmi/geomesa/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/MutahirKazmi/geomesa/teams","hooks_url":"https://api.github.com/repos/MutahirKazmi/geomesa/hooks","issue_events_url":"https://api.github.com/repos/MutahirKazmi/geomesa/issues/events{/number}","events_url":"https://api.github.com/repos/MutahirKazmi/geomesa/events","assignees_url":"https://api.github.com/repos/MutahirKazmi/geomesa/assignees{/user}","branches_url":"https://api.github.com/repos/MutahirKazmi/geomesa/branches{/branch}","tags_url":"https://api.github.com/repos/MutahirKazmi/geomesa/tags","blobs_url":"https://api.github.com/repos/MutahirKazmi/geomesa/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/MutahirKazmi/geomesa/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/MutahirKazmi/geomesa/git/refs{/sha}","trees_url":"https://api.github.com/repos/MutahirKazmi/geomesa/git/trees{/sha}","statuses_url":"https://api.github.com/repos/MutahirKazmi/geomesa/statuses/{sha}","languages_url":"https://api.github.com/repos/MutahirKazmi/geomesa/languages","stargazers_url":"https://api.github.com/repos/MutahirKazmi/geomesa/stargazers","contributors_url":"https://api.github.com/repos/MutahirKazmi/geomesa/contributors","subscribers_url":"https://api.github.com/repos/MutahirKazmi/geomesa/subscribers","subscription_url":"https://api.github.com/repos/MutahirKazmi/geomesa/subscription","commits_url":"https://api.github.com/repos/MutahirKazmi/geomesa/commits{/sha}","git_commits_url":"https://api.github.com/repos/MutahirKazmi/geomesa/git/commits{/sha}","comments_url":"https://api.github.com/repos/MutahirKazmi/geomesa/comments{/number}","issue_comment_url":"https://api.github.com/repos/MutahirKazmi/geomesa/issues/comments{/number}","contents_url":"https://api.github.com/repos/MutahirKazmi/geomesa/contents/{+path}","compare_url":"https://api.github.com/repos/MutahirKazmi/geomesa/compare/{base}...{head}","merges_url":"https://api.github.com/repos/MutahirKazmi/geomesa/merges","archive_url":"https://api.github.com/repos/MutahirKazmi/geomesa/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/MutahirKazmi/geomesa/downloads","issues_url":"https://api.github.com/repos/MutahirKazmi/geomesa/issues{/number}","pulls_url":"https://api.github.com/repos/MutahirKazmi/geomesa/pulls{/number}","milestones_url":"https://api.github.com/repos/MutahirKazmi/geomesa/milestones{/number}","notifications_url":"https://api.github.com/repos/MutahirKazmi/geomesa/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/MutahirKazmi/geomesa/labels{/name}","releases_url":"https://api.github.com/repos/MutahirKazmi/geomesa/releases{/id}","deployments_url":"https://api.github.com/repos/MutahirKazmi/geomesa/deployments","created_at":"2017-02-05T00:33:37Z","updated_at":"2017-02-05T00:33:42Z","pushed_at":"2017-04-17T16:17:01Z","git_url":"git://github.com/MutahirKazmi/geomesa.git","ssh_url":"git@github.com:MutahirKazmi/geomesa.git","clone_url":"https://github.com/MutahirKazmi/geomesa.git","svn_url":"https://github.com/MutahirKazmi/geomesa","homepage":"https://www.locationtech.org/projects/technology.geomesa","size":40343,"stargazers_count":0,"watchers_count":0,"language":"Scala","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":false,"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":"locationtech:master","ref":"master","sha":"b238a3a07ca1e26ccf6ac7f962b64955a75ab202","user":{"login":"locationtech","id":1991411,"avatar_url":"https://avatars1.githubusercontent.com/u/1991411?v=3","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://avatars1.githubusercontent.com/u/1991411?v=3","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":"2017-04-14T14:46:50Z","pushed_at":"2017-04-17T16:17:02Z","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":40590,"stargazers_count":283,"watchers_count":283,"language":"Scala","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":137,"mirror_url":null,"open_issues_count":13,"forks":137,"open_issues":13,"watchers":283,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/locationtech/geomesa/pulls/1478"},"html":{"href":"https://github.com/locationtech/geomesa/pull/1478"},"issue":{"href":"https://api.github.com/repos/locationtech/geomesa/issues/1478"},"comments":{"href":"https://api.github.com/repos/locationtech/geomesa/issues/1478/comments"},"review_comments":{"href":"https://api.github.com/repos/locationtech/geomesa/pulls/1478/comments"},"review_comment":{"href":"https://api.github.com/repos/locationtech/geomesa/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/locationtech/geomesa/pulls/1478/commits"},"statuses":{"href":"https://api.github.com/repos/locationtech/geomesa/statuses/642afe248ae70cbe4460859ab38008010720f317"}}}}
{"actor":{"display_login":"elahrvivaz"}}