{"action":"created","comment":{"url":"https://api.github.com/repos/NationalSecurityAgency/timely/pulls/comments/84327120","pull_request_review_id":5111686,"id":84327120,"diff_hunk":"@@ -0,0 +1,309 @@\n+package timely.store.iterators;\n+\n+import java.io.IOException;\n+import java.io.Serializable;\n+import java.util.Arrays;\n+import java.util.Collection;\n+import java.util.Collections;\n+import java.util.Comparator;\n+import java.util.HashSet;\n+import java.util.Iterator;\n+import java.util.Map;\n+import java.util.Map.Entry;\n+import java.util.Set;\n+import java.util.TreeMap;\n+\n+import org.apache.accumulo.core.data.ByteSequence;\n+import org.apache.accumulo.core.data.Key;\n+import org.apache.accumulo.core.data.Range;\n+import org.apache.accumulo.core.data.Value;\n+import org.apache.accumulo.core.iterators.IteratorEnvironment;\n+import org.apache.accumulo.core.iterators.SortedKeyValueIterator;\n+import org.apache.accumulo.core.iterators.WrappingIterator;\n+import org.apache.accumulo.core.util.Pair;\n+import org.slf4j.Logger;\n+import org.slf4j.LoggerFactory;\n+\n+import timely.adapter.accumulo.MetricAdapter;\n+import timely.model.Metric;\n+\n+/**\n+ * Iterator that groups time series so that a filter can be applied to the time\n+ * series. This iterator will ignore time series that do not have enough data\n+ * points at the start of the query.\n+ *\n+ */\n+public class TimeSeriesGroupingIterator extends WrappingIterator {\n+\n+    /**\n+     * Object representing a single time series and its computed value\n+     *\n+     */\n+    private static class TimeSeries extends TreeMap<Key, Double> implements Serializable {\n+\n+        private static final long serialVersionUID = 1L;\n+        private int targetSize;\n+        private transient TimeSeriesGroupingIterator iter;\n+        private Double answer;\n+\n+        public TimeSeries(TimeSeriesGroupingIterator iter, int size) {\n+            this.iter = iter;\n+            this.targetSize = size;\n+        }\n+\n+        @Override\n+        public Double put(Key key, Double value) {\n+            return this.put(key, value, true);\n+        }\n+\n+        public Double put(Key key, Double value, boolean doCompute) {\n+            if (this.targetSize == super.size()) {\n+                Entry<Key, Double> e = this.pollFirstEntry();\n+                LOG.trace(\"Removing first entry {}\", e.getKey());\n+            }\n+            Double result = super.put(key, value);\n+            if (doCompute) {\n+                recompute();\n+            }\n+            return result;\n+        }\n+\n+        public Double getAnswer() {\n+            return this.answer;\n+        }\n+\n+        private void recompute() {\n+            this.answer = iter.compute(this);\n+            LOG.trace(\"recomputed, new answer: {}\", this.answer);\n+        }\n+\n+    }\n+\n+    private static class TimeSeriesMetricComparator implements Comparator<Metric>, Serializable {\n+\n+        private static final long serialVersionUID = 1L;\n+\n+        @Override\n+        public int compare(Metric m1, Metric m2) {\n+            int result = m1.getName().compareTo(m2.getName());\n+            if (result == 0) {\n+                result = m1.getTags().toString().compareTo(m2.getTags().toString());\n+            }\n+            return result;\n+        }\n+\n+    }\n+\n+    /**\n+     *\n+     * Object representing a group of time series, where uniqueness is defined\n+     * by the name of the metric and a unique tag set.\n+     *\n+     */\n+    private static class TimeSeriesGroup extends TreeMap<Metric, TimeSeries> implements Iterable<Pair<Key, Double>> {\n+\n+        private static final long serialVersionUID = 1L;\n+\n+        public TimeSeriesGroup() {\n+            super(new TimeSeriesMetricComparator());\n+        }\n+\n+        /**\n+         * Iterates over the time series group and returns for each time series\n+         * the last key and the filtered value.\n+         */\n+        @Override\n+        public Iterator<Pair<Key, Double>> iterator() {\n+\n+            final Iterator<Entry<Metric, TimeSeries>> iter = this.entrySet().iterator();\n+\n+            return new Iterator<Pair<Key, Double>>() {\n+\n+                @Override\n+                public boolean hasNext() {\n+                    return iter.hasNext();\n+                }\n+\n+                @Override\n+                public Pair<Key, Double> next() {\n+                    Entry<Metric, TimeSeries> e = iter.next();\n+                    LOG.trace(\"Removing first entry from series {}\", e.getValue());\n+                    get(e.getKey()).pollFirstEntry(); // remove first key, will\n+                                                      // re-fill later\n+                    return new Pair<Key, Double>(e.getValue().lastKey(), e.getValue().getAnswer());\n+                }\n+\n+            };\n+        }\n+    }\n+\n+    private static final Logger LOG = LoggerFactory.getLogger(TimeSeriesGroupingIterator.class);\n+\n+    public static final String FILTER = \"sliding.window.filter\";\n+\n+    private final TimeSeriesGroup series = new TimeSeriesGroup();\n+    protected Double[] filters = null;\n+    private Key topKey = null;\n+    private Value topValue = null;\n+    private Iterator<Pair<Key, Double>> seriesIterator = null;\n+\n+    protected Double compute(Map<Key, Double> values) {\n+        double result = 0D;\n+        int i = 0;\n+        for (Entry<Key, Double> e : values.entrySet()) {\n+            LOG.trace(\"compute - key:{}, value: {}\", e.getKey(), e.getValue());\n+            result += (filters[i] * e.getValue());\n+            i++;\n+        }\n+        LOG.trace(\"compute - result: {}\", result);\n+        return result;\n+    }\n+\n+    @Override\n+    public Key getTopKey() {\n+        return topKey;\n+    }\n+\n+    @Override\n+    public Value getTopValue() {\n+        return topValue;\n+    }\n+\n+    @Override\n+    public boolean hasTop() {\n+        LOG.trace(\"hasTop()\");\n+        if (seriesIterator.hasNext()) {\n+            LOG.trace(\"seriesIterator - hasNext()\");\n+            Pair<Key, Double> p = seriesIterator.next();\n+            topKey = p.getFirst();\n+            topValue = new Value(MetricAdapter.encodeValue(p.getSecond()));\n+            return true;\n+        } else {\n+            try {\n+                refillBuffer();\n+                if (series.size() == 0) {\n+                    return false;\n+                } else {\n+                    seriesIterator = series.iterator();\n+                    Pair<Key, Double> p = seriesIterator.next();\n+                    topKey = p.getFirst();\n+                    topValue = new Value(MetricAdapter.encodeValue(p.getSecond()));\n+                    return true;\n+                }\n+            } catch (IOException e) {\n+                throw new RuntimeException(\"Error filling buffer\", e);\n+            }\n+        }\n+    }\n+\n+    @Override\n+    public void next() throws IOException {\n+        LOG.trace(\"next()\");\n+    }\n+\n+    @Override\n+    public void init(SortedKeyValueIterator<Key, Value> source, Map<String, String> options, IteratorEnvironment env)\n+            throws IOException {\n+        super.init(source, options, env);\n+        String filterOption = options.getOrDefault(FILTER, null);\n+        if (null == filterOption) {\n+            throw new IllegalArgumentException(\"Window size must be specified.\");\n+        }\n+        String[] split = filterOption.split(\",\");\n+        filters = new Double[split.length];\n+        for (int i = 0; i < split.length; i++) {\n+            filters[i] = Double.parseDouble(split[i]);\n+        }\n+        LOG.trace(\"init - filter: {}\", Arrays.toString(filters));\n+    }\n+\n+    @Override\n+    public void seek(Range range, Collection<ByteSequence> columnFamilies, boolean inclusive) throws IOException {\n+        super.seek(range, columnFamilies, inclusive);\n+        series.clear();\n+        fillBuffer();\n+        seriesIterator = series.iterator();\n+    }\n+\n+    private void refillBuffer() throws IOException {\n+        LOG.trace(\"refill()\");\n+        Metric top = null;\n+        while (super.hasTop()) {\n+            Key k = super.getTopKey();\n+            Metric m = MetricAdapter.parse(k, super.getTopValue());\n+            timely.model.Value v = m.getValue();\n+            m.setValue(null);\n+            Collections.sort(m.getTags());","path":"server/src/main/java/timely/store/iterators/TimeSeriesGroupingIterator.java","position":236,"original_position":236,"commit_id":"a171e15875f367302119b1509ec37ee09d43a402","original_commit_id":"a171e15875f367302119b1509ec37ee09d43a402","user":{"login":"ivakegg","id":347158,"avatar_url":"https://avatars.githubusercontent.com/u/347158?v=3","gravatar_id":"","url":"https://api.github.com/users/ivakegg","html_url":"https://github.com/ivakegg","followers_url":"https://api.github.com/users/ivakegg/followers","following_url":"https://api.github.com/users/ivakegg/following{/other_user}","gists_url":"https://api.github.com/users/ivakegg/gists{/gist_id}","starred_url":"https://api.github.com/users/ivakegg/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ivakegg/subscriptions","organizations_url":"https://api.github.com/users/ivakegg/orgs","repos_url":"https://api.github.com/users/ivakegg/repos","events_url":"https://api.github.com/users/ivakegg/events{/privacy}","received_events_url":"https://api.github.com/users/ivakegg/received_events","type":"User","site_admin":false},"body":"I am wondering if an underlying SortedList would be better.  Then we never have to worry about sorting it post creation","created_at":"2016-10-20T16:48:36Z","updated_at":"2016-10-20T16:48:36Z","html_url":"https://github.com/NationalSecurityAgency/timely/pull/100#discussion_r84327120","pull_request_url":"https://api.github.com/repos/NationalSecurityAgency/timely/pulls/100","_links":{"self":{"href":"https://api.github.com/repos/NationalSecurityAgency/timely/pulls/comments/84327120"},"html":{"href":"https://github.com/NationalSecurityAgency/timely/pull/100#discussion_r84327120"},"pull_request":{"href":"https://api.github.com/repos/NationalSecurityAgency/timely/pulls/100"}}},"pull_request":{"url":"https://api.github.com/repos/NationalSecurityAgency/timely/pulls/100","id":90233551,"html_url":"https://github.com/NationalSecurityAgency/timely/pull/100","diff_url":"https://github.com/NationalSecurityAgency/timely/pull/100.diff","patch_url":"https://github.com/NationalSecurityAgency/timely/pull/100.patch","issue_url":"https://api.github.com/repos/NationalSecurityAgency/timely/issues/100","number":100,"state":"open","locked":false,"title":"Issue99","user":{"login":"dlmarion","id":567911,"avatar_url":"https://avatars.githubusercontent.com/u/567911?v=3","gravatar_id":"","url":"https://api.github.com/users/dlmarion","html_url":"https://github.com/dlmarion","followers_url":"https://api.github.com/users/dlmarion/followers","following_url":"https://api.github.com/users/dlmarion/following{/other_user}","gists_url":"https://api.github.com/users/dlmarion/gists{/gist_id}","starred_url":"https://api.github.com/users/dlmarion/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dlmarion/subscriptions","organizations_url":"https://api.github.com/users/dlmarion/orgs","repos_url":"https://api.github.com/users/dlmarion/repos","events_url":"https://api.github.com/users/dlmarion/events{/privacy}","received_events_url":"https://api.github.com/users/dlmarion/received_events","type":"User","site_admin":false},"body":"","created_at":"2016-10-20T16:16:28Z","updated_at":"2016-10-20T16:48:36Z","closed_at":null,"merged_at":null,"merge_commit_sha":"2705e295f4a8c6def57e992d3838936a06271549","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/NationalSecurityAgency/timely/pulls/100/commits","review_comments_url":"https://api.github.com/repos/NationalSecurityAgency/timely/pulls/100/comments","review_comment_url":"https://api.github.com/repos/NationalSecurityAgency/timely/pulls/comments{/number}","comments_url":"https://api.github.com/repos/NationalSecurityAgency/timely/issues/100/comments","statuses_url":"https://api.github.com/repos/NationalSecurityAgency/timely/statuses/a171e15875f367302119b1509ec37ee09d43a402","head":{"label":"NationalSecurityAgency:issue99","ref":"issue99","sha":"a171e15875f367302119b1509ec37ee09d43a402","user":{"login":"NationalSecurityAgency","id":11298292,"avatar_url":"https://avatars.githubusercontent.com/u/11298292?v=3","gravatar_id":"","url":"https://api.github.com/users/NationalSecurityAgency","html_url":"https://github.com/NationalSecurityAgency","followers_url":"https://api.github.com/users/NationalSecurityAgency/followers","following_url":"https://api.github.com/users/NationalSecurityAgency/following{/other_user}","gists_url":"https://api.github.com/users/NationalSecurityAgency/gists{/gist_id}","starred_url":"https://api.github.com/users/NationalSecurityAgency/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/NationalSecurityAgency/subscriptions","organizations_url":"https://api.github.com/users/NationalSecurityAgency/orgs","repos_url":"https://api.github.com/users/NationalSecurityAgency/repos","events_url":"https://api.github.com/users/NationalSecurityAgency/events{/privacy}","received_events_url":"https://api.github.com/users/NationalSecurityAgency/received_events","type":"Organization","site_admin":false},"repo":{"id":56099345,"name":"timely","full_name":"NationalSecurityAgency/timely","owner":{"login":"NationalSecurityAgency","id":11298292,"avatar_url":"https://avatars.githubusercontent.com/u/11298292?v=3","gravatar_id":"","url":"https://api.github.com/users/NationalSecurityAgency","html_url":"https://github.com/NationalSecurityAgency","followers_url":"https://api.github.com/users/NationalSecurityAgency/followers","following_url":"https://api.github.com/users/NationalSecurityAgency/following{/other_user}","gists_url":"https://api.github.com/users/NationalSecurityAgency/gists{/gist_id}","starred_url":"https://api.github.com/users/NationalSecurityAgency/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/NationalSecurityAgency/subscriptions","organizations_url":"https://api.github.com/users/NationalSecurityAgency/orgs","repos_url":"https://api.github.com/users/NationalSecurityAgency/repos","events_url":"https://api.github.com/users/NationalSecurityAgency/events{/privacy}","received_events_url":"https://api.github.com/users/NationalSecurityAgency/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/NationalSecurityAgency/timely","description":"Accumulo backed time series database","fork":false,"url":"https://api.github.com/repos/NationalSecurityAgency/timely","forks_url":"https://api.github.com/repos/NationalSecurityAgency/timely/forks","keys_url":"https://api.github.com/repos/NationalSecurityAgency/timely/keys{/key_id}","collaborators_url":"https://api.github.com/repos/NationalSecurityAgency/timely/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/NationalSecurityAgency/timely/teams","hooks_url":"https://api.github.com/repos/NationalSecurityAgency/timely/hooks","issue_events_url":"https://api.github.com/repos/NationalSecurityAgency/timely/issues/events{/number}","events_url":"https://api.github.com/repos/NationalSecurityAgency/timely/events","assignees_url":"https://api.github.com/repos/NationalSecurityAgency/timely/assignees{/user}","branches_url":"https://api.github.com/repos/NationalSecurityAgency/timely/branches{/branch}","tags_url":"https://api.github.com/repos/NationalSecurityAgency/timely/tags","blobs_url":"https://api.github.com/repos/NationalSecurityAgency/timely/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/NationalSecurityAgency/timely/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/NationalSecurityAgency/timely/git/refs{/sha}","trees_url":"https://api.github.com/repos/NationalSecurityAgency/timely/git/trees{/sha}","statuses_url":"https://api.github.com/repos/NationalSecurityAgency/timely/statuses/{sha}","languages_url":"https://api.github.com/repos/NationalSecurityAgency/timely/languages","stargazers_url":"https://api.github.com/repos/NationalSecurityAgency/timely/stargazers","contributors_url":"https://api.github.com/repos/NationalSecurityAgency/timely/contributors","subscribers_url":"https://api.github.com/repos/NationalSecurityAgency/timely/subscribers","subscription_url":"https://api.github.com/repos/NationalSecurityAgency/timely/subscription","commits_url":"https://api.github.com/repos/NationalSecurityAgency/timely/commits{/sha}","git_commits_url":"https://api.github.com/repos/NationalSecurityAgency/timely/git/commits{/sha}","comments_url":"https://api.github.com/repos/NationalSecurityAgency/timely/comments{/number}","issue_comment_url":"https://api.github.com/repos/NationalSecurityAgency/timely/issues/comments{/number}","contents_url":"https://api.github.com/repos/NationalSecurityAgency/timely/contents/{+path}","compare_url":"https://api.github.com/repos/NationalSecurityAgency/timely/compare/{base}...{head}","merges_url":"https://api.github.com/repos/NationalSecurityAgency/timely/merges","archive_url":"https://api.github.com/repos/NationalSecurityAgency/timely/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/NationalSecurityAgency/timely/downloads","issues_url":"https://api.github.com/repos/NationalSecurityAgency/timely/issues{/number}","pulls_url":"https://api.github.com/repos/NationalSecurityAgency/timely/pulls{/number}","milestones_url":"https://api.github.com/repos/NationalSecurityAgency/timely/milestones{/number}","notifications_url":"https://api.github.com/repos/NationalSecurityAgency/timely/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/NationalSecurityAgency/timely/labels{/name}","releases_url":"https://api.github.com/repos/NationalSecurityAgency/timely/releases{/id}","deployments_url":"https://api.github.com/repos/NationalSecurityAgency/timely/deployments","created_at":"2016-04-12T21:33:37Z","updated_at":"2016-10-17T17:06:16Z","pushed_at":"2016-10-20T16:16:28Z","git_url":"git://github.com/NationalSecurityAgency/timely.git","ssh_url":"git@github.com:NationalSecurityAgency/timely.git","clone_url":"https://github.com/NationalSecurityAgency/timely.git","svn_url":"https://github.com/NationalSecurityAgency/timely","homepage":"https://nationalsecurityagency.github.io/timely/","size":4921,"stargazers_count":33,"watchers_count":33,"language":"Java","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":6,"mirror_url":null,"open_issues_count":24,"forks":6,"open_issues":24,"watchers":33,"default_branch":"master"}},"base":{"label":"NationalSecurityAgency:master","ref":"master","sha":"c90b86c4c9ef287c031c186e79cc7f0278554833","user":{"login":"NationalSecurityAgency","id":11298292,"avatar_url":"https://avatars.githubusercontent.com/u/11298292?v=3","gravatar_id":"","url":"https://api.github.com/users/NationalSecurityAgency","html_url":"https://github.com/NationalSecurityAgency","followers_url":"https://api.github.com/users/NationalSecurityAgency/followers","following_url":"https://api.github.com/users/NationalSecurityAgency/following{/other_user}","gists_url":"https://api.github.com/users/NationalSecurityAgency/gists{/gist_id}","starred_url":"https://api.github.com/users/NationalSecurityAgency/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/NationalSecurityAgency/subscriptions","organizations_url":"https://api.github.com/users/NationalSecurityAgency/orgs","repos_url":"https://api.github.com/users/NationalSecurityAgency/repos","events_url":"https://api.github.com/users/NationalSecurityAgency/events{/privacy}","received_events_url":"https://api.github.com/users/NationalSecurityAgency/received_events","type":"Organization","site_admin":false},"repo":{"id":56099345,"name":"timely","full_name":"NationalSecurityAgency/timely","owner":{"login":"NationalSecurityAgency","id":11298292,"avatar_url":"https://avatars.githubusercontent.com/u/11298292?v=3","gravatar_id":"","url":"https://api.github.com/users/NationalSecurityAgency","html_url":"https://github.com/NationalSecurityAgency","followers_url":"https://api.github.com/users/NationalSecurityAgency/followers","following_url":"https://api.github.com/users/NationalSecurityAgency/following{/other_user}","gists_url":"https://api.github.com/users/NationalSecurityAgency/gists{/gist_id}","starred_url":"https://api.github.com/users/NationalSecurityAgency/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/NationalSecurityAgency/subscriptions","organizations_url":"https://api.github.com/users/NationalSecurityAgency/orgs","repos_url":"https://api.github.com/users/NationalSecurityAgency/repos","events_url":"https://api.github.com/users/NationalSecurityAgency/events{/privacy}","received_events_url":"https://api.github.com/users/NationalSecurityAgency/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/NationalSecurityAgency/timely","description":"Accumulo backed time series database","fork":false,"url":"https://api.github.com/repos/NationalSecurityAgency/timely","forks_url":"https://api.github.com/repos/NationalSecurityAgency/timely/forks","keys_url":"https://api.github.com/repos/NationalSecurityAgency/timely/keys{/key_id}","collaborators_url":"https://api.github.com/repos/NationalSecurityAgency/timely/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/NationalSecurityAgency/timely/teams","hooks_url":"https://api.github.com/repos/NationalSecurityAgency/timely/hooks","issue_events_url":"https://api.github.com/repos/NationalSecurityAgency/timely/issues/events{/number}","events_url":"https://api.github.com/repos/NationalSecurityAgency/timely/events","assignees_url":"https://api.github.com/repos/NationalSecurityAgency/timely/assignees{/user}","branches_url":"https://api.github.com/repos/NationalSecurityAgency/timely/branches{/branch}","tags_url":"https://api.github.com/repos/NationalSecurityAgency/timely/tags","blobs_url":"https://api.github.com/repos/NationalSecurityAgency/timely/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/NationalSecurityAgency/timely/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/NationalSecurityAgency/timely/git/refs{/sha}","trees_url":"https://api.github.com/repos/NationalSecurityAgency/timely/git/trees{/sha}","statuses_url":"https://api.github.com/repos/NationalSecurityAgency/timely/statuses/{sha}","languages_url":"https://api.github.com/repos/NationalSecurityAgency/timely/languages","stargazers_url":"https://api.github.com/repos/NationalSecurityAgency/timely/stargazers","contributors_url":"https://api.github.com/repos/NationalSecurityAgency/timely/contributors","subscribers_url":"https://api.github.com/repos/NationalSecurityAgency/timely/subscribers","subscription_url":"https://api.github.com/repos/NationalSecurityAgency/timely/subscription","commits_url":"https://api.github.com/repos/NationalSecurityAgency/timely/commits{/sha}","git_commits_url":"https://api.github.com/repos/NationalSecurityAgency/timely/git/commits{/sha}","comments_url":"https://api.github.com/repos/NationalSecurityAgency/timely/comments{/number}","issue_comment_url":"https://api.github.com/repos/NationalSecurityAgency/timely/issues/comments{/number}","contents_url":"https://api.github.com/repos/NationalSecurityAgency/timely/contents/{+path}","compare_url":"https://api.github.com/repos/NationalSecurityAgency/timely/compare/{base}...{head}","merges_url":"https://api.github.com/repos/NationalSecurityAgency/timely/merges","archive_url":"https://api.github.com/repos/NationalSecurityAgency/timely/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/NationalSecurityAgency/timely/downloads","issues_url":"https://api.github.com/repos/NationalSecurityAgency/timely/issues{/number}","pulls_url":"https://api.github.com/repos/NationalSecurityAgency/timely/pulls{/number}","milestones_url":"https://api.github.com/repos/NationalSecurityAgency/timely/milestones{/number}","notifications_url":"https://api.github.com/repos/NationalSecurityAgency/timely/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/NationalSecurityAgency/timely/labels{/name}","releases_url":"https://api.github.com/repos/NationalSecurityAgency/timely/releases{/id}","deployments_url":"https://api.github.com/repos/NationalSecurityAgency/timely/deployments","created_at":"2016-04-12T21:33:37Z","updated_at":"2016-10-17T17:06:16Z","pushed_at":"2016-10-20T16:16:28Z","git_url":"git://github.com/NationalSecurityAgency/timely.git","ssh_url":"git@github.com:NationalSecurityAgency/timely.git","clone_url":"https://github.com/NationalSecurityAgency/timely.git","svn_url":"https://github.com/NationalSecurityAgency/timely","homepage":"https://nationalsecurityagency.github.io/timely/","size":4921,"stargazers_count":33,"watchers_count":33,"language":"Java","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":6,"mirror_url":null,"open_issues_count":24,"forks":6,"open_issues":24,"watchers":33,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/NationalSecurityAgency/timely/pulls/100"},"html":{"href":"https://github.com/NationalSecurityAgency/timely/pull/100"},"issue":{"href":"https://api.github.com/repos/NationalSecurityAgency/timely/issues/100"},"comments":{"href":"https://api.github.com/repos/NationalSecurityAgency/timely/issues/100/comments"},"review_comments":{"href":"https://api.github.com/repos/NationalSecurityAgency/timely/pulls/100/comments"},"review_comment":{"href":"https://api.github.com/repos/NationalSecurityAgency/timely/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/NationalSecurityAgency/timely/pulls/100/commits"},"statuses":{"href":"https://api.github.com/repos/NationalSecurityAgency/timely/statuses/a171e15875f367302119b1509ec37ee09d43a402"}}}}
{"actor":{"display_login":"ivakegg"}}