{"action":"created","comment":{"url":"https://api.github.com/repos/datastax/spark-cassandra-connector/pulls/comments/25729318","id":25729318,"diff_hunk":"@@ -0,0 +1,131 @@\n+package com.datastax.spark.connector.sql\n+\n+import com.datastax.spark.connector.cql.CassandraConnector\n+import com.datastax.spark.connector.embedded.SparkTemplate\n+import com.datastax.spark.connector.testkit.SharedEmbeddedCassandra\n+import org.apache.spark.sql.cassandra.CassandraSQLContext\n+import org.scalatest.{Matchers, FlatSpec}\n+\n+class CassandraSQLPredicatePushdownSpec extends FlatSpec with Matchers with SharedEmbeddedCassandra with SparkTemplate {\n+  useCassandraConfig(\"cassandra-default.yaml.template\")\n+  val conn = CassandraConnector(Set(cassandraHost))\n+  val cc = new CassandraSQLContext(sc)\n+  cc.setKeyspace(\"sql_test\")\n+\n+  conn.withSessionDo { session =>\n+    session.execute(\"CREATE KEYSPACE IF NOT EXISTS sql_test WITH REPLICATION = { 'class': 'SimpleStrategy', 'replication_factor': 1 }\")\n+\n+    session.execute(\"CREATE TABLE IF NOT EXISTS sql_test.test_pd (a INT, b INT, c INT, d INT, e INT, f INT, g INT, h INT, i INT, j INT, k INT, l INT, PRIMARY KEY ((a, b, c, d), e, f, g, h))\")\n+    session.execute(\"USE sql_test\")\n+    session.execute(\"CREATE INDEX test_pd_i ON test_pd(i)\")\n+    session.execute(\"CREATE INDEX test_pd_j ON test_pd(j)\")\n+    session.execute(\"INSERT INTO sql_test.test_pd (a, b, c, d, e, f, g, h, i, j, k, l) VALUES (1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)\")\n+    session.execute(\"INSERT INTO sql_test.test_pd (a, b, c, d, e, f, g, h, i, j, k, l) VALUES (1, 1, 1, 1, 1, 2, 3, 4, 5, 6, 7, 8)\")\n+    session.execute(\"INSERT INTO sql_test.test_pd (a, b, c, d, e, f, g, h, i, j, k, l) VALUES (1, 1, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9)\")\n+    session.execute(\"INSERT INTO sql_test.test_pd (a, b, c, d, e, f, g, h, i, j, k, l) VALUES (1, 1, 1, 1, 3, 4, 5, 6, 7, 8, 9, 10)\")\n+    session.execute(\"INSERT INTO sql_test.test_pd (a, b, c, d, e, f, g, h, i, j, k, l) VALUES (1, 1, 1, 1, 5, 6, 7, 8, 9, 10, 11, 12)\")\n+\n+    session.execute(\"INSERT INTO sql_test.test_pd (a, b, c, d, e, f, g, h, i, j, k, l) VALUES (1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)\")\n+    session.execute(\"INSERT INTO sql_test.test_pd (a, b, c, d, e, f, g, h, i, j, k, l) VALUES (1, 2, 1, 1, 1, 2, 3, 4, 5, 6, 7, 8)\")\n+    session.execute(\"INSERT INTO sql_test.test_pd (a, b, c, d, e, f, g, h, i, j, k, l) VALUES (1, 3, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9)\")\n+    session.execute(\"INSERT INTO sql_test.test_pd (a, b, c, d, e, f, g, h, i, j, k, l) VALUES (1, 4, 1, 1, 3, 4, 5, 6, 7, 8, 9, 10)\")\n+    session.execute(\"INSERT INTO sql_test.test_pd (a, b, c, d, e, f, g, h, i, j, k, l) VALUES (1, 5, 1, 1, 5, 6, 7, 8, 9, 10, 11, 12)\")\n+\n+    session.execute(\"INSERT INTO sql_test.test_pd (a, b, c, d, e, f, g, h, i, j, k, l) VALUES (1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)\")\n+    session.execute(\"INSERT INTO sql_test.test_pd (a, b, c, d, e, f, g, h, i, j, k, l) VALUES (1, 2, 2, 1, 1, 2, 3, 4, 5, 6, 7, 8)\")\n+    session.execute(\"INSERT INTO sql_test.test_pd (a, b, c, d, e, f, g, h, i, j, k, l) VALUES (1, 3, 3, 1, 2, 3, 4, 5, 6, 7, 8, 9)\")\n+    session.execute(\"INSERT INTO sql_test.test_pd (a, b, c, d, e, f, g, h, i, j, k, l) VALUES (1, 4, 4, 1, 3, 4, 5, 6, 7, 8, 9, 10)\")\n+    session.execute(\"INSERT INTO sql_test.test_pd (a, b, c, d, e, f, g, h, i, j, k, l) VALUES (1, 5, 5, 1, 5, 6, 7, 8, 9, 10, 11, 12)\")\n+  }\n+\n+  it should \"not allow predicate pushdown if some partition column doesn't have predicate\" in {\n+    val result = cc.sql(\"select * from test_pd where a=1 and b=1 and c=1\").collect()\n+  }\n+\n+  it should \"allow predicate pushdown if all partition columns have EQ predicate.  a=1 and b=1 and c=1 and d =1 are pushed down\" in {\n+    val result = cc.sql(\"select * from test_pd where a=1 and b=1 and c=1 and d=1\").collect()\n+    result should have length 5\n+  }\n+\n+  it should \"allow predicate pushdown if all partition columns have EQ predicate except for last partition column has IN predicates.\" +\n+    \" a=1 and b=1 and c=1 and d in (1, 2, 3, 4) are pushed down\" in {\n+    val result = cc.sql(\"select * from test_pd where a=1 and b=1 and c=1 and d in (1, 2, 3, 4)\").collect()\n+    result should have length 5\n+  }\n+\n+  it should \"allow predicate pushdown if partition column predicates can be pushed down and last cluster column has EQ predicate.\" +\n+    \" a=1 and b=1 and c=1 and d in (1, 2, 3, 4) and e=1 are pushed down\" in {\n+    val result = cc.sql(\"select * from test_pd where a=1 and b=1 and c=1 and d in (1, 2, 3, 4) and e=1\").collect()\n+    result should have length 2\n+  }\n+\n+  it should \"allow predicate pushdown if partition column predicates can be pushed down and last cluster column has range predicate.\" +\n+    \" a=1 and b=1 and c=1 and d in (1, 2, 3, 4) and e=1 and f>1 are pushed down\" in {\n+    val result = cc.sql(\"select * from test_pd where a=1 and b=1 and c=1 and d in (1, 2, 3, 4) and e=1 and f>1\").collect()\n+    result should have length 1\n+  }\n+\n+  it should \"not allow predicate pushdown if partition column predicates can be pushed down and none-last cluster column has IN predicate.\" +\n+    \" a=1 and b=1 and c=1 and d=3 and e=1 are pushed down\" in {\n+    val result = cc.sql(\"select * from test_pd where a=1 and b=1 and c=1 and d=3 and e=1 and f in (1, 2, 3)\").collect()\n+  }\n+\n+  it should \"allow predicate pushdown if there is only cluster column predicates.\" +\n+    \" e=1 and f=3 are pushed down\" in {\n+    val result = cc.sql(\"select * from test_pd where e=1 and f=3\").collect()\n+  }\n+\n+  it should \"not allow predicate pushdown if previous cluster column has None-EQ predicate.\" +\n+    \" a=1 and b=1 and c=1 and d=3 and e=1 and f>2 are pushed down\" in {\n+    val result = cc.sql(\"select * from test_pd where a=1 and b=1 and c=1 and d =3 and e=1 and f>2 and g=3\").collect()\n+  }\n+\n+  it should \"not allow predicate pushdown if previous cluster column has None-EQ predicate.\" +\n+    \" a=1 and b=1 and c=1 and d=3 and e>1 are pushed down\" in {\n+    val result = cc.sql(\"select * from test_pd where a=1 and b=1 and c=1 and d =3 and e>1 and f>2 and g=3\").collect()\n+  }\n+\n+  it should \"allow predicate pushdown if partition column predicates can be pushed down and only last cluster column has IN predicate.\" +\n+    \" a=1 and b=1 and c=1 and d=3 and e=1 and f=1 and g=2 and h in (1, 2, 3) are pushed down\" in {\n+    val result = cc.sql(\"select * from test_pd where a=1 and b=1 and c=1 and d=3 and e=1 and f=1 and g=2 and h in (1, 2, 3)\").collect()\n+  }\n+\n+  it should \"not allow predicate pushdown if previous cluster column has None-EQ predicate.\" +\n+    \" a=1 and b=1 and c=1 and d=3 and e=1 and  f>1 are pushed down\" in {\n+    val result = cc.sql(\"select * from test_pd where a=1 and b=1 and c=1 and d=3 and e=1 and f>1 and h in (1, 2, 3)\").collect()\n+  }\n+\n+  it should \"allow predicate pushdown if there is EQ indexed column predicate. restriction on partition columns and cluster columns \" +\n+    \" can be loosed up. f=5 and i=4 are pushed down\" in {\n+    val result = cc.sql(\"select * from test_pd where f=5 and i=4\").collect()\n+  }\n+\n+  it should \"not allow to push down cluster column IN predicate if there is EQ indexed column predicate. \" +\n+    \" i=4 are pushed down\" in {\n+    val result = cc.sql(\"select * from test_pd where c=3 and g in (1,2,3) and i=4\").collect()\n+  }\n+\n+  it should \"not allow to push down partition column IN predicate if there is EQ indexed column predicate. \" +\n+    \" i=4 are pushed down\" in {\n+    val result = cc.sql(\"select * from test_pd where c=3 and d in (1,2,3) and i=4\").collect()\n+  }\n+\n+  it should \"not allow to push down indexed column predicates if all indexed column predicates are none-EQ predicates. \" in {\n+    val result = cc.sql(\"select * from test_pd where c=3 and i>4\").collect()\n+  }\n+\n+  it should \"allow predicate pushdown if there is EQ indexed column predicates. \" +\n+    \" i=4 and j>5 are pushed down\" in {\n+    val result = cc.sql(\"select * from test_pd where c=3 and i=4 and j>5\").collect()\n+  }\n+\n+  it should \"not allow to push down none-primary column IN predicate. \" +\n+    \" e=3 is pushed down\" in {\n+    val result = cc.sql(\"select * from test_pd where e=3 and j in (1,2,3)\").collect()\n+  }\n+\n+  it should \"not allow to push down none-primary column predicates if there are no indexed column predicates. \" +\n+    \" a=1 and b=1 and c=1 and d=3 are pushed down\" in {\n+    val result = cc.sql(\"select * from test_pd where a=1 and b=1 and c=1 and d=3 and k=4\").collect()","path":"spark-cassandra-connector/src/it/scala/com/datastax/spark/connector/sql/CassandraSQLPredicatePushdownSpec.scala","position":129,"original_position":129,"commit_id":"8a4fa55bdc08df036455c77aee0f436d88b7400c","original_commit_id":"8a4fa55bdc08df036455c77aee0f436d88b7400c","user":{"login":"jacek-lewandowski","id":6516951,"avatar_url":"https://avatars.githubusercontent.com/u/6516951?v=3","gravatar_id":"","url":"https://api.github.com/users/jacek-lewandowski","html_url":"https://github.com/jacek-lewandowski","followers_url":"https://api.github.com/users/jacek-lewandowski/followers","following_url":"https://api.github.com/users/jacek-lewandowski/following{/other_user}","gists_url":"https://api.github.com/users/jacek-lewandowski/gists{/gist_id}","starred_url":"https://api.github.com/users/jacek-lewandowski/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jacek-lewandowski/subscriptions","organizations_url":"https://api.github.com/users/jacek-lewandowski/orgs","repos_url":"https://api.github.com/users/jacek-lewandowski/repos","events_url":"https://api.github.com/users/jacek-lewandowski/events{/privacy}","received_events_url":"https://api.github.com/users/jacek-lewandowski/received_events","type":"User","site_admin":false},"body":"I know this would be a pain but... would you test the results for the correct content?","created_at":"2015-03-03T21:39:24Z","updated_at":"2015-03-03T21:39:24Z","html_url":"https://github.com/datastax/spark-cassandra-connector/pull/567#discussion_r25729318","pull_request_url":"https://api.github.com/repos/datastax/spark-cassandra-connector/pulls/567","_links":{"self":{"href":"https://api.github.com/repos/datastax/spark-cassandra-connector/pulls/comments/25729318"},"html":{"href":"https://github.com/datastax/spark-cassandra-connector/pull/567#discussion_r25729318"},"pull_request":{"href":"https://api.github.com/repos/datastax/spark-cassandra-connector/pulls/567"}}},"pull_request":{"url":"https://api.github.com/repos/datastax/spark-cassandra-connector/pulls/567","id":30214282,"html_url":"https://github.com/datastax/spark-cassandra-connector/pull/567","diff_url":"https://github.com/datastax/spark-cassandra-connector/pull/567.diff","patch_url":"https://github.com/datastax/spark-cassandra-connector/pull/567.patch","issue_url":"https://api.github.com/repos/datastax/spark-cassandra-connector/issues/567","number":567,"state":"open","locked":false,"title":"SPARKC-72 more spark sql predicate pushdown and tests","user":{"login":"alexliu68","id":1668804,"avatar_url":"https://avatars.githubusercontent.com/u/1668804?v=3","gravatar_id":"","url":"https://api.github.com/users/alexliu68","html_url":"https://github.com/alexliu68","followers_url":"https://api.github.com/users/alexliu68/followers","following_url":"https://api.github.com/users/alexliu68/following{/other_user}","gists_url":"https://api.github.com/users/alexliu68/gists{/gist_id}","starred_url":"https://api.github.com/users/alexliu68/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/alexliu68/subscriptions","organizations_url":"https://api.github.com/users/alexliu68/orgs","repos_url":"https://api.github.com/users/alexliu68/repos","events_url":"https://api.github.com/users/alexliu68/events{/privacy}","received_events_url":"https://api.github.com/users/alexliu68/received_events","type":"User","site_admin":false},"body":"","created_at":"2015-02-28T01:01:14Z","updated_at":"2015-03-03T21:39:24Z","closed_at":null,"merged_at":null,"merge_commit_sha":"9f508ae2a88a55477b5109ca4e85bddadcc127ee","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/datastax/spark-cassandra-connector/pulls/567/commits","review_comments_url":"https://api.github.com/repos/datastax/spark-cassandra-connector/pulls/567/comments","review_comment_url":"https://api.github.com/repos/datastax/spark-cassandra-connector/pulls/comments{/number}","comments_url":"https://api.github.com/repos/datastax/spark-cassandra-connector/issues/567/comments","statuses_url":"https://api.github.com/repos/datastax/spark-cassandra-connector/statuses/8a4fa55bdc08df036455c77aee0f436d88b7400c","head":{"label":"datastax:sparkc-72","ref":"sparkc-72","sha":"8a4fa55bdc08df036455c77aee0f436d88b7400c","user":{"login":"datastax","id":573369,"avatar_url":"https://avatars.githubusercontent.com/u/573369?v=3","gravatar_id":"","url":"https://api.github.com/users/datastax","html_url":"https://github.com/datastax","followers_url":"https://api.github.com/users/datastax/followers","following_url":"https://api.github.com/users/datastax/following{/other_user}","gists_url":"https://api.github.com/users/datastax/gists{/gist_id}","starred_url":"https://api.github.com/users/datastax/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/datastax/subscriptions","organizations_url":"https://api.github.com/users/datastax/orgs","repos_url":"https://api.github.com/users/datastax/repos","events_url":"https://api.github.com/users/datastax/events{/privacy}","received_events_url":"https://api.github.com/users/datastax/received_events","type":"Organization","site_admin":false},"repo":{"id":21280887,"name":"spark-cassandra-connector","full_name":"datastax/spark-cassandra-connector","owner":{"login":"datastax","id":573369,"avatar_url":"https://avatars.githubusercontent.com/u/573369?v=3","gravatar_id":"","url":"https://api.github.com/users/datastax","html_url":"https://github.com/datastax","followers_url":"https://api.github.com/users/datastax/followers","following_url":"https://api.github.com/users/datastax/following{/other_user}","gists_url":"https://api.github.com/users/datastax/gists{/gist_id}","starred_url":"https://api.github.com/users/datastax/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/datastax/subscriptions","organizations_url":"https://api.github.com/users/datastax/orgs","repos_url":"https://api.github.com/users/datastax/repos","events_url":"https://api.github.com/users/datastax/events{/privacy}","received_events_url":"https://api.github.com/users/datastax/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/datastax/spark-cassandra-connector","description":"If you write a Spark application that needs access to Cassandra, this library is for you","fork":false,"url":"https://api.github.com/repos/datastax/spark-cassandra-connector","forks_url":"https://api.github.com/repos/datastax/spark-cassandra-connector/forks","keys_url":"https://api.github.com/repos/datastax/spark-cassandra-connector/keys{/key_id}","collaborators_url":"https://api.github.com/repos/datastax/spark-cassandra-connector/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/datastax/spark-cassandra-connector/teams","hooks_url":"https://api.github.com/repos/datastax/spark-cassandra-connector/hooks","issue_events_url":"https://api.github.com/repos/datastax/spark-cassandra-connector/issues/events{/number}","events_url":"https://api.github.com/repos/datastax/spark-cassandra-connector/events","assignees_url":"https://api.github.com/repos/datastax/spark-cassandra-connector/assignees{/user}","branches_url":"https://api.github.com/repos/datastax/spark-cassandra-connector/branches{/branch}","tags_url":"https://api.github.com/repos/datastax/spark-cassandra-connector/tags","blobs_url":"https://api.github.com/repos/datastax/spark-cassandra-connector/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/datastax/spark-cassandra-connector/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/datastax/spark-cassandra-connector/git/refs{/sha}","trees_url":"https://api.github.com/repos/datastax/spark-cassandra-connector/git/trees{/sha}","statuses_url":"https://api.github.com/repos/datastax/spark-cassandra-connector/statuses/{sha}","languages_url":"https://api.github.com/repos/datastax/spark-cassandra-connector/languages","stargazers_url":"https://api.github.com/repos/datastax/spark-cassandra-connector/stargazers","contributors_url":"https://api.github.com/repos/datastax/spark-cassandra-connector/contributors","subscribers_url":"https://api.github.com/repos/datastax/spark-cassandra-connector/subscribers","subscription_url":"https://api.github.com/repos/datastax/spark-cassandra-connector/subscription","commits_url":"https://api.github.com/repos/datastax/spark-cassandra-connector/commits{/sha}","git_commits_url":"https://api.github.com/repos/datastax/spark-cassandra-connector/git/commits{/sha}","comments_url":"https://api.github.com/repos/datastax/spark-cassandra-connector/comments{/number}","issue_comment_url":"https://api.github.com/repos/datastax/spark-cassandra-connector/issues/comments{/number}","contents_url":"https://api.github.com/repos/datastax/spark-cassandra-connector/contents/{+path}","compare_url":"https://api.github.com/repos/datastax/spark-cassandra-connector/compare/{base}...{head}","merges_url":"https://api.github.com/repos/datastax/spark-cassandra-connector/merges","archive_url":"https://api.github.com/repos/datastax/spark-cassandra-connector/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/datastax/spark-cassandra-connector/downloads","issues_url":"https://api.github.com/repos/datastax/spark-cassandra-connector/issues{/number}","pulls_url":"https://api.github.com/repos/datastax/spark-cassandra-connector/pulls{/number}","milestones_url":"https://api.github.com/repos/datastax/spark-cassandra-connector/milestones{/number}","notifications_url":"https://api.github.com/repos/datastax/spark-cassandra-connector/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/datastax/spark-cassandra-connector/labels{/name}","releases_url":"https://api.github.com/repos/datastax/spark-cassandra-connector/releases{/id}","created_at":"2014-06-27T15:45:54Z","updated_at":"2015-03-03T21:37:56Z","pushed_at":"2015-03-03T21:31:03Z","git_url":"git://github.com/datastax/spark-cassandra-connector.git","ssh_url":"git@github.com:datastax/spark-cassandra-connector.git","clone_url":"https://github.com/datastax/spark-cassandra-connector.git","svn_url":"https://github.com/datastax/spark-cassandra-connector","homepage":"","size":6866,"stargazers_count":419,"watchers_count":419,"language":"Scala","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":115,"mirror_url":null,"open_issues_count":13,"forks":115,"open_issues":13,"watchers":419,"default_branch":"master"}},"base":{"label":"datastax:master","ref":"master","sha":"254a5533f3cd38c0c58b4c09804083a474a68bfb","user":{"login":"datastax","id":573369,"avatar_url":"https://avatars.githubusercontent.com/u/573369?v=3","gravatar_id":"","url":"https://api.github.com/users/datastax","html_url":"https://github.com/datastax","followers_url":"https://api.github.com/users/datastax/followers","following_url":"https://api.github.com/users/datastax/following{/other_user}","gists_url":"https://api.github.com/users/datastax/gists{/gist_id}","starred_url":"https://api.github.com/users/datastax/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/datastax/subscriptions","organizations_url":"https://api.github.com/users/datastax/orgs","repos_url":"https://api.github.com/users/datastax/repos","events_url":"https://api.github.com/users/datastax/events{/privacy}","received_events_url":"https://api.github.com/users/datastax/received_events","type":"Organization","site_admin":false},"repo":{"id":21280887,"name":"spark-cassandra-connector","full_name":"datastax/spark-cassandra-connector","owner":{"login":"datastax","id":573369,"avatar_url":"https://avatars.githubusercontent.com/u/573369?v=3","gravatar_id":"","url":"https://api.github.com/users/datastax","html_url":"https://github.com/datastax","followers_url":"https://api.github.com/users/datastax/followers","following_url":"https://api.github.com/users/datastax/following{/other_user}","gists_url":"https://api.github.com/users/datastax/gists{/gist_id}","starred_url":"https://api.github.com/users/datastax/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/datastax/subscriptions","organizations_url":"https://api.github.com/users/datastax/orgs","repos_url":"https://api.github.com/users/datastax/repos","events_url":"https://api.github.com/users/datastax/events{/privacy}","received_events_url":"https://api.github.com/users/datastax/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/datastax/spark-cassandra-connector","description":"If you write a Spark application that needs access to Cassandra, this library is for you","fork":false,"url":"https://api.github.com/repos/datastax/spark-cassandra-connector","forks_url":"https://api.github.com/repos/datastax/spark-cassandra-connector/forks","keys_url":"https://api.github.com/repos/datastax/spark-cassandra-connector/keys{/key_id}","collaborators_url":"https://api.github.com/repos/datastax/spark-cassandra-connector/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/datastax/spark-cassandra-connector/teams","hooks_url":"https://api.github.com/repos/datastax/spark-cassandra-connector/hooks","issue_events_url":"https://api.github.com/repos/datastax/spark-cassandra-connector/issues/events{/number}","events_url":"https://api.github.com/repos/datastax/spark-cassandra-connector/events","assignees_url":"https://api.github.com/repos/datastax/spark-cassandra-connector/assignees{/user}","branches_url":"https://api.github.com/repos/datastax/spark-cassandra-connector/branches{/branch}","tags_url":"https://api.github.com/repos/datastax/spark-cassandra-connector/tags","blobs_url":"https://api.github.com/repos/datastax/spark-cassandra-connector/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/datastax/spark-cassandra-connector/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/datastax/spark-cassandra-connector/git/refs{/sha}","trees_url":"https://api.github.com/repos/datastax/spark-cassandra-connector/git/trees{/sha}","statuses_url":"https://api.github.com/repos/datastax/spark-cassandra-connector/statuses/{sha}","languages_url":"https://api.github.com/repos/datastax/spark-cassandra-connector/languages","stargazers_url":"https://api.github.com/repos/datastax/spark-cassandra-connector/stargazers","contributors_url":"https://api.github.com/repos/datastax/spark-cassandra-connector/contributors","subscribers_url":"https://api.github.com/repos/datastax/spark-cassandra-connector/subscribers","subscription_url":"https://api.github.com/repos/datastax/spark-cassandra-connector/subscription","commits_url":"https://api.github.com/repos/datastax/spark-cassandra-connector/commits{/sha}","git_commits_url":"https://api.github.com/repos/datastax/spark-cassandra-connector/git/commits{/sha}","comments_url":"https://api.github.com/repos/datastax/spark-cassandra-connector/comments{/number}","issue_comment_url":"https://api.github.com/repos/datastax/spark-cassandra-connector/issues/comments{/number}","contents_url":"https://api.github.com/repos/datastax/spark-cassandra-connector/contents/{+path}","compare_url":"https://api.github.com/repos/datastax/spark-cassandra-connector/compare/{base}...{head}","merges_url":"https://api.github.com/repos/datastax/spark-cassandra-connector/merges","archive_url":"https://api.github.com/repos/datastax/spark-cassandra-connector/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/datastax/spark-cassandra-connector/downloads","issues_url":"https://api.github.com/repos/datastax/spark-cassandra-connector/issues{/number}","pulls_url":"https://api.github.com/repos/datastax/spark-cassandra-connector/pulls{/number}","milestones_url":"https://api.github.com/repos/datastax/spark-cassandra-connector/milestones{/number}","notifications_url":"https://api.github.com/repos/datastax/spark-cassandra-connector/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/datastax/spark-cassandra-connector/labels{/name}","releases_url":"https://api.github.com/repos/datastax/spark-cassandra-connector/releases{/id}","created_at":"2014-06-27T15:45:54Z","updated_at":"2015-03-03T21:37:56Z","pushed_at":"2015-03-03T21:31:03Z","git_url":"git://github.com/datastax/spark-cassandra-connector.git","ssh_url":"git@github.com:datastax/spark-cassandra-connector.git","clone_url":"https://github.com/datastax/spark-cassandra-connector.git","svn_url":"https://github.com/datastax/spark-cassandra-connector","homepage":"","size":6866,"stargazers_count":419,"watchers_count":419,"language":"Scala","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":115,"mirror_url":null,"open_issues_count":13,"forks":115,"open_issues":13,"watchers":419,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/datastax/spark-cassandra-connector/pulls/567"},"html":{"href":"https://github.com/datastax/spark-cassandra-connector/pull/567"},"issue":{"href":"https://api.github.com/repos/datastax/spark-cassandra-connector/issues/567"},"comments":{"href":"https://api.github.com/repos/datastax/spark-cassandra-connector/issues/567/comments"},"review_comments":{"href":"https://api.github.com/repos/datastax/spark-cassandra-connector/pulls/567/comments"},"review_comment":{"href":"https://api.github.com/repos/datastax/spark-cassandra-connector/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/datastax/spark-cassandra-connector/pulls/567/commits"},"statuses":{"href":"https://api.github.com/repos/datastax/spark-cassandra-connector/statuses/8a4fa55bdc08df036455c77aee0f436d88b7400c"}}}}