{"action":"created","comment":{"url":"https://api.github.com/repos/apache/flink/pulls/comments/289273841","pull_request_review_id":244152657,"id":289273841,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDI4OTI3Mzg0MQ==","diff_hunk":"@@ -0,0 +1,494 @@\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.table.typeutils;\n+\n+import org.apache.flink.api.common.typeinfo.TypeInformation;\n+import org.apache.flink.api.common.typeinfo.Types;\n+import org.apache.flink.api.common.typeutils.CompositeType;\n+import org.apache.flink.api.java.typeutils.GenericTypeInfo;\n+import org.apache.flink.api.java.typeutils.PojoTypeInfo;\n+import org.apache.flink.api.java.typeutils.TupleTypeInfoBase;\n+import org.apache.flink.table.api.TableException;\n+import org.apache.flink.table.api.TableSchema;\n+import org.apache.flink.table.expressions.ApiExpressionDefaultVisitor;\n+import org.apache.flink.table.expressions.BuiltInFunctionDefinitions;\n+import org.apache.flink.table.expressions.CallExpression;\n+import org.apache.flink.table.expressions.Expression;\n+import org.apache.flink.table.expressions.ExpressionUtils;\n+import org.apache.flink.table.expressions.UnresolvedReferenceExpression;\n+import org.apache.flink.types.Row;\n+\n+import java.lang.reflect.Modifier;\n+import java.util.Arrays;\n+import java.util.Collections;\n+import java.util.HashSet;\n+import java.util.LinkedHashSet;\n+import java.util.List;\n+import java.util.Optional;\n+import java.util.Set;\n+import java.util.stream.Collectors;\n+import java.util.stream.IntStream;\n+\n+import static java.lang.String.format;\n+import static org.apache.flink.table.expressions.BuiltInFunctionDefinitions.TIME_ATTRIBUTES;\n+\n+/**\n+ * Utility classes for extracting names and indices of fields from different {@link TypeInformation}s.\n+ */\n+public class FieldInfoUtils {\n+\n+\t/**\n+\t * Describes extracted fields and corresponding indices from a {@link TypeInformation}.\n+\t */\n+\tpublic static class FieldsInfo {\n+\t\tprivate final String[] fieldNames;\n+\t\tprivate final int[] indices;\n+\n+\t\tFieldsInfo(String[] fieldNames, int[] indices) {\n+\t\t\tthis.fieldNames = fieldNames;\n+\t\t\tthis.indices = indices;\n+\t\t}\n+\n+\t\tpublic String[] getFieldNames() {\n+\t\t\treturn fieldNames;\n+\t\t}\n+\n+\t\tpublic int[] getIndices() {\n+\t\t\treturn indices;\n+\t\t}\n+\t}\n+\n+\t/**\n+\t * Reference input fields by name:\n+\t * All fields in the schema definition are referenced by name\n+\t * (and possibly renamed using an alias (as). In this mode, fields can be reordered and\n+\t * projected out. Moreover, we can define proctime and rowtime attributes at arbitrary\n+\t * positions using arbitrary names (except those that exist in the result schema). This mode\n+\t * can be used for any input type, including POJOs.\n+\t *\n+\t * <p>Reference input fields by position:\n+\t * In this mode, fields are simply renamed. Event-time attributes can\n+\t * replace the field on their position in the input data (if it is of correct type) or be\n+\t * appended at the end. Proctime attributes must be appended at the end. This mode can only be\n+\t * used if the input type has a defined field order (tuple, case class, Row) and no of fields\n+\t * references a field of the input type.\n+\t */\n+\tpublic static boolean isReferenceByPosition(CompositeType<?> ct, Expression[] fields) {\n+\t\tif (!(ct instanceof TupleTypeInfoBase)) {\n+\t\t\treturn false;\n+\t\t}\n+\n+\t\tList<String> inputNames = Arrays.asList(ct.getFieldNames());\n+\n+\t\t// Use the by-position mode if no of the fields exists in the input.\n+\t\t// This prevents confusing cases like ('f2, 'f0, 'myName) for a Tuple3 where fields are renamed\n+\t\t// by position but the user might assume reordering instead of renaming.\n+\t\treturn Arrays.stream(fields).allMatch(f -> {\n+\t\t\tif (f instanceof UnresolvedReferenceExpression) {\n+\t\t\t\treturn !inputNames.contains(((UnresolvedReferenceExpression) f).getName());\n+\t\t\t}\n+\n+\t\t\treturn true;\n+\t\t});\n+\t}\n+\n+\t/**\n+\t * Returns field names and field positions for a given {@link TypeInformation}.\n+\t *\n+\t * @param inputType The TypeInformation extract the field names and positions from.\n+\t * @param <A> The type of the TypeInformation.\n+\t * @return A tuple of two arrays holding the field names and corresponding field positions.\n+\t */\n+\tpublic static <A> FieldsInfo getFieldInfo(TypeInformation<A> inputType) {\n+\n+\t\tif (inputType instanceof GenericTypeInfo && inputType.getTypeClass() == Row.class) {\n+\t\t\tthrow new TableException(\n+\t\t\t\t\"An input of GenericTypeInfo<Row> cannot be converted to Table. \" +\n+\t\t\t\t\t\"Please specify the type of the input with a RowTypeInfo.\");\n+\t\t} else {\n+\t\t\treturn new FieldsInfo(getFieldNames(inputType), getFieldIndices(inputType));\n+\t\t}\n+\t}\n+\n+\t/**\n+\t * Returns field names and field positions for a given {@link TypeInformation} and array of\n+\t * {@link Expression}. It does not handle time attributes but considers them in indices.\n+\t *\n+\t * @param inputType The {@link TypeInformation} against which the {@link Expression}s are evaluated.\n+\t * @param exprs     The expressions that define the field names.\n+\t * @param <A> The type of the TypeInformation.\n+\t * @return A tuple of two arrays holding the field names and corresponding field positions.\n+\t */\n+\tpublic static <A> FieldsInfo getFieldInfo(TypeInformation<A> inputType, Expression[] exprs) {\n+\t\tvalidateType(inputType);\n+\n+\t\tfinal Set<FieldInfo> fieldInfos;\n+\t\tif (inputType instanceof GenericTypeInfo && inputType.getTypeClass() == Row.class) {\n+\t\t\tthrow new TableException(\n+\t\t\t\t\"An input of GenericTypeInfo<Row> cannot be converted to Table. \" +\n+\t\t\t\t\t\"Please specify the type of the input with a RowTypeInfo.\");\n+\t\t} else if (inputType instanceof TupleTypeInfoBase) {\n+\t\t\tfieldInfos = extractFieldInfosFromTupleType((CompositeType) inputType, exprs);\n+\t\t} else if (inputType instanceof PojoTypeInfo) {\n+\t\t\tfieldInfos = extractFieldInfosByNameReference((CompositeType) inputType, exprs);\n+\t\t} else {\n+\t\t\tfieldInfos = extractFieldInfoFromAtomicType(exprs);\n+\t\t}\n+\n+\t\tif (fieldInfos.stream().anyMatch(info -> info.getFieldName().equals(\"*\"))) {\n+\t\t\tthrow new TableException(\"Field name can not be '*'.\");\n+\t\t}\n+\n+\t\tString[] fieldNames = fieldInfos.stream().map(FieldInfo::getFieldName).toArray(String[]::new);\n+\t\tint[] fieldIndices = fieldInfos.stream().mapToInt(FieldInfo::getIndex).toArray();\n+\t\treturn new FieldsInfo(fieldNames, fieldIndices);\n+\t}\n+\n+\t/**\n+\t * Returns field names for a given {@link TypeInformation}.\n+\t *\n+\t * @param inputType The TypeInformation extract the field names.\n+\t * @param <A> The type of the TypeInformation.\n+\t * @return An array holding the field names\n+\t */\n+\tpublic static <A> String[] getFieldNames(TypeInformation<A> inputType) {\n+\t\tvalidateType(inputType);\n+\n+\t\tfinal String[] fieldNames;\n+\t\tif (inputType instanceof CompositeType) {\n+\t\t\tfieldNames = ((CompositeType<A>) inputType).getFieldNames();\n+\t\t} else {\n+\t\t\tfieldNames = new String[]{\"f0\"};\n+\t\t}\n+\n+\t\tif (Arrays.asList(fieldNames).contains(\"*\")) {\n+\t\t\tthrow new TableException(\"Field name can not be '*'.\");\n+\t\t}\n+\n+\t\treturn fieldNames;\n+\t}\n+\n+\t/**\n+\t * Validate if class represented by the typeInfo is static and globally accessible.\n+\t *\n+\t * @param typeInfo type to check\n+\t * @throws TableException if type does not meet these criteria\n+\t */\n+\tpublic static <A> void validateType(TypeInformation<A> typeInfo) {","path":"flink-table/flink-table-api-java/src/main/java/org/apache/flink/table/typeutils/FieldInfoUtils.java","position":193,"original_position":193,"commit_id":"ec9fe1e6fbc5910b8976e7d79f4a3150ad6e7a11","original_commit_id":"d52594ce22e9decf527192bd7461c6981b8137f2","user":{"login":"twalthr","id":5746567,"node_id":"MDQ6VXNlcjU3NDY1Njc=","avatar_url":"https://avatars1.githubusercontent.com/u/5746567?v=4","gravatar_id":"","url":"https://api.github.com/users/twalthr","html_url":"https://github.com/twalthr","followers_url":"https://api.github.com/users/twalthr/followers","following_url":"https://api.github.com/users/twalthr/following{/other_user}","gists_url":"https://api.github.com/users/twalthr/gists{/gist_id}","starred_url":"https://api.github.com/users/twalthr/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/twalthr/subscriptions","organizations_url":"https://api.github.com/users/twalthr/orgs","repos_url":"https://api.github.com/users/twalthr/repos","events_url":"https://api.github.com/users/twalthr/events{/privacy}","received_events_url":"https://api.github.com/users/twalthr/received_events","type":"User","site_admin":false},"body":"Can we rename this into `validateInputTypeInfo` or something more useful?","created_at":"2019-05-31T06:45:17Z","updated_at":"2019-05-31T06:46:02Z","html_url":"https://github.com/apache/flink/pull/8521#discussion_r289273841","pull_request_url":"https://api.github.com/repos/apache/flink/pulls/8521","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/apache/flink/pulls/comments/289273841"},"html":{"href":"https://github.com/apache/flink/pull/8521#discussion_r289273841"},"pull_request":{"href":"https://api.github.com/repos/apache/flink/pulls/8521"}}},"pull_request":{"url":"https://api.github.com/repos/apache/flink/pulls/8521","id":281557296,"node_id":"MDExOlB1bGxSZXF1ZXN0MjgxNTU3Mjk2","html_url":"https://github.com/apache/flink/pull/8521","diff_url":"https://github.com/apache/flink/pull/8521.diff","patch_url":"https://github.com/apache/flink/pull/8521.patch","issue_url":"https://api.github.com/repos/apache/flink/issues/8521","number":8521,"state":"open","locked":false,"title":"[FLINK-12601][table] Make the DataStream & DataSet conversion to a Table independent from Calcite","user":{"login":"dawidwys","id":6242259,"node_id":"MDQ6VXNlcjYyNDIyNTk=","avatar_url":"https://avatars3.githubusercontent.com/u/6242259?v=4","gravatar_id":"","url":"https://api.github.com/users/dawidwys","html_url":"https://github.com/dawidwys","followers_url":"https://api.github.com/users/dawidwys/followers","following_url":"https://api.github.com/users/dawidwys/following{/other_user}","gists_url":"https://api.github.com/users/dawidwys/gists{/gist_id}","starred_url":"https://api.github.com/users/dawidwys/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dawidwys/subscriptions","organizations_url":"https://api.github.com/users/dawidwys/orgs","repos_url":"https://api.github.com/users/dawidwys/repos","events_url":"https://api.github.com/users/dawidwys/events{/privacy}","received_events_url":"https://api.github.com/users/dawidwys/received_events","type":"User","site_admin":false},"body":"## What is the purpose of the change\r\n\r\nThis PR makes the `DataStream` & `DataSet` conversion to a `Table` independent from Calcite. \r\n\r\n\r\n## Brief change log\r\nIt is based on #8404 \r\n\r\nSee commit messages.\r\n\r\nc8001558d361e4f69a75b141adcb85fb1610bd31 - should be squashed with ea32cadeb2ce12caaabcc34eded44cb06eacbda7 before merging. I separated it to make the review easier, as it contains a lot of simple adjustments to the test base that will comply with new internal behavior that is covered in ea32cadeb2ce12caaabcc34eded44cb06eacbda7\r\n\r\n\r\n## Verifying this change\r\n\r\nThis change is already covered by existing tests.\r\n\r\n## Does this pull request potentially affect one of the following parts:\r\n\r\n  - Dependencies (does it add or upgrade a dependency): (yes / **no**)\r\n  - The public API, i.e., is any changed class annotated with `@Public(Evolving)`: (yes / **no**)\r\n  - The serializers: (yes / **no** / don't know)\r\n  - The runtime per-record code paths (performance sensitive): (yes / **no** / don't know)\r\n  - Anything that affects deployment or recovery: JobManager (and its components), Checkpointing, Yarn/Mesos, ZooKeeper: (yes / **no** / don't know)\r\n  - The S3 file system connector: (yes / **no** / don't know)\r\n\r\n## Documentation\r\n\r\n  - Does this pull request introduce a new feature? (yes / **no**)\r\n  - If yes, how is the feature documented? (**not applicable** / docs / JavaDocs / not documented)\r\n","created_at":"2019-05-23T11:19:21Z","updated_at":"2019-05-31T06:46:02Z","closed_at":null,"merged_at":null,"merge_commit_sha":"1d570b1ecf2909735d8318e5a0006227c38a6cd8","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[{"id":1289893384,"node_id":"MDU6TGFiZWwxMjg5ODkzMzg0","url":"https://api.github.com/repos/apache/flink/labels/component=TableSQL/API","name":"component=TableSQL/API","color":"175fb7","default":false},{"id":1341819565,"node_id":"MDU6TGFiZWwxMzQxODE5NTY1","url":"https://api.github.com/repos/apache/flink/labels/component=TableSQL/LegacyPlanner","name":"component=TableSQL/LegacyPlanner","color":"175fb7","default":false},{"id":1244454690,"node_id":"MDU6TGFiZWwxMjQ0NDU0Njkw","url":"https://api.github.com/repos/apache/flink/labels/review=description?","name":"review=description?","color":"bcf5db","default":false}],"milestone":null,"commits_url":"https://api.github.com/repos/apache/flink/pulls/8521/commits","review_comments_url":"https://api.github.com/repos/apache/flink/pulls/8521/comments","review_comment_url":"https://api.github.com/repos/apache/flink/pulls/comments{/number}","comments_url":"https://api.github.com/repos/apache/flink/issues/8521/comments","statuses_url":"https://api.github.com/repos/apache/flink/statuses/ec9fe1e6fbc5910b8976e7d79f4a3150ad6e7a11","head":{"label":"dawidwys:flink12601","ref":"flink12601","sha":"ec9fe1e6fbc5910b8976e7d79f4a3150ad6e7a11","user":{"login":"dawidwys","id":6242259,"node_id":"MDQ6VXNlcjYyNDIyNTk=","avatar_url":"https://avatars3.githubusercontent.com/u/6242259?v=4","gravatar_id":"","url":"https://api.github.com/users/dawidwys","html_url":"https://github.com/dawidwys","followers_url":"https://api.github.com/users/dawidwys/followers","following_url":"https://api.github.com/users/dawidwys/following{/other_user}","gists_url":"https://api.github.com/users/dawidwys/gists{/gist_id}","starred_url":"https://api.github.com/users/dawidwys/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dawidwys/subscriptions","organizations_url":"https://api.github.com/users/dawidwys/orgs","repos_url":"https://api.github.com/users/dawidwys/repos","events_url":"https://api.github.com/users/dawidwys/events{/privacy}","received_events_url":"https://api.github.com/users/dawidwys/received_events","type":"User","site_admin":false},"repo":{"id":43764900,"node_id":"MDEwOlJlcG9zaXRvcnk0Mzc2NDkwMA==","name":"flink","full_name":"dawidwys/flink","private":false,"owner":{"login":"dawidwys","id":6242259,"node_id":"MDQ6VXNlcjYyNDIyNTk=","avatar_url":"https://avatars3.githubusercontent.com/u/6242259?v=4","gravatar_id":"","url":"https://api.github.com/users/dawidwys","html_url":"https://github.com/dawidwys","followers_url":"https://api.github.com/users/dawidwys/followers","following_url":"https://api.github.com/users/dawidwys/following{/other_user}","gists_url":"https://api.github.com/users/dawidwys/gists{/gist_id}","starred_url":"https://api.github.com/users/dawidwys/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dawidwys/subscriptions","organizations_url":"https://api.github.com/users/dawidwys/orgs","repos_url":"https://api.github.com/users/dawidwys/repos","events_url":"https://api.github.com/users/dawidwys/events{/privacy}","received_events_url":"https://api.github.com/users/dawidwys/received_events","type":"User","site_admin":false},"html_url":"https://github.com/dawidwys/flink","description":"Mirror of Apache Flink","fork":true,"url":"https://api.github.com/repos/dawidwys/flink","forks_url":"https://api.github.com/repos/dawidwys/flink/forks","keys_url":"https://api.github.com/repos/dawidwys/flink/keys{/key_id}","collaborators_url":"https://api.github.com/repos/dawidwys/flink/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/dawidwys/flink/teams","hooks_url":"https://api.github.com/repos/dawidwys/flink/hooks","issue_events_url":"https://api.github.com/repos/dawidwys/flink/issues/events{/number}","events_url":"https://api.github.com/repos/dawidwys/flink/events","assignees_url":"https://api.github.com/repos/dawidwys/flink/assignees{/user}","branches_url":"https://api.github.com/repos/dawidwys/flink/branches{/branch}","tags_url":"https://api.github.com/repos/dawidwys/flink/tags","blobs_url":"https://api.github.com/repos/dawidwys/flink/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/dawidwys/flink/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/dawidwys/flink/git/refs{/sha}","trees_url":"https://api.github.com/repos/dawidwys/flink/git/trees{/sha}","statuses_url":"https://api.github.com/repos/dawidwys/flink/statuses/{sha}","languages_url":"https://api.github.com/repos/dawidwys/flink/languages","stargazers_url":"https://api.github.com/repos/dawidwys/flink/stargazers","contributors_url":"https://api.github.com/repos/dawidwys/flink/contributors","subscribers_url":"https://api.github.com/repos/dawidwys/flink/subscribers","subscription_url":"https://api.github.com/repos/dawidwys/flink/subscription","commits_url":"https://api.github.com/repos/dawidwys/flink/commits{/sha}","git_commits_url":"https://api.github.com/repos/dawidwys/flink/git/commits{/sha}","comments_url":"https://api.github.com/repos/dawidwys/flink/comments{/number}","issue_comment_url":"https://api.github.com/repos/dawidwys/flink/issues/comments{/number}","contents_url":"https://api.github.com/repos/dawidwys/flink/contents/{+path}","compare_url":"https://api.github.com/repos/dawidwys/flink/compare/{base}...{head}","merges_url":"https://api.github.com/repos/dawidwys/flink/merges","archive_url":"https://api.github.com/repos/dawidwys/flink/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/dawidwys/flink/downloads","issues_url":"https://api.github.com/repos/dawidwys/flink/issues{/number}","pulls_url":"https://api.github.com/repos/dawidwys/flink/pulls{/number}","milestones_url":"https://api.github.com/repos/dawidwys/flink/milestones{/number}","notifications_url":"https://api.github.com/repos/dawidwys/flink/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/dawidwys/flink/labels{/name}","releases_url":"https://api.github.com/repos/dawidwys/flink/releases{/id}","deployments_url":"https://api.github.com/repos/dawidwys/flink/deployments","created_at":"2015-10-06T17:01:12Z","updated_at":"2019-02-20T08:03:41Z","pushed_at":"2019-05-30T11:03:32Z","git_url":"git://github.com/dawidwys/flink.git","ssh_url":"git@github.com:dawidwys/flink.git","clone_url":"https://github.com/dawidwys/flink.git","svn_url":"https://github.com/dawidwys/flink","homepage":null,"size":182337,"stargazers_count":0,"watchers_count":0,"language":"Java","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":3,"mirror_url":null,"archived":false,"disabled":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":3,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"apache:master","ref":"master","sha":"305095743ffe0bc39f76c1bda983da7d0df9e003","user":{"login":"apache","id":47359,"node_id":"MDEyOk9yZ2FuaXphdGlvbjQ3MzU5","avatar_url":"https://avatars0.githubusercontent.com/u/47359?v=4","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,"node_id":"MDEwOlJlcG9zaXRvcnkyMDU4NzU5OQ==","name":"flink","full_name":"apache/flink","private":false,"owner":{"login":"apache","id":47359,"node_id":"MDEyOk9yZ2FuaXphdGlvbjQ3MzU5","avatar_url":"https://avatars0.githubusercontent.com/u/47359?v=4","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},"html_url":"https://github.com/apache/flink","description":"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}","deployments_url":"https://api.github.com/repos/apache/flink/deployments","created_at":"2014-06-07T07:00:10Z","updated_at":"2019-05-31T06:30:14Z","pushed_at":"2019-05-31T06:34:22Z","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":"","size":241470,"stargazers_count":8861,"watchers_count":8861,"language":"Java","has_issues":false,"has_projects":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":4708,"mirror_url":null,"archived":false,"disabled":false,"open_issues_count":457,"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":4708,"open_issues":457,"watchers":8861,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/apache/flink/pulls/8521"},"html":{"href":"https://github.com/apache/flink/pull/8521"},"issue":{"href":"https://api.github.com/repos/apache/flink/issues/8521"},"comments":{"href":"https://api.github.com/repos/apache/flink/issues/8521/comments"},"review_comments":{"href":"https://api.github.com/repos/apache/flink/pulls/8521/comments"},"review_comment":{"href":"https://api.github.com/repos/apache/flink/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/apache/flink/pulls/8521/commits"},"statuses":{"href":"https://api.github.com/repos/apache/flink/statuses/ec9fe1e6fbc5910b8976e7d79f4a3150ad6e7a11"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"twalthr"}}