{"action":"created","comment":{"url":"https://api.github.com/repos/dataArtisans/flink-dataflow/pulls/comments/50132826","id":50132826,"diff_hunk":"@@ -0,0 +1,242 @@\n+package com.dataartisans.flink.dataflow.streaming;\n+\n+import com.dataartisans.flink.dataflow.translation.wrappers.streaming.state.FlinkStateInternals;\n+import com.dataartisans.flink.dataflow.translation.wrappers.streaming.state.StateCheckpointReader;\n+import com.dataartisans.flink.dataflow.translation.wrappers.streaming.state.StateCheckpointUtils;\n+import com.dataartisans.flink.dataflow.translation.wrappers.streaming.state.StateCheckpointWriter;\n+import com.google.cloud.dataflow.sdk.coders.CannotProvideCoderException;\n+import com.google.cloud.dataflow.sdk.coders.Coder;\n+import com.google.cloud.dataflow.sdk.coders.StringUtf8Coder;\n+import com.google.cloud.dataflow.sdk.coders.VarIntCoder;\n+import com.google.cloud.dataflow.sdk.transforms.Combine;\n+import com.google.cloud.dataflow.sdk.transforms.Sum;\n+import com.google.cloud.dataflow.sdk.transforms.windowing.BoundedWindow;\n+import com.google.cloud.dataflow.sdk.transforms.windowing.IntervalWindow;\n+import com.google.cloud.dataflow.sdk.util.TimeDomain;\n+import com.google.cloud.dataflow.sdk.util.TimerInternals;\n+import com.google.cloud.dataflow.sdk.util.state.*;\n+import org.apache.flink.api.java.typeutils.runtime.ByteArrayInputView;\n+import org.apache.flink.core.memory.DataInputView;\n+import org.apache.flink.runtime.state.StateBackend;\n+import org.apache.flink.runtime.state.memory.MemoryStateBackend;\n+import org.joda.time.Instant;\n+import org.junit.Test;\n+\n+import java.util.*;\n+\n+import static org.junit.Assert.assertEquals;\n+\n+public class StateSerializationTest {\n+\n+\tprivate static final StateNamespace NAMESPACE_1 = StateNamespaces.global();\n+\tprivate static final String KEY_PREFIX = \"TEST_\";\n+\n+\tprivate static final StateTag<ValueState<String>> STRING_VALUE_ADDR =\n+\t\t\tStateTags.value(\"stringValue\", StringUtf8Coder.of());\n+\tprivate static final StateTag<ValueState<Integer>> INT_VALUE_ADDR =\n+\t\t\tStateTags.value(\"stringValue\", VarIntCoder.of());\n+\tprivate static final StateTag<CombiningValueState<Integer, Integer>> SUM_INTEGER_ADDR =\n+\t\t\tStateTags.combiningValueFromInputInternal(\n+\t\t\t\t\t\"sumInteger\", VarIntCoder.of(), new Sum.SumIntegerFn());\n+\tprivate static final StateTag<BagState<String>> STRING_BAG_ADDR =\n+\t\t\tStateTags.bag(\"stringBag\", StringUtf8Coder.of());\n+\tprivate static final StateTag<WatermarkStateInternal> WATERMARK_BAG_ADDR =\n+\t\t\tStateTags.watermarkStateInternal(\"watermark\");\n+\n+\tprivate Combine.CombineFn combiner = new Sum.SumIntegerFn();\n+\n+\tprivate Map<String, FlinkStateInternals<String>> statePerKey = new HashMap<>();\n+\n+\tprivate Map<String, Set<TimerInternals.TimerData>> activeTimers = new HashMap<>();\n+\n+\tprivate void initializeStateAndTimers() throws CannotProvideCoderException {\n+\t\tfor (int i = 0; i < 10; i++) {\n+\t\t\tString key = KEY_PREFIX + i;\n+\n+\t\t\tFlinkStateInternals state = initializeStateForKey(key);\n+\t\t\tSet<TimerInternals.TimerData> timers = new HashSet<>();\n+\t\t\tfor (int j = 0; j < 5; j++) {\n+\t\t\t\tTimerInternals.TimerData timer = TimerInternals\n+\t\t\t\t\t\t.TimerData.of(NAMESPACE_1,\n+\t\t\t\t\t\t\t\tnew Instant(1000 + i + j), TimeDomain.values()[j % 3]);\n+\t\t\t\ttimers.add(timer);\n+\t\t\t}\n+\n+\t\t\tstatePerKey.put(key, state);\n+\t\t\tactiveTimers.put(key, timers);\n+\t\t}\n+\t}\n+\n+\tprivate FlinkStateInternals<String> initializeStateForKey(String key) throws CannotProvideCoderException {\n+\t\tFlinkStateInternals<String> state = createState(key);\n+\n+\t\tValueState<String> value = state.state(NAMESPACE_1, STRING_VALUE_ADDR);\n+\t\tvalue.set(\"test\");\n+\n+\t\tValueState<Integer> value2 = state.state(NAMESPACE_1, INT_VALUE_ADDR);\n+\t\tvalue2.set(4);\n+\t\tvalue2.set(5);\n+\n+\t\tCombiningValueState<Integer, Integer> combiningValue = state.state(NAMESPACE_1, SUM_INTEGER_ADDR);\n+\t\tcombiningValue.add(1);\n+\t\tcombiningValue.add(2);\n+\n+\t\tWatermarkStateInternal watermark = state.state(NAMESPACE_1, WATERMARK_BAG_ADDR);\n+\t\twatermark.add(new Instant(1000));\n+\n+\t\tBagState<String> bag = state.state(NAMESPACE_1, STRING_BAG_ADDR);\n+\t\tbag.add(\"v1\");\n+\t\tbag.add(\"v2\");\n+\t\tbag.add(\"v3\");\n+\t\tbag.add(\"v4\");\n+\t\treturn state;\n+\t}\n+\n+\tprivate boolean restoreAndTestState(DataInputView in) throws Exception {\n+\t\tStateCheckpointReader reader = new StateCheckpointReader(in);\n+\t\tfinal ClassLoader userClassloader = this.getClass().getClassLoader();\n+\t\tCoder<? extends BoundedWindow> windowCoder = IntervalWindow.getCoder();\n+\t\tCoder<String> keyCoder = StringUtf8Coder.of();\n+\n+\t\tboolean comparisonRes = true;\n+\n+\t\tfor(String key: statePerKey.keySet()) {\n+\t\t\tcomparisonRes &= checkStateForKey(key);\n+\t\t}\n+\n+\t\t// restore the timers\n+\t\tMap<String, Set<TimerInternals.TimerData>> restoredTimersPerKey = StateCheckpointUtils.decodeTimers(reader, windowCoder, keyCoder);\n+\t\tif(activeTimers.size() != restoredTimersPerKey.size()) {\n+\t\t\treturn false;\n+\t\t}\n+\n+\t\tfor(String key: statePerKey.keySet()) {\n+\t\t\tSet<TimerInternals.TimerData> originalTimers = activeTimers.get(key);\n+\t\t\tSet<TimerInternals.TimerData> restoredTimers = restoredTimersPerKey.get(key);\n+\t\t\tcomparisonRes &= checkTimersForKey(originalTimers, restoredTimers);\n+\t\t}\n+\n+\t\t// restore the state\n+\t\tMap<String, FlinkStateInternals<String>> restoredPerKeyState = StateCheckpointUtils.decodeState(reader, combiner.asKeyedFn(), keyCoder, windowCoder, userClassloader);\n+\t\tif(restoredPerKeyState.size() != statePerKey.size()) {\n+\t\t\treturn false;\n+\t\t}\n+\n+\t\tfor(String key: statePerKey.keySet()) {\n+\t\t\tFlinkStateInternals<String> originalState = statePerKey.get(key);\n+\t\t\tFlinkStateInternals<String> restoredState = restoredPerKeyState.get(key);\n+\t\t\tcomparisonRes &= checkStateForKey(originalState, restoredState);\n+\t\t}\n+\t\treturn comparisonRes;\n+\t}\n+\n+\tprivate boolean checkStateForKey(String key) throws CannotProvideCoderException {\n+\t\tFlinkStateInternals<String> state = statePerKey.get(key);\n+\n+\t\tValueState<String> value = state.state(NAMESPACE_1, STRING_VALUE_ADDR);\n+\t\tboolean comp = value.get().read().equals(\"test\");\n+\n+\t\tValueState<Integer> value2 = state.state(NAMESPACE_1, INT_VALUE_ADDR);\n+\t\tcomp &= value2.get().read().equals(5);\n+\n+\t\tCombiningValueState<Integer, Integer> combiningValue = state.state(NAMESPACE_1, SUM_INTEGER_ADDR);\n+\t\tcomp &= combiningValue.get().read().equals(3);\n+\n+\t\tWatermarkStateInternal watermark = state.state(NAMESPACE_1, WATERMARK_BAG_ADDR);\n+\t\tcomp &= watermark.get().read().equals(new Instant(1000));\n+\n+\t\tBagState<String> bag = state.state(NAMESPACE_1, STRING_BAG_ADDR);\n+\t\tIterator<String> it = bag.get().read().iterator();\n+\t\tint i = 0;\n+\t\twhile(it.hasNext()) {\n+\t\t\tcomp &= it.next().equals(\"v\"+ (++i));\n+\t\t}\n+\t\treturn comp;\n+\t}\n+\n+\tprivate void storeState(StateBackend.CheckpointStateOutputView out) throws Exception {\n+\t\tStateCheckpointWriter checkpointBuilder = StateCheckpointWriter.create(out);\n+\t\tCoder<String> keyCoder = StringUtf8Coder.of();\n+\n+\t\t// checkpoint the timers\n+\t\tStateCheckpointUtils.encodeTimers(activeTimers, checkpointBuilder,keyCoder);//encodeTimers(out, keyCoder);","path":"src/test/java/com/dataartisans/flink/dataflow/streaming/StateSerializationTest.java","position":162,"original_position":162,"commit_id":"f4d3413cecb9aff34dad5c1a3bac4f3ecb8b7b41","original_commit_id":"f4d3413cecb9aff34dad5c1a3bac4f3ecb8b7b41","user":{"login":"mxm","id":837221,"avatar_url":"https://avatars.githubusercontent.com/u/837221?v=3","gravatar_id":"","url":"https://api.github.com/users/mxm","html_url":"https://github.com/mxm","followers_url":"https://api.github.com/users/mxm/followers","following_url":"https://api.github.com/users/mxm/following{/other_user}","gists_url":"https://api.github.com/users/mxm/gists{/gist_id}","starred_url":"https://api.github.com/users/mxm/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mxm/subscriptions","organizations_url":"https://api.github.com/users/mxm/orgs","repos_url":"https://api.github.com/users/mxm/repos","events_url":"https://api.github.com/users/mxm/events{/privacy}","received_events_url":"https://api.github.com/users/mxm/received_events","type":"User","site_admin":false},"body":"Left over comment.","created_at":"2016-01-19T16:13:34Z","updated_at":"2016-01-19T16:13:34Z","html_url":"https://github.com/dataArtisans/flink-dataflow/pull/5#discussion_r50132826","pull_request_url":"https://api.github.com/repos/dataArtisans/flink-dataflow/pulls/5","_links":{"self":{"href":"https://api.github.com/repos/dataArtisans/flink-dataflow/pulls/comments/50132826"},"html":{"href":"https://github.com/dataArtisans/flink-dataflow/pull/5#discussion_r50132826"},"pull_request":{"href":"https://api.github.com/repos/dataArtisans/flink-dataflow/pulls/5"}}},"pull_request":{"url":"https://api.github.com/repos/dataArtisans/flink-dataflow/pulls/5","id":56466384,"html_url":"https://github.com/dataArtisans/flink-dataflow/pull/5","diff_url":"https://github.com/dataArtisans/flink-dataflow/pull/5.diff","patch_url":"https://github.com/dataArtisans/flink-dataflow/pull/5.patch","issue_url":"https://api.github.com/repos/dataArtisans/flink-dataflow/issues/5","number":5,"state":"open","locked":false,"title":"Add support for the streaming dataflow API with checkpointing.","user":{"login":"kl0u","id":2405800,"avatar_url":"https://avatars.githubusercontent.com/u/2405800?v=3","gravatar_id":"","url":"https://api.github.com/users/kl0u","html_url":"https://github.com/kl0u","followers_url":"https://api.github.com/users/kl0u/followers","following_url":"https://api.github.com/users/kl0u/following{/other_user}","gists_url":"https://api.github.com/users/kl0u/gists{/gist_id}","starred_url":"https://api.github.com/users/kl0u/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kl0u/subscriptions","organizations_url":"https://api.github.com/users/kl0u/orgs","repos_url":"https://api.github.com/users/kl0u/repos","events_url":"https://api.github.com/users/kl0u/events{/privacy}","received_events_url":"https://api.github.com/users/kl0u/received_events","type":"User","site_admin":false},"body":"","created_at":"2016-01-19T13:35:48Z","updated_at":"2016-01-19T16:13:34Z","closed_at":null,"merged_at":null,"merge_commit_sha":"25f046884d1faf37834c3238100fd744d6ff79ba","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/dataArtisans/flink-dataflow/pulls/5/commits","review_comments_url":"https://api.github.com/repos/dataArtisans/flink-dataflow/pulls/5/comments","review_comment_url":"https://api.github.com/repos/dataArtisans/flink-dataflow/pulls/comments{/number}","comments_url":"https://api.github.com/repos/dataArtisans/flink-dataflow/issues/5/comments","statuses_url":"https://api.github.com/repos/dataArtisans/flink-dataflow/statuses/f4d3413cecb9aff34dad5c1a3bac4f3ecb8b7b41","head":{"label":"dataArtisans:streaming_new","ref":"streaming_new","sha":"f4d3413cecb9aff34dad5c1a3bac4f3ecb8b7b41","user":{"login":"dataArtisans","id":10691110,"avatar_url":"https://avatars.githubusercontent.com/u/10691110?v=3","gravatar_id":"","url":"https://api.github.com/users/dataArtisans","html_url":"https://github.com/dataArtisans","followers_url":"https://api.github.com/users/dataArtisans/followers","following_url":"https://api.github.com/users/dataArtisans/following{/other_user}","gists_url":"https://api.github.com/users/dataArtisans/gists{/gist_id}","starred_url":"https://api.github.com/users/dataArtisans/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dataArtisans/subscriptions","organizations_url":"https://api.github.com/users/dataArtisans/orgs","repos_url":"https://api.github.com/users/dataArtisans/repos","events_url":"https://api.github.com/users/dataArtisans/events{/privacy}","received_events_url":"https://api.github.com/users/dataArtisans/received_events","type":"Organization","site_admin":false},"repo":{"id":31009769,"name":"flink-dataflow","full_name":"dataArtisans/flink-dataflow","owner":{"login":"dataArtisans","id":10691110,"avatar_url":"https://avatars.githubusercontent.com/u/10691110?v=3","gravatar_id":"","url":"https://api.github.com/users/dataArtisans","html_url":"https://github.com/dataArtisans","followers_url":"https://api.github.com/users/dataArtisans/followers","following_url":"https://api.github.com/users/dataArtisans/following{/other_user}","gists_url":"https://api.github.com/users/dataArtisans/gists{/gist_id}","starred_url":"https://api.github.com/users/dataArtisans/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dataArtisans/subscriptions","organizations_url":"https://api.github.com/users/dataArtisans/orgs","repos_url":"https://api.github.com/users/dataArtisans/repos","events_url":"https://api.github.com/users/dataArtisans/events{/privacy}","received_events_url":"https://api.github.com/users/dataArtisans/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/dataArtisans/flink-dataflow","description":"Google Dataflow Runner for Apache Flink","fork":false,"url":"https://api.github.com/repos/dataArtisans/flink-dataflow","forks_url":"https://api.github.com/repos/dataArtisans/flink-dataflow/forks","keys_url":"https://api.github.com/repos/dataArtisans/flink-dataflow/keys{/key_id}","collaborators_url":"https://api.github.com/repos/dataArtisans/flink-dataflow/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/dataArtisans/flink-dataflow/teams","hooks_url":"https://api.github.com/repos/dataArtisans/flink-dataflow/hooks","issue_events_url":"https://api.github.com/repos/dataArtisans/flink-dataflow/issues/events{/number}","events_url":"https://api.github.com/repos/dataArtisans/flink-dataflow/events","assignees_url":"https://api.github.com/repos/dataArtisans/flink-dataflow/assignees{/user}","branches_url":"https://api.github.com/repos/dataArtisans/flink-dataflow/branches{/branch}","tags_url":"https://api.github.com/repos/dataArtisans/flink-dataflow/tags","blobs_url":"https://api.github.com/repos/dataArtisans/flink-dataflow/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/dataArtisans/flink-dataflow/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/dataArtisans/flink-dataflow/git/refs{/sha}","trees_url":"https://api.github.com/repos/dataArtisans/flink-dataflow/git/trees{/sha}","statuses_url":"https://api.github.com/repos/dataArtisans/flink-dataflow/statuses/{sha}","languages_url":"https://api.github.com/repos/dataArtisans/flink-dataflow/languages","stargazers_url":"https://api.github.com/repos/dataArtisans/flink-dataflow/stargazers","contributors_url":"https://api.github.com/repos/dataArtisans/flink-dataflow/contributors","subscribers_url":"https://api.github.com/repos/dataArtisans/flink-dataflow/subscribers","subscription_url":"https://api.github.com/repos/dataArtisans/flink-dataflow/subscription","commits_url":"https://api.github.com/repos/dataArtisans/flink-dataflow/commits{/sha}","git_commits_url":"https://api.github.com/repos/dataArtisans/flink-dataflow/git/commits{/sha}","comments_url":"https://api.github.com/repos/dataArtisans/flink-dataflow/comments{/number}","issue_comment_url":"https://api.github.com/repos/dataArtisans/flink-dataflow/issues/comments{/number}","contents_url":"https://api.github.com/repos/dataArtisans/flink-dataflow/contents/{+path}","compare_url":"https://api.github.com/repos/dataArtisans/flink-dataflow/compare/{base}...{head}","merges_url":"https://api.github.com/repos/dataArtisans/flink-dataflow/merges","archive_url":"https://api.github.com/repos/dataArtisans/flink-dataflow/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/dataArtisans/flink-dataflow/downloads","issues_url":"https://api.github.com/repos/dataArtisans/flink-dataflow/issues{/number}","pulls_url":"https://api.github.com/repos/dataArtisans/flink-dataflow/pulls{/number}","milestones_url":"https://api.github.com/repos/dataArtisans/flink-dataflow/milestones{/number}","notifications_url":"https://api.github.com/repos/dataArtisans/flink-dataflow/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/dataArtisans/flink-dataflow/labels{/name}","releases_url":"https://api.github.com/repos/dataArtisans/flink-dataflow/releases{/id}","created_at":"2015-02-19T10:07:35Z","updated_at":"2016-01-18T17:54:01Z","pushed_at":"2016-01-19T13:35:48Z","git_url":"git://github.com/dataArtisans/flink-dataflow.git","ssh_url":"git@github.com:dataArtisans/flink-dataflow.git","clone_url":"https://github.com/dataArtisans/flink-dataflow.git","svn_url":"https://github.com/dataArtisans/flink-dataflow","homepage":null,"size":396,"stargazers_count":21,"watchers_count":21,"language":"Java","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":8,"mirror_url":null,"open_issues_count":2,"forks":8,"open_issues":2,"watchers":21,"default_branch":"master"}},"base":{"label":"dataArtisans:master","ref":"master","sha":"5d9d789f934bae989b22d0e653f396dcd9e8ca90","user":{"login":"dataArtisans","id":10691110,"avatar_url":"https://avatars.githubusercontent.com/u/10691110?v=3","gravatar_id":"","url":"https://api.github.com/users/dataArtisans","html_url":"https://github.com/dataArtisans","followers_url":"https://api.github.com/users/dataArtisans/followers","following_url":"https://api.github.com/users/dataArtisans/following{/other_user}","gists_url":"https://api.github.com/users/dataArtisans/gists{/gist_id}","starred_url":"https://api.github.com/users/dataArtisans/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dataArtisans/subscriptions","organizations_url":"https://api.github.com/users/dataArtisans/orgs","repos_url":"https://api.github.com/users/dataArtisans/repos","events_url":"https://api.github.com/users/dataArtisans/events{/privacy}","received_events_url":"https://api.github.com/users/dataArtisans/received_events","type":"Organization","site_admin":false},"repo":{"id":31009769,"name":"flink-dataflow","full_name":"dataArtisans/flink-dataflow","owner":{"login":"dataArtisans","id":10691110,"avatar_url":"https://avatars.githubusercontent.com/u/10691110?v=3","gravatar_id":"","url":"https://api.github.com/users/dataArtisans","html_url":"https://github.com/dataArtisans","followers_url":"https://api.github.com/users/dataArtisans/followers","following_url":"https://api.github.com/users/dataArtisans/following{/other_user}","gists_url":"https://api.github.com/users/dataArtisans/gists{/gist_id}","starred_url":"https://api.github.com/users/dataArtisans/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dataArtisans/subscriptions","organizations_url":"https://api.github.com/users/dataArtisans/orgs","repos_url":"https://api.github.com/users/dataArtisans/repos","events_url":"https://api.github.com/users/dataArtisans/events{/privacy}","received_events_url":"https://api.github.com/users/dataArtisans/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/dataArtisans/flink-dataflow","description":"Google Dataflow Runner for Apache Flink","fork":false,"url":"https://api.github.com/repos/dataArtisans/flink-dataflow","forks_url":"https://api.github.com/repos/dataArtisans/flink-dataflow/forks","keys_url":"https://api.github.com/repos/dataArtisans/flink-dataflow/keys{/key_id}","collaborators_url":"https://api.github.com/repos/dataArtisans/flink-dataflow/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/dataArtisans/flink-dataflow/teams","hooks_url":"https://api.github.com/repos/dataArtisans/flink-dataflow/hooks","issue_events_url":"https://api.github.com/repos/dataArtisans/flink-dataflow/issues/events{/number}","events_url":"https://api.github.com/repos/dataArtisans/flink-dataflow/events","assignees_url":"https://api.github.com/repos/dataArtisans/flink-dataflow/assignees{/user}","branches_url":"https://api.github.com/repos/dataArtisans/flink-dataflow/branches{/branch}","tags_url":"https://api.github.com/repos/dataArtisans/flink-dataflow/tags","blobs_url":"https://api.github.com/repos/dataArtisans/flink-dataflow/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/dataArtisans/flink-dataflow/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/dataArtisans/flink-dataflow/git/refs{/sha}","trees_url":"https://api.github.com/repos/dataArtisans/flink-dataflow/git/trees{/sha}","statuses_url":"https://api.github.com/repos/dataArtisans/flink-dataflow/statuses/{sha}","languages_url":"https://api.github.com/repos/dataArtisans/flink-dataflow/languages","stargazers_url":"https://api.github.com/repos/dataArtisans/flink-dataflow/stargazers","contributors_url":"https://api.github.com/repos/dataArtisans/flink-dataflow/contributors","subscribers_url":"https://api.github.com/repos/dataArtisans/flink-dataflow/subscribers","subscription_url":"https://api.github.com/repos/dataArtisans/flink-dataflow/subscription","commits_url":"https://api.github.com/repos/dataArtisans/flink-dataflow/commits{/sha}","git_commits_url":"https://api.github.com/repos/dataArtisans/flink-dataflow/git/commits{/sha}","comments_url":"https://api.github.com/repos/dataArtisans/flink-dataflow/comments{/number}","issue_comment_url":"https://api.github.com/repos/dataArtisans/flink-dataflow/issues/comments{/number}","contents_url":"https://api.github.com/repos/dataArtisans/flink-dataflow/contents/{+path}","compare_url":"https://api.github.com/repos/dataArtisans/flink-dataflow/compare/{base}...{head}","merges_url":"https://api.github.com/repos/dataArtisans/flink-dataflow/merges","archive_url":"https://api.github.com/repos/dataArtisans/flink-dataflow/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/dataArtisans/flink-dataflow/downloads","issues_url":"https://api.github.com/repos/dataArtisans/flink-dataflow/issues{/number}","pulls_url":"https://api.github.com/repos/dataArtisans/flink-dataflow/pulls{/number}","milestones_url":"https://api.github.com/repos/dataArtisans/flink-dataflow/milestones{/number}","notifications_url":"https://api.github.com/repos/dataArtisans/flink-dataflow/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/dataArtisans/flink-dataflow/labels{/name}","releases_url":"https://api.github.com/repos/dataArtisans/flink-dataflow/releases{/id}","created_at":"2015-02-19T10:07:35Z","updated_at":"2016-01-18T17:54:01Z","pushed_at":"2016-01-19T13:35:48Z","git_url":"git://github.com/dataArtisans/flink-dataflow.git","ssh_url":"git@github.com:dataArtisans/flink-dataflow.git","clone_url":"https://github.com/dataArtisans/flink-dataflow.git","svn_url":"https://github.com/dataArtisans/flink-dataflow","homepage":null,"size":396,"stargazers_count":21,"watchers_count":21,"language":"Java","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":8,"mirror_url":null,"open_issues_count":2,"forks":8,"open_issues":2,"watchers":21,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/dataArtisans/flink-dataflow/pulls/5"},"html":{"href":"https://github.com/dataArtisans/flink-dataflow/pull/5"},"issue":{"href":"https://api.github.com/repos/dataArtisans/flink-dataflow/issues/5"},"comments":{"href":"https://api.github.com/repos/dataArtisans/flink-dataflow/issues/5/comments"},"review_comments":{"href":"https://api.github.com/repos/dataArtisans/flink-dataflow/pulls/5/comments"},"review_comment":{"href":"https://api.github.com/repos/dataArtisans/flink-dataflow/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/dataArtisans/flink-dataflow/pulls/5/commits"},"statuses":{"href":"https://api.github.com/repos/dataArtisans/flink-dataflow/statuses/f4d3413cecb9aff34dad5c1a3bac4f3ecb8b7b41"}}}}