{"action":"created","comment":{"url":"https://api.github.com/repos/wso2/siddhi/pulls/comments/208654168","pull_request_review_id":144508694,"id":208654168,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIwODY1NDE2OA==","diff_hunk":"@@ -0,0 +1,366 @@\n+/*\n+ * Copyright (c) 2018, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.\n+ *\n+ * WSO2 Inc. licenses this file to you under the Apache License,\n+ * Version 2.0 (the \"License\"); you may not use this file except\n+ * in compliance with the License.\n+ * You may obtain a copy of the License at\n+ *\n+ *     http://www.apache.org/licenses/LICENSE-2.0\n+ *\n+ * Unless required by applicable law or agreed to in writing,\n+ * software distributed under the License is distributed on an\n+ * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n+ * KIND, either express or implied. See the License for the\n+ * specific language governing permissions and limitations\n+ * under the License.\n+ */\n+\n+package org.wso2.siddhi.core.aggregation;\n+\n+import org.apache.log4j.Logger;\n+import org.wso2.siddhi.core.config.SiddhiAppContext;\n+import org.wso2.siddhi.core.event.ComplexEventChunk;\n+import org.wso2.siddhi.core.event.state.MetaStateEvent;\n+import org.wso2.siddhi.core.event.state.StateEvent;\n+import org.wso2.siddhi.core.event.stream.MetaStreamEvent;\n+import org.wso2.siddhi.core.event.stream.StreamEventPool;\n+import org.wso2.siddhi.core.exception.DataPurgingException;\n+import org.wso2.siddhi.core.exception.NoSuchDurationException;\n+import org.wso2.siddhi.core.exception.SiddhiAppCreationException;\n+import org.wso2.siddhi.core.executor.VariableExpressionExecutor;\n+import org.wso2.siddhi.core.table.Table;\n+import org.wso2.siddhi.core.util.SiddhiConstants;\n+import org.wso2.siddhi.core.util.collection.operator.CompiledCondition;\n+import org.wso2.siddhi.core.util.collection.operator.MatchingMetaInfoHolder;\n+import org.wso2.siddhi.query.api.aggregation.TimePeriod;\n+import org.wso2.siddhi.query.api.annotation.Annotation;\n+import org.wso2.siddhi.query.api.annotation.Element;\n+import org.wso2.siddhi.query.api.definition.AggregationDefinition;\n+import org.wso2.siddhi.query.api.definition.Attribute;\n+import org.wso2.siddhi.query.api.definition.TableDefinition;\n+import org.wso2.siddhi.query.api.expression.Expression;\n+import org.wso2.siddhi.query.api.expression.Variable;\n+import org.wso2.siddhi.query.api.expression.condition.Compare;\n+\n+import java.util.ArrayList;\n+import java.util.EnumMap;\n+import java.util.HashMap;\n+import java.util.List;\n+import java.util.Map;\n+import java.util.Objects;\n+import java.util.concurrent.ScheduledFuture;\n+import java.util.concurrent.TimeUnit;\n+import java.util.regex.Matcher;\n+import java.util.regex.Pattern;\n+\n+/**\n+ * This class implements the logic which is needed to purge data which are related to incremental\n+ **/\n+public class IncrementalDataPurging implements Runnable {\n+    private static final Logger LOG = Logger.getLogger(IncrementalDataPurging.class);\n+    private long purgeExecutionInterval = Expression.Time.minute(5).value();\n+    private long sec = Expression.Time.sec(30).value();\n+    private long mins = Expression.Time.hour(24).value();\n+    private long hours = Expression.Time.day(30).value();\n+    private long days = Expression.Time.year(5).value();\n+    private long months = -1;\n+    private long years = -1;\n+    private boolean purgingEnabled = true;\n+    private Map<TimePeriod.Duration, Long> retentionPeriods = new EnumMap<>(TimePeriod.Duration.class);\n+    private StreamEventPool streamEventPool;\n+    private Map<TimePeriod.Duration, Table> aggregationTables;\n+    private SiddhiAppContext siddhiAppContext;\n+    private Map<String, Table> tableMap;\n+    private static ScheduledFuture scheduledFuture;\n+    private static final String INTERNAL_AGG_TIMESTAMP_FIELD = \"AGG_TIMESTAMP\";\n+\n+\n+    public void init(AggregationDefinition aggregationDefinition, StreamEventPool streamEventPool,\n+                     Map<TimePeriod.Duration, Table> aggregationTables, SiddhiAppContext siddhiAppContext,\n+                     Map<String, Table> tableMap) {\n+        this.siddhiAppContext = siddhiAppContext;\n+        List<Annotation> annotations = aggregationDefinition.getAnnotations();\n+        this.tableMap = tableMap;\n+        this.streamEventPool = streamEventPool;\n+        this.aggregationTables = aggregationTables;\n+        for (TimePeriod.Duration duration : aggregationTables.keySet()) {\n+            switch (duration) {\n+                case SECONDS:\n+                    retentionPeriods.put(duration, sec);\n+                    break;\n+                case MINUTES:\n+                    retentionPeriods.put(duration, mins);\n+                    break;\n+                case HOURS:\n+                    retentionPeriods.put(duration, hours);\n+                    break;\n+                case DAYS:\n+                    retentionPeriods.put(duration, days);\n+                    break;\n+                case MONTHS:\n+                    retentionPeriods.put(duration, months);\n+                    break;\n+                case YEARS:\n+                    retentionPeriods.put(duration, years);\n+            }\n+        }\n+\n+        Map<String, Annotation> annotationTypes = new HashMap<>();\n+\n+        for (Annotation annotation : annotations) {\n+            annotationTypes.put(annotation.getName().toLowerCase(), annotation);\n+        }\n+        if (annotationTypes.keySet().contains(SiddhiConstants.NAMESPACE_PURGE)) {\n+            if (Objects.nonNull(annotationTypes.get(SiddhiConstants.NAMESPACE_PURGE).\n+                    getElement(SiddhiConstants.ANNOTATION_ELEMENT_ENABLE))) {\n+                String enable = annotationTypes.get(SiddhiConstants.NAMESPACE_PURGE).\n+                        getElement(SiddhiConstants.ANNOTATION_ELEMENT_ENABLE);\n+                if (!(enable.equals(\"true\") || enable.equals(\"false\"))) {\n+                    throw new SiddhiAppCreationException(\"Undefined value for enable: \" + enable + \".\" +\n+                            \" Please use true or false\");\n+                } else {\n+                    purgingEnabled = Boolean.parseBoolean(enable);\n+                }\n+            }\n+            if (purgingEnabled) {\n+                // If interval is defined, default value of 15 min will be replaced by user input value\n+                if (Objects.nonNull(annotationTypes.get(SiddhiConstants.NAMESPACE_PURGE).\n+                        getElement(SiddhiConstants.NAMESPACE_INTERVAL))) {\n+                    String interval = annotationTypes.get(SiddhiConstants.NAMESPACE_PURGE).\n+                            getElement(SiddhiConstants.NAMESPACE_INTERVAL);\n+                    purgeExecutionInterval = timeToLong(interval);\n+                }\n+                List<Annotation> retentions = annotationTypes.get(SiddhiConstants.NAMESPACE_PURGE).\n+                        getAnnotations(SiddhiConstants.NAMESPACE_RETENTION);\n+                if (Objects.nonNull(retentions) && !retentions.isEmpty()) {\n+                    Annotation retention = retentions.get(0);\n+                    List<Element> elements = retention.getElements();\n+                    for (Element element : elements) {\n+                        switch (durationNormalization(element.getKey())) {\n+                            case SECONDS:\n+                                if (element.getValue().equalsIgnoreCase(\"all\")) {\n+                                    sec = -1;\n+                                } else {\n+                                    sec = timeToLong(element.getValue());\n+                                }\n+                                retentionPeriods.put(TimePeriod.Duration.SECONDS, sec);\n+                                break;\n+                            case MINUTES:\n+                                if (element.getValue().equalsIgnoreCase(\"all\")) {\n+                                    mins = -1;\n+                                } else {\n+                                    mins = timeToLong(element.getValue());\n+                                }\n+                                retentionPeriods.put(TimePeriod.Duration.MINUTES, mins);\n+                                break;\n+                            case DAYS:\n+                                if (element.getValue().equalsIgnoreCase(\"all\")) {\n+                                    days = -1;\n+                                } else {\n+                                    days = timeToLong(element.getValue());\n+                                }\n+                                retentionPeriods.put(TimePeriod.Duration.DAYS, days);\n+                                break;\n+                            case MONTHS:\n+                                if (element.getValue().equalsIgnoreCase(\"all\")) {\n+                                    months = -1;\n+                                } else {\n+                                    months = timeToLong(element.getValue());\n+                                }\n+                                retentionPeriods.put(TimePeriod.Duration.MONTHS, months);\n+                                break;\n+                            case YEARS:\n+                                if (element.getValue().equalsIgnoreCase(\"all\")) {\n+                                    years = -1;\n+                                } else {\n+                                    years = timeToLong(element.getValue());\n+                                }\n+                                retentionPeriods.put(TimePeriod.Duration.YEARS, years);\n+                                break;\n+                            case HOURS:\n+                                if (element.getValue().equalsIgnoreCase(\"all\")) {\n+                                    hours = -1;\n+                                } else {\n+                                    hours = timeToLong(element.getValue());\n+                                }\n+                                retentionPeriods.put(TimePeriod.Duration.HOURS, hours);\n+                                break;\n+                        }\n+                    }\n+                }\n+            }\n+        }\n+    }\n+\n+    private Long getPurgeExecutionInterval() {\n+        return purgeExecutionInterval;\n+    }\n+\n+    public boolean isPurgingEnabled() {\n+        return purgingEnabled;\n+    }\n+\n+    @Override\n+    public void run() {\n+        long currentTime = System.currentTimeMillis();\n+        long purgeTime;\n+        Object[] purgeTimes = new Object[1];\n+        List<VariableExpressionExecutor> variableExpressionExecutorList = new ArrayList<>();\n+        Attribute attribute;\n+        VariableExpressionExecutor variableExpressionExecutor;\n+        ComplexEventChunk<StateEvent> eventChunk = new ComplexEventChunk<>(true);\n+        BaseIncrementalDataPurgingValueStore baseIncrementalDataPurgingValueStore = new\n+                BaseIncrementalDataPurgingValueStore(currentTime, streamEventPool);\n+        attribute = new Attribute(INTERNAL_AGG_TIMESTAMP_FIELD, Attribute.Type.LONG);\n+        variableExpressionExecutor = new VariableExpressionExecutor(attribute, 0, 1);\n+        variableExpressionExecutorList.add(variableExpressionExecutor);\n+\n+        for (Map.Entry<TimePeriod.Duration, Table> entry : aggregationTables.entrySet()) {\n+            if (retentionPeriods.get(entry.getKey()) != -1) {\n+                Variable leftVariable = new Variable(INTERNAL_AGG_TIMESTAMP_FIELD);\n+                leftVariable.setStreamId(entry.getValue().getTableDefinition().getId());\n+                Compare expression = new Compare(leftVariable,\n+                        Compare.Operator.LESS_THAN, new Variable(INTERNAL_AGG_TIMESTAMP_FIELD));\n+                purgeTime = currentTime - retentionPeriods.get(entry.getKey());\n+                purgeTimes[0] = purgeTime;\n+                StateEvent secEvent = baseIncrementalDataPurgingValueStore.createStreamEvent(purgeTimes);\n+                eventChunk.add(secEvent);\n+                Table table = aggregationTables.get(entry.getKey());\n+                try {\n+                    CompiledCondition compiledCondition = table.compileCondition(expression,\n+                            matchingMetaInfoHolder(table, attribute), siddhiAppContext, variableExpressionExecutorList,\n+                            tableMap, \"query1\");\n+                    LOG.info(\"Purging has enable for the table: \" + table.getTableDefinition().getId() + \" with a\" +","path":"modules/siddhi-core/src/main/java/org/wso2/siddhi/core/aggregation/IncrementalDataPurging.java","position":null,"original_position":234,"commit_id":"c2983751ec88d7f7fa335608d81105b51cdd1e2f","original_commit_id":"74e47a7dd655d68817592e40f997324d2be6df88","user":{"login":"AnuGayan","id":19290404,"node_id":"MDQ6VXNlcjE5MjkwNDA0","avatar_url":"https://avatars3.githubusercontent.com/u/19290404?v=4","gravatar_id":"","url":"https://api.github.com/users/AnuGayan","html_url":"https://github.com/AnuGayan","followers_url":"https://api.github.com/users/AnuGayan/followers","following_url":"https://api.github.com/users/AnuGayan/following{/other_user}","gists_url":"https://api.github.com/users/AnuGayan/gists{/gist_id}","starred_url":"https://api.github.com/users/AnuGayan/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnuGayan/subscriptions","organizations_url":"https://api.github.com/users/AnuGayan/orgs","repos_url":"https://api.github.com/users/AnuGayan/repos","events_url":"https://api.github.com/users/AnuGayan/events{/privacy}","received_events_url":"https://api.github.com/users/AnuGayan/received_events","type":"User","site_admin":false},"body":"fixed","created_at":"2018-08-08T16:44:49Z","updated_at":"2018-08-08T16:44:49Z","html_url":"https://github.com/wso2/siddhi/pull/881#discussion_r208654168","pull_request_url":"https://api.github.com/repos/wso2/siddhi/pulls/881","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/wso2/siddhi/pulls/comments/208654168"},"html":{"href":"https://github.com/wso2/siddhi/pull/881#discussion_r208654168"},"pull_request":{"href":"https://api.github.com/repos/wso2/siddhi/pulls/881"}},"in_reply_to_id":206647353},"pull_request":{"url":"https://api.github.com/repos/wso2/siddhi/pulls/881","id":205185472,"node_id":"MDExOlB1bGxSZXF1ZXN0MjA1MTg1NDcy","html_url":"https://github.com/wso2/siddhi/pull/881","diff_url":"https://github.com/wso2/siddhi/pull/881.diff","patch_url":"https://github.com/wso2/siddhi/pull/881.patch","issue_url":"https://api.github.com/repos/wso2/siddhi/issues/881","number":881,"state":"open","locked":false,"title":"Add Data purging capability for Aggregation Tables","user":{"login":"AnuGayan","id":19290404,"node_id":"MDQ6VXNlcjE5MjkwNDA0","avatar_url":"https://avatars3.githubusercontent.com/u/19290404?v=4","gravatar_id":"","url":"https://api.github.com/users/AnuGayan","html_url":"https://github.com/AnuGayan","followers_url":"https://api.github.com/users/AnuGayan/followers","following_url":"https://api.github.com/users/AnuGayan/following{/other_user}","gists_url":"https://api.github.com/users/AnuGayan/gists{/gist_id}","starred_url":"https://api.github.com/users/AnuGayan/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnuGayan/subscriptions","organizations_url":"https://api.github.com/users/AnuGayan/orgs","repos_url":"https://api.github.com/users/AnuGayan/repos","events_url":"https://api.github.com/users/AnuGayan/events{/privacy}","received_events_url":"https://api.github.com/users/AnuGayan/received_events","type":"User","site_admin":false},"body":"## Purpose\r\n> Siddhi Incremental aggregation will create several tables with respect to the granularity and store data. with the time those tables will grow in size from incoming events. \r\nThis will add purging capability to those aggregation tables.\r\n\r\n## Goals\r\n> This will introduce a purging capability to purge data in the aggregation table.\r\n\r\n## Approach\r\n> User can define a retention period for each granularity and provide an interval to run the purging task.\r\n\r\n## Automation tests\r\n - Unit tests \r\n        Tests are passing\r\n\r\n## Security checks\r\n - Followed secure coding standards in http://wso2.com/technical-reports/wso2-secure-engineering-guidelines? yes\r\n - Ran FindSecurityBugs plugin and verified report? yes\r\n - Confirmed that this PR doesn't commit any keys, passwords, tokens, usernames, or other secrets? yes","created_at":"2018-07-31T17:23:18Z","updated_at":"2018-08-08T16:44:49Z","closed_at":null,"merged_at":null,"merge_commit_sha":"4004b487821b27a585e6b45d7157046acdbdcaae","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/wso2/siddhi/pulls/881/commits","review_comments_url":"https://api.github.com/repos/wso2/siddhi/pulls/881/comments","review_comment_url":"https://api.github.com/repos/wso2/siddhi/pulls/comments{/number}","comments_url":"https://api.github.com/repos/wso2/siddhi/issues/881/comments","statuses_url":"https://api.github.com/repos/wso2/siddhi/statuses/c2983751ec88d7f7fa335608d81105b51cdd1e2f","head":{"label":"AnuGayan:incre-type3","ref":"incre-type3","sha":"c2983751ec88d7f7fa335608d81105b51cdd1e2f","user":{"login":"AnuGayan","id":19290404,"node_id":"MDQ6VXNlcjE5MjkwNDA0","avatar_url":"https://avatars3.githubusercontent.com/u/19290404?v=4","gravatar_id":"","url":"https://api.github.com/users/AnuGayan","html_url":"https://github.com/AnuGayan","followers_url":"https://api.github.com/users/AnuGayan/followers","following_url":"https://api.github.com/users/AnuGayan/following{/other_user}","gists_url":"https://api.github.com/users/AnuGayan/gists{/gist_id}","starred_url":"https://api.github.com/users/AnuGayan/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnuGayan/subscriptions","organizations_url":"https://api.github.com/users/AnuGayan/orgs","repos_url":"https://api.github.com/users/AnuGayan/repos","events_url":"https://api.github.com/users/AnuGayan/events{/privacy}","received_events_url":"https://api.github.com/users/AnuGayan/received_events","type":"User","site_admin":false},"repo":{"id":104088726,"node_id":"MDEwOlJlcG9zaXRvcnkxMDQwODg3MjY=","name":"siddhi","full_name":"AnuGayan/siddhi","owner":{"login":"AnuGayan","id":19290404,"node_id":"MDQ6VXNlcjE5MjkwNDA0","avatar_url":"https://avatars3.githubusercontent.com/u/19290404?v=4","gravatar_id":"","url":"https://api.github.com/users/AnuGayan","html_url":"https://github.com/AnuGayan","followers_url":"https://api.github.com/users/AnuGayan/followers","following_url":"https://api.github.com/users/AnuGayan/following{/other_user}","gists_url":"https://api.github.com/users/AnuGayan/gists{/gist_id}","starred_url":"https://api.github.com/users/AnuGayan/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnuGayan/subscriptions","organizations_url":"https://api.github.com/users/AnuGayan/orgs","repos_url":"https://api.github.com/users/AnuGayan/repos","events_url":"https://api.github.com/users/AnuGayan/events{/privacy}","received_events_url":"https://api.github.com/users/AnuGayan/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/AnuGayan/siddhi","description":"Stream Processing and Complex Event Processing Engine","fork":true,"url":"https://api.github.com/repos/AnuGayan/siddhi","forks_url":"https://api.github.com/repos/AnuGayan/siddhi/forks","keys_url":"https://api.github.com/repos/AnuGayan/siddhi/keys{/key_id}","collaborators_url":"https://api.github.com/repos/AnuGayan/siddhi/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/AnuGayan/siddhi/teams","hooks_url":"https://api.github.com/repos/AnuGayan/siddhi/hooks","issue_events_url":"https://api.github.com/repos/AnuGayan/siddhi/issues/events{/number}","events_url":"https://api.github.com/repos/AnuGayan/siddhi/events","assignees_url":"https://api.github.com/repos/AnuGayan/siddhi/assignees{/user}","branches_url":"https://api.github.com/repos/AnuGayan/siddhi/branches{/branch}","tags_url":"https://api.github.com/repos/AnuGayan/siddhi/tags","blobs_url":"https://api.github.com/repos/AnuGayan/siddhi/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/AnuGayan/siddhi/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/AnuGayan/siddhi/git/refs{/sha}","trees_url":"https://api.github.com/repos/AnuGayan/siddhi/git/trees{/sha}","statuses_url":"https://api.github.com/repos/AnuGayan/siddhi/statuses/{sha}","languages_url":"https://api.github.com/repos/AnuGayan/siddhi/languages","stargazers_url":"https://api.github.com/repos/AnuGayan/siddhi/stargazers","contributors_url":"https://api.github.com/repos/AnuGayan/siddhi/contributors","subscribers_url":"https://api.github.com/repos/AnuGayan/siddhi/subscribers","subscription_url":"https://api.github.com/repos/AnuGayan/siddhi/subscription","commits_url":"https://api.github.com/repos/AnuGayan/siddhi/commits{/sha}","git_commits_url":"https://api.github.com/repos/AnuGayan/siddhi/git/commits{/sha}","comments_url":"https://api.github.com/repos/AnuGayan/siddhi/comments{/number}","issue_comment_url":"https://api.github.com/repos/AnuGayan/siddhi/issues/comments{/number}","contents_url":"https://api.github.com/repos/AnuGayan/siddhi/contents/{+path}","compare_url":"https://api.github.com/repos/AnuGayan/siddhi/compare/{base}...{head}","merges_url":"https://api.github.com/repos/AnuGayan/siddhi/merges","archive_url":"https://api.github.com/repos/AnuGayan/siddhi/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/AnuGayan/siddhi/downloads","issues_url":"https://api.github.com/repos/AnuGayan/siddhi/issues{/number}","pulls_url":"https://api.github.com/repos/AnuGayan/siddhi/pulls{/number}","milestones_url":"https://api.github.com/repos/AnuGayan/siddhi/milestones{/number}","notifications_url":"https://api.github.com/repos/AnuGayan/siddhi/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/AnuGayan/siddhi/labels{/name}","releases_url":"https://api.github.com/repos/AnuGayan/siddhi/releases{/id}","deployments_url":"https://api.github.com/repos/AnuGayan/siddhi/deployments","created_at":"2017-09-19T14:52:59Z","updated_at":"2018-07-26T07:23:32Z","pushed_at":"2018-08-08T16:24:07Z","git_url":"git://github.com/AnuGayan/siddhi.git","ssh_url":"git@github.com:AnuGayan/siddhi.git","clone_url":"https://github.com/AnuGayan/siddhi.git","svn_url":"https://github.com/AnuGayan/siddhi","homepage":"https://wso2.github.io/siddhi/","size":19739,"stargazers_count":0,"watchers_count":0,"language":"Java","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"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","node_id":"MDc6TGljZW5zZTI="},"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"wso2:master","ref":"master","sha":"e9132d2609ebbbd73748f25b909f91ba4769f62b","user":{"login":"wso2","id":533043,"node_id":"MDEyOk9yZ2FuaXphdGlvbjUzMzA0Mw==","avatar_url":"https://avatars3.githubusercontent.com/u/533043?v=4","gravatar_id":"","url":"https://api.github.com/users/wso2","html_url":"https://github.com/wso2","followers_url":"https://api.github.com/users/wso2/followers","following_url":"https://api.github.com/users/wso2/following{/other_user}","gists_url":"https://api.github.com/users/wso2/gists{/gist_id}","starred_url":"https://api.github.com/users/wso2/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/wso2/subscriptions","organizations_url":"https://api.github.com/users/wso2/orgs","repos_url":"https://api.github.com/users/wso2/repos","events_url":"https://api.github.com/users/wso2/events{/privacy}","received_events_url":"https://api.github.com/users/wso2/received_events","type":"Organization","site_admin":false},"repo":{"id":18988631,"node_id":"MDEwOlJlcG9zaXRvcnkxODk4ODYzMQ==","name":"siddhi","full_name":"wso2/siddhi","owner":{"login":"wso2","id":533043,"node_id":"MDEyOk9yZ2FuaXphdGlvbjUzMzA0Mw==","avatar_url":"https://avatars3.githubusercontent.com/u/533043?v=4","gravatar_id":"","url":"https://api.github.com/users/wso2","html_url":"https://github.com/wso2","followers_url":"https://api.github.com/users/wso2/followers","following_url":"https://api.github.com/users/wso2/following{/other_user}","gists_url":"https://api.github.com/users/wso2/gists{/gist_id}","starred_url":"https://api.github.com/users/wso2/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/wso2/subscriptions","organizations_url":"https://api.github.com/users/wso2/orgs","repos_url":"https://api.github.com/users/wso2/repos","events_url":"https://api.github.com/users/wso2/events{/privacy}","received_events_url":"https://api.github.com/users/wso2/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/wso2/siddhi","description":"Stream Processing and Complex Event Processing Engine","fork":false,"url":"https://api.github.com/repos/wso2/siddhi","forks_url":"https://api.github.com/repos/wso2/siddhi/forks","keys_url":"https://api.github.com/repos/wso2/siddhi/keys{/key_id}","collaborators_url":"https://api.github.com/repos/wso2/siddhi/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/wso2/siddhi/teams","hooks_url":"https://api.github.com/repos/wso2/siddhi/hooks","issue_events_url":"https://api.github.com/repos/wso2/siddhi/issues/events{/number}","events_url":"https://api.github.com/repos/wso2/siddhi/events","assignees_url":"https://api.github.com/repos/wso2/siddhi/assignees{/user}","branches_url":"https://api.github.com/repos/wso2/siddhi/branches{/branch}","tags_url":"https://api.github.com/repos/wso2/siddhi/tags","blobs_url":"https://api.github.com/repos/wso2/siddhi/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/wso2/siddhi/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/wso2/siddhi/git/refs{/sha}","trees_url":"https://api.github.com/repos/wso2/siddhi/git/trees{/sha}","statuses_url":"https://api.github.com/repos/wso2/siddhi/statuses/{sha}","languages_url":"https://api.github.com/repos/wso2/siddhi/languages","stargazers_url":"https://api.github.com/repos/wso2/siddhi/stargazers","contributors_url":"https://api.github.com/repos/wso2/siddhi/contributors","subscribers_url":"https://api.github.com/repos/wso2/siddhi/subscribers","subscription_url":"https://api.github.com/repos/wso2/siddhi/subscription","commits_url":"https://api.github.com/repos/wso2/siddhi/commits{/sha}","git_commits_url":"https://api.github.com/repos/wso2/siddhi/git/commits{/sha}","comments_url":"https://api.github.com/repos/wso2/siddhi/comments{/number}","issue_comment_url":"https://api.github.com/repos/wso2/siddhi/issues/comments{/number}","contents_url":"https://api.github.com/repos/wso2/siddhi/contents/{+path}","compare_url":"https://api.github.com/repos/wso2/siddhi/compare/{base}...{head}","merges_url":"https://api.github.com/repos/wso2/siddhi/merges","archive_url":"https://api.github.com/repos/wso2/siddhi/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/wso2/siddhi/downloads","issues_url":"https://api.github.com/repos/wso2/siddhi/issues{/number}","pulls_url":"https://api.github.com/repos/wso2/siddhi/pulls{/number}","milestones_url":"https://api.github.com/repos/wso2/siddhi/milestones{/number}","notifications_url":"https://api.github.com/repos/wso2/siddhi/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/wso2/siddhi/labels{/name}","releases_url":"https://api.github.com/repos/wso2/siddhi/releases{/id}","deployments_url":"https://api.github.com/repos/wso2/siddhi/deployments","created_at":"2014-04-21T09:51:36Z","updated_at":"2018-08-08T08:10:20Z","pushed_at":"2018-08-08T16:24:09Z","git_url":"git://github.com/wso2/siddhi.git","ssh_url":"git@github.com:wso2/siddhi.git","clone_url":"https://github.com/wso2/siddhi.git","svn_url":"https://github.com/wso2/siddhi","homepage":"https://wso2.github.io/siddhi/","size":31179,"stargazers_count":486,"watchers_count":486,"language":"Java","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":295,"mirror_url":null,"archived":false,"open_issues_count":69,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"forks":295,"open_issues":69,"watchers":486,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/wso2/siddhi/pulls/881"},"html":{"href":"https://github.com/wso2/siddhi/pull/881"},"issue":{"href":"https://api.github.com/repos/wso2/siddhi/issues/881"},"comments":{"href":"https://api.github.com/repos/wso2/siddhi/issues/881/comments"},"review_comments":{"href":"https://api.github.com/repos/wso2/siddhi/pulls/881/comments"},"review_comment":{"href":"https://api.github.com/repos/wso2/siddhi/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/wso2/siddhi/pulls/881/commits"},"statuses":{"href":"https://api.github.com/repos/wso2/siddhi/statuses/c2983751ec88d7f7fa335608d81105b51cdd1e2f"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"AnuGayan"}}