{"action":"created","comment":{"url":"https://api.github.com/repos/linkedin/gobblin/pulls/comments/67543827","id":67543827,"diff_hunk":"@@ -0,0 +1,297 @@\n+/*\n+ * Copyright (C) 2014-2016 LinkedIn Corp. All rights reserved.\n+ *\n+ * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use\n+ * this file except in compliance with the License. You may obtain a copy of the\n+ * License at  http://www.apache.org/licenses/LICENSE-2.0\n+ *\n+ * Unless required by applicable law or agreed to in writing, software distributed\n+ * under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR\n+ * CONDITIONS OF ANY KIND, either express or implied.\n+ */\n+package gobblin.source.extractor.extract.jdbc;\n+\n+import java.io.IOException;\n+import java.util.Arrays;\n+import java.util.Iterator;\n+import java.util.List;\n+import java.util.Map;\n+\n+import org.apache.commons.lang3.StringUtils;\n+import org.slf4j.Logger;\n+import org.slf4j.LoggerFactory;\n+\n+import com.google.common.base.Preconditions;\n+import com.google.common.collect.ImmutableMap;\n+import com.google.common.collect.Lists;\n+import com.google.gson.JsonElement;\n+\n+import gobblin.configuration.ConfigurationKeys;\n+import gobblin.configuration.WorkUnitState;\n+import gobblin.source.extractor.DataRecordException;\n+import gobblin.source.extractor.exception.HighWatermarkException;\n+import gobblin.source.extractor.exception.RecordCountException;\n+import gobblin.source.extractor.exception.SchemaException;\n+import gobblin.source.extractor.extract.Command;\n+import gobblin.source.extractor.utils.Utils;\n+import gobblin.source.extractor.watermark.Predicate;\n+import gobblin.source.extractor.watermark.WatermarkType;\n+import gobblin.source.workunit.WorkUnit;\n+\n+/**\n+ * Extractor for Oracle database\n+ */\n+public class OracleExtractor extends JdbcExtractor {\n+  private static final Logger LOG = LoggerFactory.getLogger(OracleExtractor.class);\n+\n+  private static final String ORCL_HOUR_FORMAT = \"HH\";\n+  private static final String ORCL_TIMESTAMP_FORMAT = \"yyyy-MM-dd HH:mm:ss\";\n+\n+  private static final String SAMPLE_QUERY_KEYWORD = \" rownum \";\n+  private static final String URL_FORMAT = \"jdbc:oracle:thin:@%s:%d:%s\"; //jdbc:oracle:thin:@[HOST][:PORT]:SID\n+  private static final String METADATA_SCHEMA_PSTMT_FORMAT =\n+      \"SELECT \" +\n+        \"column_name, \" +\n+        \"UPPER(data_type), \" +\n+        \"data_length as length, \" +\n+        \"NVL(data_precision, 0) as precesion, \" +\n+        \"NVL(data_scale, 0) as scale, \" +\n+        \"CASE NVL(NULLABLE, 'Y') WHEN 'Y' THEN 'true' ELSE 'false' END as nullable, \" +\n+        \"' ' as format, \" +\n+        \"NVL(comments, ' ') as \\\"COMMENT\\\", \" +\n+        \"column_id \" +\n+        \"FROM \" +\n+        \"user_tab_columns@%s \" +\n+        \"JOIN user_col_comments USING (table_name, column_name) \" +\n+        \"WHERE \" +\n+        \"UPPER(table_name) = ? \" +\n+        \"ORDER BY \" +\n+        \"column_id, column_name\";\n+\n+  private static final Map<String, String> DATA_TYPE_MAP;\n+  static {\n+    DATA_TYPE_MAP = ImmutableMap.<String, String>builder()\n+        .put(\"VARCHAR2\", \"string\")\n+        .put(\"NVARCHAR2\", \"string\")\n+        .put(\"NUMBER\", \"double\")\n+        .put(\"LONG\", \"long\")\n+        .put(\"DATE\", \"date\")\n+        .put(\"CHAR\", \"string\")\n+        .put(\"NCHAR\", \"string\")\n+        .put(\"CLOB\", \"string\")\n+        .put(\"NCLOB\", \"string\")\n+        .put(\"TIMESTAMP\", \"timestamp\")\n+        .put(\"TIMESTAMP(0)\", \"timestamp\")\n+        .put(\"TIMESTAMP(1)\", \"timestamp\")\n+        .put(\"TIMESTAMP(2)\", \"timestamp\")\n+        .put(\"TIMESTAMP(3)\", \"timestamp\")\n+        .put(\"TIMESTAMP(4)\", \"timestamp\")\n+        .put(\"TIMESTAMP(5)\", \"timestamp\")\n+        .put(\"TIMESTAMP(6)\", \"timestamp\")\n+        .put(\"TIMESTAMP(7)\", \"timestamp\")\n+        .put(\"TIMESTAMP(8)\", \"timestamp\")\n+        .put(\"TIMESTAMP(9)\", \"timestamp\")\n+        .build();\n+  }\n+\n+  public OracleExtractor(WorkUnitState workUnitState) {\n+    super(workUnitState);\n+  }\n+\n+  @Override\n+  public List<Command> getSchemaMetadata(String schema, String entity) throws SchemaException {\n+    LOG.debug(\"Build query to get schema\");\n+\n+    List<Command> commands = Lists.newArrayList();\n+    String pstmt = String.format(METADATA_SCHEMA_PSTMT_FORMAT, Preconditions.checkNotNull(schema));\n+    commands.add(JdbcExtractor.getCommand(pstmt, JdbcCommand.JdbcCommandType.QUERY));\n+    commands.add(JdbcExtractor.getCommand(Arrays.asList(entity), JdbcCommand.JdbcCommandType.QUERYPARAMS));\n+    return commands;\n+  }\n+\n+  @Override\n+  public List<Command> getHighWatermarkMetadata(String schema, String entity, String watermarkColumn,\n+      List<Predicate> predicateList)\n+      throws HighWatermarkException {\n+    LOG.debug(\"Build query to get high watermark\");\n+    List<Command> commands = Lists.newArrayList();\n+\n+    String columnProjection = \"max(\" + Utils.getCoalesceColumnNames(watermarkColumn) + \")\";\n+    String watermarkFilter = this.concatPredicates(predicateList);\n+    String query = this.getExtractSql();\n+\n+    if (StringUtils.isBlank(watermarkFilter)) {\n+      watermarkFilter = \"1=1\";\n+    }\n+    query = query.replace(this.getOutputColumnProjection(), columnProjection)\n+        .replace(ConfigurationKeys.DEFAULT_SOURCE_QUERYBASED_WATERMARK_PREDICATE_SYMBOL, watermarkFilter);\n+\n+    commands.add(JdbcExtractor.getCommand(query, JdbcCommand.JdbcCommandType.QUERY));\n+    return commands;\n+  }\n+\n+  @Override\n+  String getDefaultExtractQuery(String schema, String entity) {\n+    return \"SELECT \" + getOutputColumnProjection() + \" FROM \" + entity + \"@\" + schema;\n+  }\n+\n+  @Override\n+  public List<Command> getCountMetadata(String schema, String entity, WorkUnit workUnit, List<Predicate> predicateList)\n+      throws RecordCountException {\n+    List<Command> commands = Lists.newArrayList();\n+\n+    String columnProjection = \"COUNT(1)\";\n+    String watermarkFilter = this.concatPredicates(predicateList);\n+    String query = this.getExtractSql();\n+\n+    if (StringUtils.isBlank(watermarkFilter)) {\n+      watermarkFilter = \"1=1\";\n+    }\n+    query = query.replace(this.getOutputColumnProjection(), columnProjection)\n+        .replace(ConfigurationKeys.DEFAULT_SOURCE_QUERYBASED_WATERMARK_PREDICATE_SYMBOL, watermarkFilter);\n+    commands.add(JdbcExtractor.getCommand(query, JdbcCommand.JdbcCommandType.QUERY));\n+    return commands;\n+  }\n+\n+  @Override\n+  public List<Command> getDataMetadata(String schema, String entity, WorkUnit workUnit, List<Predicate> predicateList)\n+      throws DataRecordException {\n+    LOG.debug(\"Build query to extract data\");\n+    List<Command> commands = Lists.newArrayList();\n+\n+    String watermarkFilter = this.concatPredicates(predicateList);\n+    String query = this.getExtractSql();\n+    if (StringUtils.isBlank(watermarkFilter)) {\n+      watermarkFilter = \"1=1\";\n+    }\n+\n+    query = query.replace(ConfigurationKeys.DEFAULT_SOURCE_QUERYBASED_WATERMARK_PREDICATE_SYMBOL, watermarkFilter);\n+    commands.add(JdbcExtractor.getCommand(query, JdbcCommand.JdbcCommandType.QUERY));\n+\n+    int fetchSize = workUnit.getPropAsInt(ConfigurationKeys.SOURCE_QUERYBASED_FETCH_SIZE, ConfigurationKeys.DEFAULT_SOURCE_QUERYBASED_JDBC_RESULTSET_FETCH_SIZE);\n+    commands.add(JdbcExtractor.getCommand(fetchSize, JdbcCommand.JdbcCommandType.FETCHSIZE));\n+    return commands;\n+  }\n+\n+  @Override\n+  public Map<String, String> getDataTypeMap() {\n+    return DATA_TYPE_MAP;\n+  }\n+\n+  @Override\n+  public Iterator<JsonElement> getRecordSetFromSourceApi(String schema, String entity, WorkUnit workUnit,\n+      List<Predicate> predicateList) throws IOException {\n+    return null;","path":"gobblin-core/src/main/java/gobblin/source/extractor/extract/jdbc/OracleExtractor.java","position":null,"original_position":184,"commit_id":"19d9f2315842b3e95b103b6bfa52b8c8f47dabad","original_commit_id":"c15a56025360ffc6af33958d06b440a3c67e0900","user":{"login":"jinhyukchang","id":14986757,"avatar_url":"https://avatars.githubusercontent.com/u/14986757?v=3","gravatar_id":"","url":"https://api.github.com/users/jinhyukchang","html_url":"https://github.com/jinhyukchang","followers_url":"https://api.github.com/users/jinhyukchang/followers","following_url":"https://api.github.com/users/jinhyukchang/following{/other_user}","gists_url":"https://api.github.com/users/jinhyukchang/gists{/gist_id}","starred_url":"https://api.github.com/users/jinhyukchang/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jinhyukchang/subscriptions","organizations_url":"https://api.github.com/users/jinhyukchang/orgs","repos_url":"https://api.github.com/users/jinhyukchang/repos","events_url":"https://api.github.com/users/jinhyukchang/events{/privacy}","received_events_url":"https://api.github.com/users/jinhyukchang/received_events","type":"User","site_admin":false},"body":"Added comment on it (No need to support specific retrieval as getRecordSet in JdbcExtractor is sufficient) and changed it to throw exception.","created_at":"2016-06-17T17:10:58Z","updated_at":"2016-06-17T17:10:58Z","html_url":"https://github.com/linkedin/gobblin/pull/927#discussion_r67543827","pull_request_url":"https://api.github.com/repos/linkedin/gobblin/pulls/927","_links":{"self":{"href":"https://api.github.com/repos/linkedin/gobblin/pulls/comments/67543827"},"html":{"href":"https://github.com/linkedin/gobblin/pull/927#discussion_r67543827"},"pull_request":{"href":"https://api.github.com/repos/linkedin/gobblin/pulls/927"}}},"pull_request":{"url":"https://api.github.com/repos/linkedin/gobblin/pulls/927","id":66510491,"html_url":"https://github.com/linkedin/gobblin/pull/927","diff_url":"https://github.com/linkedin/gobblin/pull/927.diff","patch_url":"https://github.com/linkedin/gobblin/pull/927.patch","issue_url":"https://api.github.com/repos/linkedin/gobblin/issues/927","number":927,"state":"open","locked":false,"title":"Oracle reader","user":{"login":"jinhyukchang","id":14986757,"avatar_url":"https://avatars.githubusercontent.com/u/14986757?v=3","gravatar_id":"","url":"https://api.github.com/users/jinhyukchang","html_url":"https://github.com/jinhyukchang","followers_url":"https://api.github.com/users/jinhyukchang/followers","following_url":"https://api.github.com/users/jinhyukchang/following{/other_user}","gists_url":"https://api.github.com/users/jinhyukchang/gists{/gist_id}","starred_url":"https://api.github.com/users/jinhyukchang/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jinhyukchang/subscriptions","organizations_url":"https://api.github.com/users/jinhyukchang/orgs","repos_url":"https://api.github.com/users/jinhyukchang/repos","events_url":"https://api.github.com/users/jinhyukchang/events{/privacy}","received_events_url":"https://api.github.com/users/jinhyukchang/received_events","type":"User","site_admin":false},"body":"Adding OracleExtractor which extracts data from Oracle database. \r\nOracleExtractor inherits/reuses many codes from JdbcExtractor. JdbcExtractor retrieves data via getRecordSet, where watermark is put into where clause in SELECT statement. As SQL statements and metadata store is differ among RDMSs, Oracle extractor provides specific query statement for extracting metadata (in getSchemaMetadata), extracting data (in getDataMetadata), count (in getCountMetadata), and provides data type mapping for JdbcExtractor.\r\n\r\nPassed integration test in local.","created_at":"2016-04-14T16:03:35Z","updated_at":"2016-06-17T17:10:58Z","closed_at":null,"merged_at":null,"merge_commit_sha":"1fa4307109106b2105ad9bfac94c2c300640e466","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/linkedin/gobblin/pulls/927/commits","review_comments_url":"https://api.github.com/repos/linkedin/gobblin/pulls/927/comments","review_comment_url":"https://api.github.com/repos/linkedin/gobblin/pulls/comments{/number}","comments_url":"https://api.github.com/repos/linkedin/gobblin/issues/927/comments","statuses_url":"https://api.github.com/repos/linkedin/gobblin/statuses/19d9f2315842b3e95b103b6bfa52b8c8f47dabad","head":{"label":"jinhyukchang:oracle-reader","ref":"oracle-reader","sha":"19d9f2315842b3e95b103b6bfa52b8c8f47dabad","user":{"login":"jinhyukchang","id":14986757,"avatar_url":"https://avatars.githubusercontent.com/u/14986757?v=3","gravatar_id":"","url":"https://api.github.com/users/jinhyukchang","html_url":"https://github.com/jinhyukchang","followers_url":"https://api.github.com/users/jinhyukchang/followers","following_url":"https://api.github.com/users/jinhyukchang/following{/other_user}","gists_url":"https://api.github.com/users/jinhyukchang/gists{/gist_id}","starred_url":"https://api.github.com/users/jinhyukchang/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jinhyukchang/subscriptions","organizations_url":"https://api.github.com/users/jinhyukchang/orgs","repos_url":"https://api.github.com/users/jinhyukchang/repos","events_url":"https://api.github.com/users/jinhyukchang/events{/privacy}","received_events_url":"https://api.github.com/users/jinhyukchang/received_events","type":"User","site_admin":false},"repo":{"id":50533116,"name":"gobblin","full_name":"jinhyukchang/gobblin","owner":{"login":"jinhyukchang","id":14986757,"avatar_url":"https://avatars.githubusercontent.com/u/14986757?v=3","gravatar_id":"","url":"https://api.github.com/users/jinhyukchang","html_url":"https://github.com/jinhyukchang","followers_url":"https://api.github.com/users/jinhyukchang/followers","following_url":"https://api.github.com/users/jinhyukchang/following{/other_user}","gists_url":"https://api.github.com/users/jinhyukchang/gists{/gist_id}","starred_url":"https://api.github.com/users/jinhyukchang/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jinhyukchang/subscriptions","organizations_url":"https://api.github.com/users/jinhyukchang/orgs","repos_url":"https://api.github.com/users/jinhyukchang/repos","events_url":"https://api.github.com/users/jinhyukchang/events{/privacy}","received_events_url":"https://api.github.com/users/jinhyukchang/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/jinhyukchang/gobblin","description":"Universal data ingestion framework for Hadoop.","fork":true,"url":"https://api.github.com/repos/jinhyukchang/gobblin","forks_url":"https://api.github.com/repos/jinhyukchang/gobblin/forks","keys_url":"https://api.github.com/repos/jinhyukchang/gobblin/keys{/key_id}","collaborators_url":"https://api.github.com/repos/jinhyukchang/gobblin/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/jinhyukchang/gobblin/teams","hooks_url":"https://api.github.com/repos/jinhyukchang/gobblin/hooks","issue_events_url":"https://api.github.com/repos/jinhyukchang/gobblin/issues/events{/number}","events_url":"https://api.github.com/repos/jinhyukchang/gobblin/events","assignees_url":"https://api.github.com/repos/jinhyukchang/gobblin/assignees{/user}","branches_url":"https://api.github.com/repos/jinhyukchang/gobblin/branches{/branch}","tags_url":"https://api.github.com/repos/jinhyukchang/gobblin/tags","blobs_url":"https://api.github.com/repos/jinhyukchang/gobblin/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/jinhyukchang/gobblin/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/jinhyukchang/gobblin/git/refs{/sha}","trees_url":"https://api.github.com/repos/jinhyukchang/gobblin/git/trees{/sha}","statuses_url":"https://api.github.com/repos/jinhyukchang/gobblin/statuses/{sha}","languages_url":"https://api.github.com/repos/jinhyukchang/gobblin/languages","stargazers_url":"https://api.github.com/repos/jinhyukchang/gobblin/stargazers","contributors_url":"https://api.github.com/repos/jinhyukchang/gobblin/contributors","subscribers_url":"https://api.github.com/repos/jinhyukchang/gobblin/subscribers","subscription_url":"https://api.github.com/repos/jinhyukchang/gobblin/subscription","commits_url":"https://api.github.com/repos/jinhyukchang/gobblin/commits{/sha}","git_commits_url":"https://api.github.com/repos/jinhyukchang/gobblin/git/commits{/sha}","comments_url":"https://api.github.com/repos/jinhyukchang/gobblin/comments{/number}","issue_comment_url":"https://api.github.com/repos/jinhyukchang/gobblin/issues/comments{/number}","contents_url":"https://api.github.com/repos/jinhyukchang/gobblin/contents/{+path}","compare_url":"https://api.github.com/repos/jinhyukchang/gobblin/compare/{base}...{head}","merges_url":"https://api.github.com/repos/jinhyukchang/gobblin/merges","archive_url":"https://api.github.com/repos/jinhyukchang/gobblin/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/jinhyukchang/gobblin/downloads","issues_url":"https://api.github.com/repos/jinhyukchang/gobblin/issues{/number}","pulls_url":"https://api.github.com/repos/jinhyukchang/gobblin/pulls{/number}","milestones_url":"https://api.github.com/repos/jinhyukchang/gobblin/milestones{/number}","notifications_url":"https://api.github.com/repos/jinhyukchang/gobblin/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/jinhyukchang/gobblin/labels{/name}","releases_url":"https://api.github.com/repos/jinhyukchang/gobblin/releases{/id}","deployments_url":"https://api.github.com/repos/jinhyukchang/gobblin/deployments","created_at":"2016-01-27T19:46:34Z","updated_at":"2016-01-27T19:46:37Z","pushed_at":"2016-06-17T17:00:21Z","git_url":"git://github.com/jinhyukchang/gobblin.git","ssh_url":"git@github.com:jinhyukchang/gobblin.git","clone_url":"https://github.com/jinhyukchang/gobblin.git","svn_url":"https://github.com/jinhyukchang/gobblin","homepage":"https://github.com/linkedin/gobblin/wiki","size":92502,"stargazers_count":0,"watchers_count":0,"language":"Java","has_issues":false,"has_downloads":true,"has_wiki":true,"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":"linkedin:master","ref":"master","sha":"f12f6e5f6d0e03157af2f6d1c6b3804c90f841c3","user":{"login":"linkedin","id":357098,"avatar_url":"https://avatars.githubusercontent.com/u/357098?v=3","gravatar_id":"","url":"https://api.github.com/users/linkedin","html_url":"https://github.com/linkedin","followers_url":"https://api.github.com/users/linkedin/followers","following_url":"https://api.github.com/users/linkedin/following{/other_user}","gists_url":"https://api.github.com/users/linkedin/gists{/gist_id}","starred_url":"https://api.github.com/users/linkedin/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/linkedin/subscriptions","organizations_url":"https://api.github.com/users/linkedin/orgs","repos_url":"https://api.github.com/users/linkedin/repos","events_url":"https://api.github.com/users/linkedin/events{/privacy}","received_events_url":"https://api.github.com/users/linkedin/received_events","type":"Organization","site_admin":false},"repo":{"id":27392543,"name":"gobblin","full_name":"linkedin/gobblin","owner":{"login":"linkedin","id":357098,"avatar_url":"https://avatars.githubusercontent.com/u/357098?v=3","gravatar_id":"","url":"https://api.github.com/users/linkedin","html_url":"https://github.com/linkedin","followers_url":"https://api.github.com/users/linkedin/followers","following_url":"https://api.github.com/users/linkedin/following{/other_user}","gists_url":"https://api.github.com/users/linkedin/gists{/gist_id}","starred_url":"https://api.github.com/users/linkedin/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/linkedin/subscriptions","organizations_url":"https://api.github.com/users/linkedin/orgs","repos_url":"https://api.github.com/users/linkedin/repos","events_url":"https://api.github.com/users/linkedin/events{/privacy}","received_events_url":"https://api.github.com/users/linkedin/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/linkedin/gobblin","description":"Universal data ingestion framework for Hadoop.","fork":false,"url":"https://api.github.com/repos/linkedin/gobblin","forks_url":"https://api.github.com/repos/linkedin/gobblin/forks","keys_url":"https://api.github.com/repos/linkedin/gobblin/keys{/key_id}","collaborators_url":"https://api.github.com/repos/linkedin/gobblin/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/linkedin/gobblin/teams","hooks_url":"https://api.github.com/repos/linkedin/gobblin/hooks","issue_events_url":"https://api.github.com/repos/linkedin/gobblin/issues/events{/number}","events_url":"https://api.github.com/repos/linkedin/gobblin/events","assignees_url":"https://api.github.com/repos/linkedin/gobblin/assignees{/user}","branches_url":"https://api.github.com/repos/linkedin/gobblin/branches{/branch}","tags_url":"https://api.github.com/repos/linkedin/gobblin/tags","blobs_url":"https://api.github.com/repos/linkedin/gobblin/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/linkedin/gobblin/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/linkedin/gobblin/git/refs{/sha}","trees_url":"https://api.github.com/repos/linkedin/gobblin/git/trees{/sha}","statuses_url":"https://api.github.com/repos/linkedin/gobblin/statuses/{sha}","languages_url":"https://api.github.com/repos/linkedin/gobblin/languages","stargazers_url":"https://api.github.com/repos/linkedin/gobblin/stargazers","contributors_url":"https://api.github.com/repos/linkedin/gobblin/contributors","subscribers_url":"https://api.github.com/repos/linkedin/gobblin/subscribers","subscription_url":"https://api.github.com/repos/linkedin/gobblin/subscription","commits_url":"https://api.github.com/repos/linkedin/gobblin/commits{/sha}","git_commits_url":"https://api.github.com/repos/linkedin/gobblin/git/commits{/sha}","comments_url":"https://api.github.com/repos/linkedin/gobblin/comments{/number}","issue_comment_url":"https://api.github.com/repos/linkedin/gobblin/issues/comments{/number}","contents_url":"https://api.github.com/repos/linkedin/gobblin/contents/{+path}","compare_url":"https://api.github.com/repos/linkedin/gobblin/compare/{base}...{head}","merges_url":"https://api.github.com/repos/linkedin/gobblin/merges","archive_url":"https://api.github.com/repos/linkedin/gobblin/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/linkedin/gobblin/downloads","issues_url":"https://api.github.com/repos/linkedin/gobblin/issues{/number}","pulls_url":"https://api.github.com/repos/linkedin/gobblin/pulls{/number}","milestones_url":"https://api.github.com/repos/linkedin/gobblin/milestones{/number}","notifications_url":"https://api.github.com/repos/linkedin/gobblin/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/linkedin/gobblin/labels{/name}","releases_url":"https://api.github.com/repos/linkedin/gobblin/releases{/id}","deployments_url":"https://api.github.com/repos/linkedin/gobblin/deployments","created_at":"2014-12-01T18:10:50Z","updated_at":"2016-06-17T10:02:12Z","pushed_at":"2016-06-17T17:00:22Z","git_url":"git://github.com/linkedin/gobblin.git","ssh_url":"git@github.com:linkedin/gobblin.git","clone_url":"https://github.com/linkedin/gobblin.git","svn_url":"https://github.com/linkedin/gobblin","homepage":"https://github.com/linkedin/gobblin/wiki","size":169165,"stargazers_count":604,"watchers_count":604,"language":"Java","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":241,"mirror_url":null,"open_issues_count":89,"forks":241,"open_issues":89,"watchers":604,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/linkedin/gobblin/pulls/927"},"html":{"href":"https://github.com/linkedin/gobblin/pull/927"},"issue":{"href":"https://api.github.com/repos/linkedin/gobblin/issues/927"},"comments":{"href":"https://api.github.com/repos/linkedin/gobblin/issues/927/comments"},"review_comments":{"href":"https://api.github.com/repos/linkedin/gobblin/pulls/927/comments"},"review_comment":{"href":"https://api.github.com/repos/linkedin/gobblin/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/linkedin/gobblin/pulls/927/commits"},"statuses":{"href":"https://api.github.com/repos/linkedin/gobblin/statuses/19d9f2315842b3e95b103b6bfa52b8c8f47dabad"}}}}
{"actor":{"display_login":"jinhyukchang"}}