{"action":"created","comment":{"url":"https://api.github.com/repos/apache/flink/pulls/comments/40441316","id":40441316,"diff_hunk":"@@ -0,0 +1,679 @@\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, software\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n+ * See the License for the specific language governing permissions and\n+ * limitations under the License.\n+ */\n+\n+package org.apache.flink.test.javaApiOperators;\n+\n+import org.apache.flink.api.common.InvalidProgramException;\n+import org.apache.flink.api.common.functions.FlatJoinFunction;\n+import org.apache.flink.api.common.functions.JoinFunction;\n+import org.apache.flink.api.common.functions.RichFlatJoinFunction;\n+import org.apache.flink.api.java.DataSet;\n+import org.apache.flink.api.java.ExecutionEnvironment;\n+import org.apache.flink.api.java.functions.KeySelector;\n+import org.apache.flink.api.java.tuple.Tuple2;\n+import org.apache.flink.api.java.tuple.Tuple3;\n+import org.apache.flink.api.java.tuple.Tuple5;\n+import org.apache.flink.api.java.tuple.Tuple6;\n+import org.apache.flink.api.java.tuple.Tuple7;\n+import org.apache.flink.configuration.Configuration;\n+import org.apache.flink.test.javaApiOperators.util.CollectionDataSets;\n+import org.apache.flink.test.javaApiOperators.util.CollectionDataSets.CustomType;\n+import org.apache.flink.test.javaApiOperators.util.CollectionDataSets.POJO;\n+import org.apache.flink.test.util.MultipleProgramsTestBase;\n+import org.apache.flink.util.Collector;\n+import org.junit.Test;\n+import org.junit.runner.RunWith;\n+import org.junit.runners.Parameterized;\n+\n+import java.util.Collection;\n+import java.util.List;\n+\n+@SuppressWarnings(\"serial\")\n+@RunWith(Parameterized.class)\n+public class OuterJoinITCase extends MultipleProgramsTestBase {\n+\n+\tpublic OuterJoinITCase(TestExecutionMode mode) {\n+\t\tsuper(mode);\n+\t}\n+\n+\t@Test\n+\tpublic void testUDFLeftOuterJoinOnTuplesWithKeyFieldPositions() throws Exception {\n+\t\t/*\n+\t\t * UDF Join on tuples with key field positions\n+\t\t */\n+\n+\t\tfinal ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();\n+\n+\t\tDataSet<Tuple3<Integer, Long, String>> ds1 = CollectionDataSets.getSmall3TupleDataSet(env);\n+\t\tDataSet<Tuple5<Integer, Long, Integer, String, Long>> ds2 = CollectionDataSets.getSmall5TupleDataSet(env);\n+\t\tDataSet<Tuple2<String, String>> joinDs =\n+\t\t\t\tds1.leftOuterJoin(ds2)\n+\t\t\t\t\t\t.where(0)\n+\t\t\t\t\t\t.equalTo(0)\n+\t\t\t\t\t\t.with(new T3T5FlatJoin());\n+\n+\t\tList<Tuple2<String, String>> result = joinDs.collect();\n+\n+\t\tString expected = \"Hi,Hallo\\n\" +\n+\t\t\t\t\"Hello,Hallo Welt\\n\" +\n+\t\t\t\t\"Hello,Hallo Welt wie\\n\" +\n+\t\t\t\t\"Hello world,null\\n\";\n+\n+\t\tcompareResultAsTuples(result, expected);\n+\t}\n+\n+\t@Test\n+\tpublic void testUDFRightOuterJoinOnTuplesWithKeyFieldPositions() throws Exception {\n+\t\t/*\n+\t\t * UDF Join on tuples with key field positions\n+\t\t */\n+\n+\t\tfinal ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();\n+\n+\t\tDataSet<Tuple3<Integer, Long, String>> ds1 = CollectionDataSets.getSmall3TupleDataSet(env);\n+\t\tDataSet<Tuple5<Integer, Long, Integer, String, Long>> ds2 = CollectionDataSets.getSmall5TupleDataSet(env);\n+\t\tDataSet<Tuple2<String, String>> joinDs =\n+\t\t\t\tds1.rightOuterJoin(ds2)\n+\t\t\t\t\t\t.where(1)\n+\t\t\t\t\t\t.equalTo(1)\n+\t\t\t\t\t\t.with(new T3T5FlatJoin());\n+\n+\t\tList<Tuple2<String, String>> result = joinDs.collect();\n+\n+\t\tString expected = \"Hi,Hallo\\n\" +\n+\t\t\t\t\"Hello,Hallo Welt\\n\" +\n+\t\t\t\t\"null,Hallo Welt wie\\n\" +\n+\t\t\t\t\"Hello world,Hallo Welt\\n\";\n+\n+\t\tcompareResultAsTuples(result, expected);\n+\t}\n+\n+\t@Test\n+\tpublic void testUDFFullOuterJoinOnTuplesWithKeyFieldPositions() throws Exception {\n+\t\t/*\n+\t\t * UDF Join on tuples with key field positions\n+\t\t */\n+\n+\t\tfinal ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();\n+\n+\t\tDataSet<Tuple3<Integer, Long, String>> ds1 = CollectionDataSets.getSmall3TupleDataSet(env);\n+\t\tDataSet<Tuple5<Integer, Long, Integer, String, Long>> ds2 = CollectionDataSets.getSmall5TupleDataSet(env);\n+\t\tDataSet<Tuple2<String, String>> joinDs =\n+\t\t\t\tds1.fullOuterJoin(ds2)\n+\t\t\t\t\t\t.where(0)\n+\t\t\t\t\t\t.equalTo(2)\n+\t\t\t\t\t\t.with(new T3T5FlatJoin());\n+\n+\t\tList<Tuple2<String, String>> result = joinDs.collect();\n+\n+\t\tString expected = \"null,Hallo\\n\" +\n+\t\t\t\t\"Hi,Hallo Welt\\n\" +\n+\t\t\t\t\"Hello,Hallo Welt wie\\n\" +\n+\t\t\t\t\"Hello world,null\\n\";\n+\n+\t\tcompareResultAsTuples(result, expected);\n+\t}\n+\n+\t@Test\n+\tpublic void testUDFJoinOnTuplesWithMultipleKeyFieldPositions() throws Exception {\n+\t\t/*\n+\t\t * UDF Join on tuples with multiple key field positions\n+\t\t */\n+\n+\t\tfinal ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();\n+\n+\t\tDataSet<Tuple3<Integer, Long, String>> ds1 = CollectionDataSets.getSmall3TupleDataSet(env);\n+\t\tDataSet<Tuple5<Integer, Long, Integer, String, Long>> ds2 = CollectionDataSets.getSmall5TupleDataSet(env);\n+\t\tDataSet<Tuple2<String, String>> joinDs =\n+\t\t\t\tds1.fullOuterJoin(ds2)\n+\t\t\t\t\t\t.where(0, 1)\n+\t\t\t\t\t\t.equalTo(0, 4)\n+\t\t\t\t\t\t.with(new T3T5FlatJoin());\n+\n+\t\tList<Tuple2<String, String>> result = joinDs.collect();\n+\n+\t\tString expected = \"Hi,Hallo\\n\" +\n+\t\t\t\t\"Hello,Hallo Welt\\n\" +\n+\t\t\t\t\"Hello world,null\\n\" +\n+\t\t\t\t\"null,Hallo Welt wie\\n\";\n+\n+\t\tcompareResultAsTuples(result, expected);\n+\t}\n+\n+\t@Test(expected = InvalidProgramException.class)\n+\tpublic void testDefaultJoin() throws Exception {","path":"flink-tests/src/test/java/org/apache/flink/test/javaApiOperators/OuterJoinITCase.java","position":159,"original_position":159,"commit_id":"45b515a3715318a6d3d194a16b3b2c4c69902755","original_commit_id":"45b515a3715318a6d3d194a16b3b2c4c69902755","user":{"login":"fhueske","id":2388347,"avatar_url":"https://avatars.githubusercontent.com/u/2388347?v=3","gravatar_id":"","url":"https://api.github.com/users/fhueske","html_url":"https://github.com/fhueske","followers_url":"https://api.github.com/users/fhueske/followers","following_url":"https://api.github.com/users/fhueske/following{/other_user}","gists_url":"https://api.github.com/users/fhueske/gists{/gist_id}","starred_url":"https://api.github.com/users/fhueske/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/fhueske/subscriptions","organizations_url":"https://api.github.com/users/fhueske/orgs","repos_url":"https://api.github.com/users/fhueske/repos","events_url":"https://api.github.com/users/fhueske/events{/privacy}","received_events_url":"https://api.github.com/users/fhueske/received_events","type":"User","site_admin":false},"body":"This check should be done as a unit test (as mentioned in my other comment).","created_at":"2015-09-25T15:22:18Z","updated_at":"2015-09-25T15:22:18Z","html_url":"https://github.com/apache/flink/pull/1138#discussion_r40441316","pull_request_url":"https://api.github.com/repos/apache/flink/pulls/1138","_links":{"self":{"href":"https://api.github.com/repos/apache/flink/pulls/comments/40441316"},"html":{"href":"https://github.com/apache/flink/pull/1138#discussion_r40441316"},"pull_request":{"href":"https://api.github.com/repos/apache/flink/pulls/1138"}}},"pull_request":{"url":"https://api.github.com/repos/apache/flink/pulls/1138","id":45215116,"html_url":"https://github.com/apache/flink/pull/1138","diff_url":"https://github.com/apache/flink/pull/1138.diff","patch_url":"https://github.com/apache/flink/pull/1138.patch","issue_url":"https://api.github.com/repos/apache/flink/issues/1138","number":1138,"state":"open","locked":false,"title":"[FLINK-2576] Add Outer Join operator to Optimizer and APIs","user":{"login":"jkovacs","id":371776,"avatar_url":"https://avatars.githubusercontent.com/u/371776?v=3","gravatar_id":"","url":"https://api.github.com/users/jkovacs","html_url":"https://github.com/jkovacs","followers_url":"https://api.github.com/users/jkovacs/followers","following_url":"https://api.github.com/users/jkovacs/following{/other_user}","gists_url":"https://api.github.com/users/jkovacs/gists{/gist_id}","starred_url":"https://api.github.com/users/jkovacs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jkovacs/subscriptions","organizations_url":"https://api.github.com/users/jkovacs/orgs","repos_url":"https://api.github.com/users/jkovacs/repos","events_url":"https://api.github.com/users/jkovacs/events{/privacy}","received_events_url":"https://api.github.com/users/jkovacs/received_events","type":"User","site_admin":false},"body":"This PR implements [FLINK-2576](https://issues.apache.org/jira/browse/FLINK-2576) (Adding the outer join operator to the optimizer and Java/Scala APIs, previously part of [FLINK-2106](https://issues.apache.org/jira/browse/FLINK-2106)).\r\nFor reference, the revious pull requests for the outer join implementation were #907 and #1052.\r\n\r\nFirst of all thanks for the help we received in person and on the mailing list. \r\nI designed the API as per the consensus on the mailing list and tried reusing as much code from the join operator api as possible.\r\n\r\nThis PR contributes the following:\r\n* An OuterJoinNode to the optimizer, and 3 Sort Merge OuterJoinDescriptors for each type of outer join\r\n* One outer join base operator\r\n* left/righ/fullOuterJoin() methods to the Java and Scala APIs\r\n  * Including some updates to the join javadocs in Java/Scala APIs\r\n* Refactorings where necessary (mostly concerned with being able to reuse inner join operator code)\r\n* Specifically refactoring of the JoinOperator in the Java API:\r\n  * Added JoinType property, identifying inner/left-/right-/full outer join\r\n  * Removed PlanXUnwrappingJoinOperator classes, instead promoting the TupleXUnwrappingJoiners to be able to reuse the existing unwrapping logic\r\n  * Added inner class JoinOperatorBaseBuilder to be able to transparently construct a base operator for all types of joins, as well as tuple unwrapping of left and right inputs\r\n  * Make sure the user can't compile a default join plan for outer joins, as well as make projection joins work with outer joins (see below)\r\n* End to end integration tests for the outer join operator using the Java and Scala APIs in flink-tests\r\n\r\nUsage & Implementation:\r\nIn both APIs we prohibit using the default join functionality for outer joins. The user is required\r\nto specify a custom join function that combines the (potentially `null`) left and right side tuples.\r\nIn the Java API we support the projection join functionality for outer joins. (Projection joins are not yet implemented in the Scala API for inner joins, therefore no changes there.)\r\nImportant to note is that when the user performs a projection join, the type information is lost.\r\nThis is also the case for the inner projection join. Additionally, we explicitly \"downgrade\" the result type information of an outer projection join to a Tuple of `GenericTypeInfo<>(Object.class)`, in order to be able to serialize `null` values.\r\nA nicer way to do this would be to use an `Optional<T>` type to represent nullable tuple values, but because we can't rely on Java 8 types, nor did I want to hardcode a dependency to a 3rd party `Optional` type (e.g. from guava) into the API, we went this route, for now.\r\n","created_at":"2015-09-16T19:41:31Z","updated_at":"2015-09-25T15:22:18Z","closed_at":null,"merged_at":null,"merge_commit_sha":"0c0f80030dfb72c93e059766e9e9173d4bd9c830","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/apache/flink/pulls/1138/commits","review_comments_url":"https://api.github.com/repos/apache/flink/pulls/1138/comments","review_comment_url":"https://api.github.com/repos/apache/flink/pulls/comments{/number}","comments_url":"https://api.github.com/repos/apache/flink/issues/1138/comments","statuses_url":"https://api.github.com/repos/apache/flink/statuses/45b515a3715318a6d3d194a16b3b2c4c69902755","head":{"label":"jkovacs:feature/FLINK-2576","ref":"feature/FLINK-2576","sha":"45b515a3715318a6d3d194a16b3b2c4c69902755","user":{"login":"jkovacs","id":371776,"avatar_url":"https://avatars.githubusercontent.com/u/371776?v=3","gravatar_id":"","url":"https://api.github.com/users/jkovacs","html_url":"https://github.com/jkovacs","followers_url":"https://api.github.com/users/jkovacs/followers","following_url":"https://api.github.com/users/jkovacs/following{/other_user}","gists_url":"https://api.github.com/users/jkovacs/gists{/gist_id}","starred_url":"https://api.github.com/users/jkovacs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jkovacs/subscriptions","organizations_url":"https://api.github.com/users/jkovacs/orgs","repos_url":"https://api.github.com/users/jkovacs/repos","events_url":"https://api.github.com/users/jkovacs/events{/privacy}","received_events_url":"https://api.github.com/users/jkovacs/received_events","type":"User","site_admin":false},"repo":{"id":37602588,"name":"flink","full_name":"jkovacs/flink","owner":{"login":"jkovacs","id":371776,"avatar_url":"https://avatars.githubusercontent.com/u/371776?v=3","gravatar_id":"","url":"https://api.github.com/users/jkovacs","html_url":"https://github.com/jkovacs","followers_url":"https://api.github.com/users/jkovacs/followers","following_url":"https://api.github.com/users/jkovacs/following{/other_user}","gists_url":"https://api.github.com/users/jkovacs/gists{/gist_id}","starred_url":"https://api.github.com/users/jkovacs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jkovacs/subscriptions","organizations_url":"https://api.github.com/users/jkovacs/orgs","repos_url":"https://api.github.com/users/jkovacs/repos","events_url":"https://api.github.com/users/jkovacs/events{/privacy}","received_events_url":"https://api.github.com/users/jkovacs/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/jkovacs/flink","description":"Mirror of Apache Flink","fork":true,"url":"https://api.github.com/repos/jkovacs/flink","forks_url":"https://api.github.com/repos/jkovacs/flink/forks","keys_url":"https://api.github.com/repos/jkovacs/flink/keys{/key_id}","collaborators_url":"https://api.github.com/repos/jkovacs/flink/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/jkovacs/flink/teams","hooks_url":"https://api.github.com/repos/jkovacs/flink/hooks","issue_events_url":"https://api.github.com/repos/jkovacs/flink/issues/events{/number}","events_url":"https://api.github.com/repos/jkovacs/flink/events","assignees_url":"https://api.github.com/repos/jkovacs/flink/assignees{/user}","branches_url":"https://api.github.com/repos/jkovacs/flink/branches{/branch}","tags_url":"https://api.github.com/repos/jkovacs/flink/tags","blobs_url":"https://api.github.com/repos/jkovacs/flink/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/jkovacs/flink/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/jkovacs/flink/git/refs{/sha}","trees_url":"https://api.github.com/repos/jkovacs/flink/git/trees{/sha}","statuses_url":"https://api.github.com/repos/jkovacs/flink/statuses/{sha}","languages_url":"https://api.github.com/repos/jkovacs/flink/languages","stargazers_url":"https://api.github.com/repos/jkovacs/flink/stargazers","contributors_url":"https://api.github.com/repos/jkovacs/flink/contributors","subscribers_url":"https://api.github.com/repos/jkovacs/flink/subscribers","subscription_url":"https://api.github.com/repos/jkovacs/flink/subscription","commits_url":"https://api.github.com/repos/jkovacs/flink/commits{/sha}","git_commits_url":"https://api.github.com/repos/jkovacs/flink/git/commits{/sha}","comments_url":"https://api.github.com/repos/jkovacs/flink/comments{/number}","issue_comment_url":"https://api.github.com/repos/jkovacs/flink/issues/comments{/number}","contents_url":"https://api.github.com/repos/jkovacs/flink/contents/{+path}","compare_url":"https://api.github.com/repos/jkovacs/flink/compare/{base}...{head}","merges_url":"https://api.github.com/repos/jkovacs/flink/merges","archive_url":"https://api.github.com/repos/jkovacs/flink/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/jkovacs/flink/downloads","issues_url":"https://api.github.com/repos/jkovacs/flink/issues{/number}","pulls_url":"https://api.github.com/repos/jkovacs/flink/pulls{/number}","milestones_url":"https://api.github.com/repos/jkovacs/flink/milestones{/number}","notifications_url":"https://api.github.com/repos/jkovacs/flink/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/jkovacs/flink/labels{/name}","releases_url":"https://api.github.com/repos/jkovacs/flink/releases{/id}","created_at":"2015-06-17T15:12:48Z","updated_at":"2015-06-17T15:12:59Z","pushed_at":"2015-09-21T15:09:31Z","git_url":"git://github.com/jkovacs/flink.git","ssh_url":"git@github.com:jkovacs/flink.git","clone_url":"https://github.com/jkovacs/flink.git","svn_url":"https://github.com/jkovacs/flink","homepage":null,"size":61932,"stargazers_count":0,"watchers_count":0,"language":"Java","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"apache:master","ref":"master","sha":"4abdbbb1b752537c1206af5010fad9af08106c37","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":20587599,"name":"flink","full_name":"apache/flink","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/flink","description":"Mirror of Apache Flink","fork":false,"url":"https://api.github.com/repos/apache/flink","forks_url":"https://api.github.com/repos/apache/flink/forks","keys_url":"https://api.github.com/repos/apache/flink/keys{/key_id}","collaborators_url":"https://api.github.com/repos/apache/flink/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/apache/flink/teams","hooks_url":"https://api.github.com/repos/apache/flink/hooks","issue_events_url":"https://api.github.com/repos/apache/flink/issues/events{/number}","events_url":"https://api.github.com/repos/apache/flink/events","assignees_url":"https://api.github.com/repos/apache/flink/assignees{/user}","branches_url":"https://api.github.com/repos/apache/flink/branches{/branch}","tags_url":"https://api.github.com/repos/apache/flink/tags","blobs_url":"https://api.github.com/repos/apache/flink/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/apache/flink/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/apache/flink/git/refs{/sha}","trees_url":"https://api.github.com/repos/apache/flink/git/trees{/sha}","statuses_url":"https://api.github.com/repos/apache/flink/statuses/{sha}","languages_url":"https://api.github.com/repos/apache/flink/languages","stargazers_url":"https://api.github.com/repos/apache/flink/stargazers","contributors_url":"https://api.github.com/repos/apache/flink/contributors","subscribers_url":"https://api.github.com/repos/apache/flink/subscribers","subscription_url":"https://api.github.com/repos/apache/flink/subscription","commits_url":"https://api.github.com/repos/apache/flink/commits{/sha}","git_commits_url":"https://api.github.com/repos/apache/flink/git/commits{/sha}","comments_url":"https://api.github.com/repos/apache/flink/comments{/number}","issue_comment_url":"https://api.github.com/repos/apache/flink/issues/comments{/number}","contents_url":"https://api.github.com/repos/apache/flink/contents/{+path}","compare_url":"https://api.github.com/repos/apache/flink/compare/{base}...{head}","merges_url":"https://api.github.com/repos/apache/flink/merges","archive_url":"https://api.github.com/repos/apache/flink/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/apache/flink/downloads","issues_url":"https://api.github.com/repos/apache/flink/issues{/number}","pulls_url":"https://api.github.com/repos/apache/flink/pulls{/number}","milestones_url":"https://api.github.com/repos/apache/flink/milestones{/number}","notifications_url":"https://api.github.com/repos/apache/flink/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/apache/flink/labels{/name}","releases_url":"https://api.github.com/repos/apache/flink/releases{/id}","created_at":"2014-06-07T07:00:10Z","updated_at":"2015-09-25T03:05:24Z","pushed_at":"2015-09-25T14:17:13Z","git_url":"git://github.com/apache/flink.git","ssh_url":"git@github.com:apache/flink.git","clone_url":"https://github.com/apache/flink.git","svn_url":"https://github.com/apache/flink","homepage":null,"size":2524860,"stargazers_count":638,"watchers_count":638,"language":"Java","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":430,"mirror_url":"git://git.apache.org/incubator-flink.git","open_issues_count":73,"forks":430,"open_issues":73,"watchers":638,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/apache/flink/pulls/1138"},"html":{"href":"https://github.com/apache/flink/pull/1138"},"issue":{"href":"https://api.github.com/repos/apache/flink/issues/1138"},"comments":{"href":"https://api.github.com/repos/apache/flink/issues/1138/comments"},"review_comments":{"href":"https://api.github.com/repos/apache/flink/pulls/1138/comments"},"review_comment":{"href":"https://api.github.com/repos/apache/flink/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/apache/flink/pulls/1138/commits"},"statuses":{"href":"https://api.github.com/repos/apache/flink/statuses/45b515a3715318a6d3d194a16b3b2c4c69902755"}}}}