{"action":"created","comment":{"url":"https://api.github.com/repos/apache/apex-malhar/pulls/comments/83748954","pull_request_review_id":4572133,"id":83748954,"diff_hunk":"@@ -0,0 +1,771 @@\n+/**\n+ * Licensed to the Apache Software Foundation (ASF) under one\n+ * or more contributor license agreements.  See the NOTICE file\n+ * distributed with this work for additional information\n+ * regarding copyright ownership.  The ASF licenses this file\n+ * to you under the Apache License, Version 2.0 (the\n+ * \"License\"); you may not use this file except in compliance\n+ * with the License.  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+package org.apache.apex.malhar.sql.codegen;\n+\n+import java.io.IOException;\n+import java.util.List;\n+import java.util.Map;\n+\n+import org.codehaus.jettison.json.JSONException;\n+\n+import org.apache.apex.malhar.sql.schema.TupleSchemaRegistry;\n+import org.apache.commons.io.IOUtils;\n+import org.apache.hadoop.fs.FSDataInputStream;\n+import org.apache.hadoop.fs.FSDataOutputStream;\n+import org.apache.xbean.asm5.ClassWriter;\n+import org.apache.xbean.asm5.Opcodes;\n+import org.apache.xbean.asm5.tree.ClassNode;\n+import org.apache.xbean.asm5.tree.FieldInsnNode;\n+import org.apache.xbean.asm5.tree.FieldNode;\n+import org.apache.xbean.asm5.tree.InsnNode;\n+import org.apache.xbean.asm5.tree.IntInsnNode;\n+import org.apache.xbean.asm5.tree.JumpInsnNode;\n+import org.apache.xbean.asm5.tree.LabelNode;\n+import org.apache.xbean.asm5.tree.LdcInsnNode;\n+import org.apache.xbean.asm5.tree.MethodInsnNode;\n+import org.apache.xbean.asm5.tree.MethodNode;\n+import org.apache.xbean.asm5.tree.TypeInsnNode;\n+import org.apache.xbean.asm5.tree.VarInsnNode;\n+\n+import com.google.common.collect.ImmutableMap;\n+import com.google.common.collect.Maps;\n+\n+/**\n+ * Creates a bean class on fly.\n+ *\n+ * @since 3.1.0\n+ */\n+public class BeanClassGenerator\n+{\n+  public static final ImmutableMap<String, Character> PRIMITIVE_TYPES;\n+\n+  static {\n+    Map<String, Character> types = Maps.newHashMap();\n+    types.put(\"boolean\", 'Z');\n+    types.put(\"char\", 'C');\n+    types.put(\"byte\", 'B');\n+    types.put(\"short\", 'S');\n+    types.put(\"int\", 'I');\n+    types.put(\"float\", 'F');\n+    types.put(\"long\", 'J');\n+    types.put(\"double\", 'D');\n+    PRIMITIVE_TYPES = ImmutableMap.copyOf(types);\n+  }\n+\n+  public static byte[] createAndWriteBeanClass(String fqcn, List<TupleSchemaRegistry.SQLFieldInfo> fieldList)\n+    throws IOException, JSONException\n+  {\n+    return createAndWriteBeanClass(fqcn, fieldList, null);\n+  }\n+\n+  /**\n+   * Creates a class from the json and writes it to the output stream.\n+   *\n+   * @param fqcn         fully qualified class name\n+   * @param fieldList    json describing the class\n+   * @param outputStream stream to which the class is persisted\n+   * @throws JSONException\n+   * @throws IOException\n+   */\n+  @SuppressWarnings(\"unchecked\")\n+  public static byte[] createAndWriteBeanClass(String fqcn, List<TupleSchemaRegistry.SQLFieldInfo> fieldList,\n+      FSDataOutputStream outputStream) throws JSONException, IOException\n+  {\n+    ClassNode classNode = new ClassNode();\n+\n+    classNode.version = Opcodes.V1_6;  //generated class will only run on JRE 1.6 or above\n+    classNode.access = Opcodes.ACC_PUBLIC;\n+\n+    classNode.name = fqcn.replace('.', '/');\n+    classNode.superName = \"java/lang/Object\";\n+\n+    // add default constructor\n+    MethodNode constructorNode = new MethodNode(Opcodes.ACC_PUBLIC, \"<init>\", \"()V\", null, null);\n+    constructorNode.instructions.add(new VarInsnNode(Opcodes.ALOAD, 0));\n+    constructorNode.instructions\n+      .add(new MethodInsnNode(Opcodes.INVOKESPECIAL, \"java/lang/Object\", \"<init>\", \"()V\", false));\n+    constructorNode.instructions.add(new InsnNode(Opcodes.RETURN));\n+    classNode.methods.add(constructorNode);\n+\n+    //for each field in json add a field to this class and a getter and setter for it.\n+\n+    for (TupleSchemaRegistry.SQLFieldInfo fieldInfo : fieldList) {\n+      String fieldName = fieldInfo.getColumnName();\n+      String fieldType = fieldInfo.getType().getJavaType().getName();\n+      String fieldJavaType = getJavaType(fieldType);\n+\n+      // Add private field\n+      FieldNode fieldNode = new FieldNode(Opcodes.ACC_PRIVATE, fieldName, fieldJavaType, null, null);\n+      classNode.fields.add(fieldNode);\n+\n+      String fieldNameForMethods = Character.toUpperCase(fieldName.charAt(0)) + fieldName.substring(1);\n+\n+      switch (fieldType) {\n+        case \"boolean\":\n+          addIntGetterNSetter(classNode, fieldName, fieldNameForMethods, fieldJavaType, true);\n+          break;\n+        case \"byte\":\n+        case \"char\":\n+        case \"short\":\n+        case \"int\":\n+          addIntGetterNSetter(classNode, fieldName, fieldNameForMethods, fieldJavaType, false);\n+          break;\n+        case \"long\":\n+          addLongGetterNSetter(classNode, fieldName, fieldNameForMethods, fieldJavaType);\n+          break;\n+        case \"float\":\n+          addFloatGetterNSetter(classNode, fieldName, fieldNameForMethods, fieldJavaType);\n+          break;\n+        case \"double\":\n+          addDoubleGetterNSetter(classNode, fieldName, fieldNameForMethods, fieldJavaType);\n+          break;\n+        default:\n+          if (fieldJavaType.equals(getJavaType(\"java.util.Date\"))) {\n+            addDateFields(classNode, fieldName, fieldNameForMethods, \"java/util/Date\");\n+          } else {\n+            addObjectGetterNSetter(classNode, fieldName, fieldNameForMethods, fieldJavaType);\n+          }\n+          break;\n+      }\n+    }\n+\n+    addToStringMethod(classNode, fieldList);\n+    addHashCodeMethod(classNode, fieldList);\n+    addEqualsMethod(classNode, fieldList);\n+\n+    //Write the class\n+    ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES);\n+    classNode.accept(cw);\n+    cw.visitEnd();\n+\n+    byte[] classBytes = cw.toByteArray();\n+\n+    if (outputStream != null) {\n+      outputStream.write(classBytes);\n+      outputStream.close();\n+    }\n+\n+    return classBytes;\n+  }\n+\n+  @SuppressWarnings(\"unchecked\")\n+  private static void addDateFields(ClassNode classNode, String fieldName, String fieldNameForMethods, String type)\n+  {\n+    FieldNode fieldNodeSec = new FieldNode(Opcodes.ACC_PRIVATE, fieldName + \"Sec\", getJavaType(\"java.lang.Integer\"),\n+        null, null);\n+    classNode.fields.add(fieldNodeSec);\n+    FieldNode fieldNodeMs = new FieldNode(Opcodes.ACC_PRIVATE, fieldName + \"Ms\", getJavaType(\"java.lang.Long\"), null,\n+        null);\n+    classNode.fields.add(fieldNodeMs);\n+\n+    // Create getter for Date\n+    MethodNode getterNodeDate = new MethodNode(Opcodes.ACC_PUBLIC, \"get\" + fieldNameForMethods, \"()L\" + type + \";\",\n+        null, null);\n+    getterNodeDate.instructions.add(new VarInsnNode(Opcodes.ALOAD, 0));\n+    getterNodeDate.instructions.add(new FieldInsnNode(Opcodes.GETFIELD, classNode.name, fieldName, \"L\" + type + \";\"));\n+    getterNodeDate.instructions.add(new InsnNode(Opcodes.ARETURN));\n+    classNode.methods.add(getterNodeDate);\n+\n+    // Create getter for Sec\n+    MethodNode getterNodeSec = new MethodNode(Opcodes.ACC_PUBLIC, \"get\" + fieldNameForMethods + \"Sec\",\n+        \"()Ljava/lang/Integer;\", null, null);\n+    getterNodeSec.instructions.add(new VarInsnNode(Opcodes.ALOAD, 0));\n+    getterNodeSec.instructions\n+      .add(new FieldInsnNode(Opcodes.GETFIELD, classNode.name, fieldName + \"Sec\", \"Ljava/lang/Integer;\"));\n+    getterNodeSec.instructions.add(new InsnNode(Opcodes.ARETURN));\n+    classNode.methods.add(getterNodeSec);\n+\n+    // Create getter for Ms\n+    MethodNode getterNodeMs = new MethodNode(Opcodes.ACC_PUBLIC, \"get\" + fieldNameForMethods + \"Ms\",\n+        \"()Ljava/lang/Long;\", null, null);\n+    getterNodeMs.instructions.add(new VarInsnNode(Opcodes.ALOAD, 0));\n+    getterNodeMs.instructions\n+      .add(new FieldInsnNode(Opcodes.GETFIELD, classNode.name, fieldName + \"Ms\", \"Ljava/lang/Long;\"));\n+    getterNodeMs.instructions.add(new InsnNode(Opcodes.ARETURN));\n+    classNode.methods.add(getterNodeMs);\n+\n+    // Create setter for Date\n+    MethodNode setterNodeDate = new MethodNode(Opcodes.ACC_PUBLIC, \"set\" + fieldNameForMethods,\n+        \"(L\" + type + \";)V\", null, null);\n+    setterNodeDate.instructions.add(new VarInsnNode(Opcodes.ALOAD, 0));\n+    setterNodeDate.instructions.add(new VarInsnNode(Opcodes.ALOAD, 1));\n+    setterNodeDate.instructions.add(new FieldInsnNode(Opcodes.PUTFIELD, classNode.name, fieldName, \"L\" + type + \";\"));\n+\n+    setterNodeDate.instructions.add(new VarInsnNode(Opcodes.ALOAD, 0));\n+    setterNodeDate.instructions.add(new VarInsnNode(Opcodes.ALOAD, 1));\n+    setterNodeDate.instructions.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, type, \"getTime\", \"()J\", false));\n+    setterNodeDate.instructions.add(new LdcInsnNode(new Long(1000)));\n+    setterNodeDate.instructions.add(new InsnNode(Opcodes.LDIV));\n+    setterNodeDate.instructions.add(new InsnNode(Opcodes.L2I));\n+    setterNodeDate.instructions\n+      .add(new MethodInsnNode(Opcodes.INVOKESTATIC, \"java/lang/Integer\", \"valueOf\", \"(I)Ljava/lang/Integer;\", false));\n+    setterNodeDate.instructions\n+      .add(new FieldInsnNode(Opcodes.PUTFIELD, classNode.name, fieldName + \"Sec\", \"Ljava/lang/Integer;\"));\n+\n+    setterNodeDate.instructions.add(new VarInsnNode(Opcodes.ALOAD, 0));\n+    setterNodeDate.instructions.add(new VarInsnNode(Opcodes.ALOAD, 1));\n+    setterNodeDate.instructions.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, type, \"getTime\", \"()J\", false));\n+    setterNodeDate.instructions\n+      .add(new MethodInsnNode(Opcodes.INVOKESTATIC, \"java/lang/Long\", \"valueOf\", \"(J)Ljava/lang/Long;\", false));\n+    setterNodeDate.instructions\n+      .add(new FieldInsnNode(Opcodes.PUTFIELD, classNode.name, fieldName + \"Ms\", \"Ljava/lang/Long;\"));\n+\n+    setterNodeDate.instructions.add(new InsnNode(Opcodes.RETURN));\n+    classNode.methods.add(setterNodeDate);\n+\n+    // Create setter for Sec\n+    MethodNode setterNodeSec = new MethodNode(Opcodes.ACC_PUBLIC, \"set\" + fieldNameForMethods + \"Sec\",\n+        \"(Ljava/lang/Integer;)V\", null, null);\n+    setterNodeSec.instructions.add(new VarInsnNode(Opcodes.ALOAD, 0));\n+    setterNodeSec.instructions.add(new TypeInsnNode(Opcodes.NEW, type));\n+    setterNodeSec.instructions.add(new InsnNode(Opcodes.DUP));\n+    setterNodeSec.instructions.add(new VarInsnNode(Opcodes.ALOAD, 1));\n+    setterNodeSec.instructions\n+      .add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, \"java/lang/Integer\", \"intValue\", \"()I\", false));\n+    setterNodeSec.instructions.add(new InsnNode(Opcodes.I2L));\n+    setterNodeSec.instructions.add(new LdcInsnNode(new Long(1000)));\n+    setterNodeSec.instructions.add(new InsnNode(Opcodes.LMUL));\n+    setterNodeSec.instructions\n+      .add(new MethodInsnNode(Opcodes.INVOKESPECIAL, \"java/util/Date\", \"<init>\", \"(J)V\", false));\n+    setterNodeSec.instructions.add(new FieldInsnNode(Opcodes.PUTFIELD, classNode.name, fieldName, \"L\" + type + \";\"));\n+\n+    setterNodeSec.instructions.add(new VarInsnNode(Opcodes.ALOAD, 0));\n+    setterNodeSec.instructions.add(new VarInsnNode(Opcodes.ALOAD, 1));\n+    setterNodeSec.instructions\n+      .add(new FieldInsnNode(Opcodes.PUTFIELD, classNode.name, fieldName + \"Sec\", \"Ljava/lang/Integer;\"));\n+\n+    setterNodeSec.instructions.add(new VarInsnNode(Opcodes.ALOAD, 0));\n+    setterNodeSec.instructions.add(new TypeInsnNode(Opcodes.NEW, \"java/lang/Long\"));\n+    setterNodeSec.instructions.add(new InsnNode(Opcodes.DUP));\n+    setterNodeSec.instructions.add(new VarInsnNode(Opcodes.ALOAD, 1));\n+    setterNodeSec.instructions\n+      .add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, \"java/lang/Integer\", \"intValue\", \"()I\", false));\n+    setterNodeSec.instructions.add(new InsnNode(Opcodes.I2L));\n+    setterNodeSec.instructions.add(new LdcInsnNode(new Long(1000)));\n+    setterNodeSec.instructions.add(new InsnNode(Opcodes.LMUL));\n+    setterNodeSec.instructions\n+      .add(new MethodInsnNode(Opcodes.INVOKESPECIAL, \"java/lang/Long\", \"<init>\", \"(J)V\", false));\n+    setterNodeSec.instructions\n+      .add(new FieldInsnNode(Opcodes.PUTFIELD, classNode.name, fieldName + \"Ms\", \"Ljava/lang/Long;\"));\n+\n+    setterNodeSec.instructions.add(new InsnNode(Opcodes.RETURN));\n+    classNode.methods.add(setterNodeSec);\n+\n+    // Create setter for Ms\n+    MethodNode setterNodeMs = new MethodNode(Opcodes.ACC_PUBLIC, \"set\" + fieldNameForMethods + \"Ms\",\n+        \"(Ljava/lang/Long;)V\", null, null);\n+    setterNodeMs.instructions.add(new VarInsnNode(Opcodes.ALOAD, 0));\n+    setterNodeMs.instructions.add(new TypeInsnNode(Opcodes.NEW, type));\n+    setterNodeMs.instructions.add(new InsnNode(Opcodes.DUP));\n+    setterNodeMs.instructions.add(new VarInsnNode(Opcodes.ALOAD, 1));\n+    setterNodeMs.instructions\n+      .add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, \"java/lang/Long\", \"longValue\", \"()J\", false));\n+    setterNodeMs.instructions.add(new MethodInsnNode(Opcodes.INVOKESPECIAL, \"java/util/Date\", \"<init>\", \"(J)V\", false));\n+    setterNodeMs.instructions.add(new FieldInsnNode(Opcodes.PUTFIELD, classNode.name, fieldName, \"L\" + type + \";\"));\n+\n+    setterNodeMs.instructions.add(new VarInsnNode(Opcodes.ALOAD, 0));\n+    setterNodeMs.instructions.add(new TypeInsnNode(Opcodes.NEW, \"java/lang/Integer\"));\n+    setterNodeMs.instructions.add(new InsnNode(Opcodes.DUP));\n+    setterNodeMs.instructions.add(new VarInsnNode(Opcodes.ALOAD, 1));\n+    setterNodeMs.instructions\n+      .add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, \"java/lang/Long\", \"longValue\", \"()J\", false));\n+    setterNodeMs.instructions.add(new LdcInsnNode(new Long(1000)));\n+    setterNodeMs.instructions.add(new InsnNode(Opcodes.LDIV));\n+    setterNodeMs.instructions.add(new InsnNode(Opcodes.L2I));\n+    setterNodeMs.instructions\n+      .add(new MethodInsnNode(Opcodes.INVOKESPECIAL, \"java/lang/Integer\", \"<init>\", \"(I)V\", false));\n+    setterNodeMs.instructions\n+      .add(new FieldInsnNode(Opcodes.PUTFIELD, classNode.name, fieldName + \"Sec\", \"Ljava/lang/Integer;\"));\n+\n+    setterNodeMs.instructions.add(new VarInsnNode(Opcodes.ALOAD, 0));\n+    setterNodeMs.instructions.add(new VarInsnNode(Opcodes.ALOAD, 1));\n+    setterNodeMs.instructions\n+      .add(new FieldInsnNode(Opcodes.PUTFIELD, classNode.name, fieldName + \"Ms\", \"Ljava/lang/Long;\"));\n+\n+    setterNodeMs.instructions.add(new InsnNode(Opcodes.RETURN));\n+    classNode.methods.add(setterNodeMs);\n+  }\n+\n+  @SuppressWarnings(\"unchecked\")\n+  private static void addIntGetterNSetter(ClassNode classNode, String fieldName, String fieldNameForMethods,","path":"sql/src/main/java/org/apache/apex/malhar/sql/codegen/BeanClassGenerator.java","position":331,"original_position":306,"commit_id":"6e82fbd6ee2b15baa53fdc8a8af338326a322f62","original_commit_id":"0571f6b6bfd09034b18ae1d20a52e0f618fda164","user":{"login":"siyuanh","id":5375712,"avatar_url":"https://avatars.githubusercontent.com/u/5375712?v=3","gravatar_id":"","url":"https://api.github.com/users/siyuanh","html_url":"https://github.com/siyuanh","followers_url":"https://api.github.com/users/siyuanh/followers","following_url":"https://api.github.com/users/siyuanh/following{/other_user}","gists_url":"https://api.github.com/users/siyuanh/gists{/gist_id}","starred_url":"https://api.github.com/users/siyuanh/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/siyuanh/subscriptions","organizations_url":"https://api.github.com/users/siyuanh/orgs","repos_url":"https://api.github.com/users/siyuanh/repos","events_url":"https://api.github.com/users/siyuanh/events{/privacy}","received_events_url":"https://api.github.com/users/siyuanh/received_events","type":"User","site_admin":false},"body":"Except return opcodes I don't see any other differences. And the this method here is used for all byte, boolean, char and int type which is already confusing. I would prefer Yogi's suggestion","created_at":"2016-10-17T22:33:59Z","updated_at":"2016-10-17T22:33:59Z","html_url":"https://github.com/apache/apex-malhar/pull/432#discussion_r83748954","pull_request_url":"https://api.github.com/repos/apache/apex-malhar/pulls/432","_links":{"self":{"href":"https://api.github.com/repos/apache/apex-malhar/pulls/comments/83748954"},"html":{"href":"https://github.com/apache/apex-malhar/pull/432#discussion_r83748954"},"pull_request":{"href":"https://api.github.com/repos/apache/apex-malhar/pulls/432"}}},"pull_request":{"url":"https://api.github.com/repos/apache/apex-malhar/pulls/432","id":87142387,"html_url":"https://github.com/apache/apex-malhar/pull/432","diff_url":"https://github.com/apache/apex-malhar/pull/432.diff","patch_url":"https://github.com/apache/apex-malhar/pull/432.patch","issue_url":"https://api.github.com/repos/apache/apex-malhar/issues/432","number":432,"state":"open","locked":false,"title":"[Review Only] APEXMALHAR-1818 SQL Support for converting given SQL statement to APEX DAG","user":{"login":"chinmaykolhatkar","id":12393897,"avatar_url":"https://avatars.githubusercontent.com/u/12393897?v=3","gravatar_id":"","url":"https://api.github.com/users/chinmaykolhatkar","html_url":"https://github.com/chinmaykolhatkar","followers_url":"https://api.github.com/users/chinmaykolhatkar/followers","following_url":"https://api.github.com/users/chinmaykolhatkar/following{/other_user}","gists_url":"https://api.github.com/users/chinmaykolhatkar/gists{/gist_id}","starred_url":"https://api.github.com/users/chinmaykolhatkar/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/chinmaykolhatkar/subscriptions","organizations_url":"https://api.github.com/users/chinmaykolhatkar/orgs","repos_url":"https://api.github.com/users/chinmaykolhatkar/repos","events_url":"https://api.github.com/users/chinmaykolhatkar/events{/privacy}","received_events_url":"https://api.github.com/users/chinmaykolhatkar/received_events","type":"User","site_admin":false},"body":"Features implemented are:\r\n1. SELECT STATEMENT\r\n2. INSERT STATEMENT\r\n3. INNER JOIN with non-empty equi join condition\r\n4. WHERE clause\r\n5. SCALAR functions implemented in calcite are ready to use\r\n6. Custom scalar functions can be registered.\r\n7. Endpoint can be File OR Kafka OR Streaming Port for both input and output\r\n8. CSV Data Format implemented for both input and output side.\r\n9. Static loading of calcite JDBC driver.\r\n10. Testing on local as well as cluster mode.","created_at":"2016-09-28T15:22:49Z","updated_at":"2016-10-17T22:33:59Z","closed_at":null,"merged_at":null,"merge_commit_sha":"6327d55fe5806488ef1d5f43f5c9d6cfad01fc2f","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/apache/apex-malhar/pulls/432/commits","review_comments_url":"https://api.github.com/repos/apache/apex-malhar/pulls/432/comments","review_comment_url":"https://api.github.com/repos/apache/apex-malhar/pulls/comments{/number}","comments_url":"https://api.github.com/repos/apache/apex-malhar/issues/432/comments","statuses_url":"https://api.github.com/repos/apache/apex-malhar/statuses/6e82fbd6ee2b15baa53fdc8a8af338326a322f62","head":{"label":"chinmaykolhatkar:calcite","ref":"calcite","sha":"6e82fbd6ee2b15baa53fdc8a8af338326a322f62","user":{"login":"chinmaykolhatkar","id":12393897,"avatar_url":"https://avatars.githubusercontent.com/u/12393897?v=3","gravatar_id":"","url":"https://api.github.com/users/chinmaykolhatkar","html_url":"https://github.com/chinmaykolhatkar","followers_url":"https://api.github.com/users/chinmaykolhatkar/followers","following_url":"https://api.github.com/users/chinmaykolhatkar/following{/other_user}","gists_url":"https://api.github.com/users/chinmaykolhatkar/gists{/gist_id}","starred_url":"https://api.github.com/users/chinmaykolhatkar/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/chinmaykolhatkar/subscriptions","organizations_url":"https://api.github.com/users/chinmaykolhatkar/orgs","repos_url":"https://api.github.com/users/chinmaykolhatkar/repos","events_url":"https://api.github.com/users/chinmaykolhatkar/events{/privacy}","received_events_url":"https://api.github.com/users/chinmaykolhatkar/received_events","type":"User","site_admin":false},"repo":{"id":43486479,"name":"apex-malhar","full_name":"chinmaykolhatkar/apex-malhar","owner":{"login":"chinmaykolhatkar","id":12393897,"avatar_url":"https://avatars.githubusercontent.com/u/12393897?v=3","gravatar_id":"","url":"https://api.github.com/users/chinmaykolhatkar","html_url":"https://github.com/chinmaykolhatkar","followers_url":"https://api.github.com/users/chinmaykolhatkar/followers","following_url":"https://api.github.com/users/chinmaykolhatkar/following{/other_user}","gists_url":"https://api.github.com/users/chinmaykolhatkar/gists{/gist_id}","starred_url":"https://api.github.com/users/chinmaykolhatkar/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/chinmaykolhatkar/subscriptions","organizations_url":"https://api.github.com/users/chinmaykolhatkar/orgs","repos_url":"https://api.github.com/users/chinmaykolhatkar/repos","events_url":"https://api.github.com/users/chinmaykolhatkar/events{/privacy}","received_events_url":"https://api.github.com/users/chinmaykolhatkar/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/chinmaykolhatkar/apex-malhar","description":"Mirror of Apache Apex malhar (Incubating)","fork":true,"url":"https://api.github.com/repos/chinmaykolhatkar/apex-malhar","forks_url":"https://api.github.com/repos/chinmaykolhatkar/apex-malhar/forks","keys_url":"https://api.github.com/repos/chinmaykolhatkar/apex-malhar/keys{/key_id}","collaborators_url":"https://api.github.com/repos/chinmaykolhatkar/apex-malhar/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/chinmaykolhatkar/apex-malhar/teams","hooks_url":"https://api.github.com/repos/chinmaykolhatkar/apex-malhar/hooks","issue_events_url":"https://api.github.com/repos/chinmaykolhatkar/apex-malhar/issues/events{/number}","events_url":"https://api.github.com/repos/chinmaykolhatkar/apex-malhar/events","assignees_url":"https://api.github.com/repos/chinmaykolhatkar/apex-malhar/assignees{/user}","branches_url":"https://api.github.com/repos/chinmaykolhatkar/apex-malhar/branches{/branch}","tags_url":"https://api.github.com/repos/chinmaykolhatkar/apex-malhar/tags","blobs_url":"https://api.github.com/repos/chinmaykolhatkar/apex-malhar/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/chinmaykolhatkar/apex-malhar/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/chinmaykolhatkar/apex-malhar/git/refs{/sha}","trees_url":"https://api.github.com/repos/chinmaykolhatkar/apex-malhar/git/trees{/sha}","statuses_url":"https://api.github.com/repos/chinmaykolhatkar/apex-malhar/statuses/{sha}","languages_url":"https://api.github.com/repos/chinmaykolhatkar/apex-malhar/languages","stargazers_url":"https://api.github.com/repos/chinmaykolhatkar/apex-malhar/stargazers","contributors_url":"https://api.github.com/repos/chinmaykolhatkar/apex-malhar/contributors","subscribers_url":"https://api.github.com/repos/chinmaykolhatkar/apex-malhar/subscribers","subscription_url":"https://api.github.com/repos/chinmaykolhatkar/apex-malhar/subscription","commits_url":"https://api.github.com/repos/chinmaykolhatkar/apex-malhar/commits{/sha}","git_commits_url":"https://api.github.com/repos/chinmaykolhatkar/apex-malhar/git/commits{/sha}","comments_url":"https://api.github.com/repos/chinmaykolhatkar/apex-malhar/comments{/number}","issue_comment_url":"https://api.github.com/repos/chinmaykolhatkar/apex-malhar/issues/comments{/number}","contents_url":"https://api.github.com/repos/chinmaykolhatkar/apex-malhar/contents/{+path}","compare_url":"https://api.github.com/repos/chinmaykolhatkar/apex-malhar/compare/{base}...{head}","merges_url":"https://api.github.com/repos/chinmaykolhatkar/apex-malhar/merges","archive_url":"https://api.github.com/repos/chinmaykolhatkar/apex-malhar/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/chinmaykolhatkar/apex-malhar/downloads","issues_url":"https://api.github.com/repos/chinmaykolhatkar/apex-malhar/issues{/number}","pulls_url":"https://api.github.com/repos/chinmaykolhatkar/apex-malhar/pulls{/number}","milestones_url":"https://api.github.com/repos/chinmaykolhatkar/apex-malhar/milestones{/number}","notifications_url":"https://api.github.com/repos/chinmaykolhatkar/apex-malhar/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/chinmaykolhatkar/apex-malhar/labels{/name}","releases_url":"https://api.github.com/repos/chinmaykolhatkar/apex-malhar/releases{/id}","deployments_url":"https://api.github.com/repos/chinmaykolhatkar/apex-malhar/deployments","created_at":"2015-10-01T08:43:18Z","updated_at":"2016-06-07T18:33:11Z","pushed_at":"2016-10-17T14:16:56Z","git_url":"git://github.com/chinmaykolhatkar/apex-malhar.git","ssh_url":"git@github.com:chinmaykolhatkar/apex-malhar.git","clone_url":"https://github.com/chinmaykolhatkar/apex-malhar.git","svn_url":"https://github.com/chinmaykolhatkar/apex-malhar","homepage":null,"size":87510,"stargazers_count":0,"watchers_count":0,"language":"Java","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":true,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"apache:master","ref":"master","sha":"2153cd6babadf11e7be63a137daa7dd2c3ef7230","user":{"login":"apache","id":47359,"avatar_url":"https://avatars.githubusercontent.com/u/47359?v=3","gravatar_id":"","url":"https://api.github.com/users/apache","html_url":"https://github.com/apache","followers_url":"https://api.github.com/users/apache/followers","following_url":"https://api.github.com/users/apache/following{/other_user}","gists_url":"https://api.github.com/users/apache/gists{/gist_id}","starred_url":"https://api.github.com/users/apache/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/apache/subscriptions","organizations_url":"https://api.github.com/users/apache/orgs","repos_url":"https://api.github.com/users/apache/repos","events_url":"https://api.github.com/users/apache/events{/privacy}","received_events_url":"https://api.github.com/users/apache/received_events","type":"Organization","site_admin":false},"repo":{"id":41348334,"name":"apex-malhar","full_name":"apache/apex-malhar","owner":{"login":"apache","id":47359,"avatar_url":"https://avatars.githubusercontent.com/u/47359?v=3","gravatar_id":"","url":"https://api.github.com/users/apache","html_url":"https://github.com/apache","followers_url":"https://api.github.com/users/apache/followers","following_url":"https://api.github.com/users/apache/following{/other_user}","gists_url":"https://api.github.com/users/apache/gists{/gist_id}","starred_url":"https://api.github.com/users/apache/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/apache/subscriptions","organizations_url":"https://api.github.com/users/apache/orgs","repos_url":"https://api.github.com/users/apache/repos","events_url":"https://api.github.com/users/apache/events{/privacy}","received_events_url":"https://api.github.com/users/apache/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/apache/apex-malhar","description":"Mirror of Apache Apex malhar","fork":false,"url":"https://api.github.com/repos/apache/apex-malhar","forks_url":"https://api.github.com/repos/apache/apex-malhar/forks","keys_url":"https://api.github.com/repos/apache/apex-malhar/keys{/key_id}","collaborators_url":"https://api.github.com/repos/apache/apex-malhar/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/apache/apex-malhar/teams","hooks_url":"https://api.github.com/repos/apache/apex-malhar/hooks","issue_events_url":"https://api.github.com/repos/apache/apex-malhar/issues/events{/number}","events_url":"https://api.github.com/repos/apache/apex-malhar/events","assignees_url":"https://api.github.com/repos/apache/apex-malhar/assignees{/user}","branches_url":"https://api.github.com/repos/apache/apex-malhar/branches{/branch}","tags_url":"https://api.github.com/repos/apache/apex-malhar/tags","blobs_url":"https://api.github.com/repos/apache/apex-malhar/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/apache/apex-malhar/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/apache/apex-malhar/git/refs{/sha}","trees_url":"https://api.github.com/repos/apache/apex-malhar/git/trees{/sha}","statuses_url":"https://api.github.com/repos/apache/apex-malhar/statuses/{sha}","languages_url":"https://api.github.com/repos/apache/apex-malhar/languages","stargazers_url":"https://api.github.com/repos/apache/apex-malhar/stargazers","contributors_url":"https://api.github.com/repos/apache/apex-malhar/contributors","subscribers_url":"https://api.github.com/repos/apache/apex-malhar/subscribers","subscription_url":"https://api.github.com/repos/apache/apex-malhar/subscription","commits_url":"https://api.github.com/repos/apache/apex-malhar/commits{/sha}","git_commits_url":"https://api.github.com/repos/apache/apex-malhar/git/commits{/sha}","comments_url":"https://api.github.com/repos/apache/apex-malhar/comments{/number}","issue_comment_url":"https://api.github.com/repos/apache/apex-malhar/issues/comments{/number}","contents_url":"https://api.github.com/repos/apache/apex-malhar/contents/{+path}","compare_url":"https://api.github.com/repos/apache/apex-malhar/compare/{base}...{head}","merges_url":"https://api.github.com/repos/apache/apex-malhar/merges","archive_url":"https://api.github.com/repos/apache/apex-malhar/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/apache/apex-malhar/downloads","issues_url":"https://api.github.com/repos/apache/apex-malhar/issues{/number}","pulls_url":"https://api.github.com/repos/apache/apex-malhar/pulls{/number}","milestones_url":"https://api.github.com/repos/apache/apex-malhar/milestones{/number}","notifications_url":"https://api.github.com/repos/apache/apex-malhar/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/apache/apex-malhar/labels{/name}","releases_url":"https://api.github.com/repos/apache/apex-malhar/releases{/id}","deployments_url":"https://api.github.com/repos/apache/apex-malhar/deployments","created_at":"2015-08-25T07:00:05Z","updated_at":"2016-10-12T15:30:37Z","pushed_at":"2016-10-17T18:06:00Z","git_url":"git://github.com/apache/apex-malhar.git","ssh_url":"git@github.com:apache/apex-malhar.git","clone_url":"https://github.com/apache/apex-malhar.git","svn_url":"https://github.com/apache/apex-malhar","homepage":"","size":98745,"stargazers_count":60,"watchers_count":60,"language":"Java","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":true,"forks_count":101,"mirror_url":"git://git.apache.org/incubator-apex-malhar.git","open_issues_count":33,"forks":101,"open_issues":33,"watchers":60,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/apache/apex-malhar/pulls/432"},"html":{"href":"https://github.com/apache/apex-malhar/pull/432"},"issue":{"href":"https://api.github.com/repos/apache/apex-malhar/issues/432"},"comments":{"href":"https://api.github.com/repos/apache/apex-malhar/issues/432/comments"},"review_comments":{"href":"https://api.github.com/repos/apache/apex-malhar/pulls/432/comments"},"review_comment":{"href":"https://api.github.com/repos/apache/apex-malhar/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/apache/apex-malhar/pulls/432/commits"},"statuses":{"href":"https://api.github.com/repos/apache/apex-malhar/statuses/6e82fbd6ee2b15baa53fdc8a8af338326a322f62"}}}}
{"actor":{"display_login":"siyuanh"}}