{"action":"created","comment":{"url":"https://api.github.com/repos/Stratio/Crossdata/pulls/comments/43372325","id":43372325,"diff_hunk":"@@ -0,0 +1,256 @@\n+/**\n+ * Copyright (C) 2015 Stratio (http://stratio.com)\n+ *\n+ * Licensed under the Apache License, Version 2.0 (the \"License\");\n+ * you may not use this file except in compliance with the License.\n+ * 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+package org.apache.spark.sql.crossdata.catalog\n+\n+import java.sql.{Connection, DriverManager, ResultSet}\n+\n+import org.apache.spark.Logging\n+import org.apache.spark.sql.catalyst.plans.logical.LogicalPlan\n+import org.apache.spark.sql.catalyst.{CatalystConf, SimpleCatalystConf, TableIdentifier}\n+import org.apache.spark.sql.crossdata.{XDCatalog, XDContext}\n+import org.apache.spark.sql.types._\n+import org.json4s.DefaultFormats\n+import org.json4s.jackson.Serialization.write\n+\n+import scala.annotation.tailrec\n+import scala.util.parsing.json.JSON\n+\n+\n+object DerbyCatalog {\n+  // CatalogFields\n+  val DatabaseField = \"db\"\n+  val TableNameField = \"tableName\"\n+  val SchemaField = \"tableSchema\"\n+  val ProviderField = \"provider\"\n+  val PartitionColumnField = \"partitionColumn\"\n+  val OptionsField = \"options\"\n+  val CrossdataVersionField = \"crossdataVersion\"\n+}\n+\n+/**\n+ * Default implementation of the [[org.apache.spark.sql.crossdata.XDCatalog]] with persistence using\n+ * Derby.\n+ * @param conf An implementation of the [[CatalystConf]].\n+ */\n+class DerbyCatalog(override val conf: CatalystConf = new SimpleCatalystConf(true), xdContext: XDContext)\n+  extends XDCatalog(conf, xdContext) with Logging {\n+\n+  import JDBCCatalog._\n+  import org.apache.spark.sql.crossdata._\n+\n+\n+  private val db = \"CROSSDATA\"\n+  private val table = \"crossdatatables\"\n+\n+  lazy val connection: Connection = {\n+\n+    val driver = \"org.apache.derby.jdbc.EmbeddedDriver\"\n+    val url = \"jdbc:derby:sampledb/crossdata;create=true\"\n+\n+    Class.forName(driver)\n+    val jdbcConnection = DriverManager.getConnection(url)\n+\n+    // CREATE PERSISTENT METADATA TABLE\n+\n+    if(!schemaExists(s\"$db\", jdbcConnection)) {\n+      jdbcConnection.createStatement().executeUpdate(s\"CREATE SCHEMA $db\")\n+\n+\n+      jdbcConnection.createStatement().executeUpdate(\n+        s\"\"\"|CREATE TABLE $db.$table (\n+           |$DatabaseField VARCHAR(50),\n+           |$TableNameField VARCHAR(50),\n+           |$SchemaField LONG VARCHAR,\n+           |$DatasourceField LONG VARCHAR,\n+           |$PartitionColumnField LONG VARCHAR,\n+           |$OptionsField LONG VARCHAR,\n+           |$CrossdataVersionField LONG VARCHAR,\n+           |PRIMARY KEY ($DatabaseField,$TableNameField))\"\"\".stripMargin)\n+    }\n+    jdbcConnection\n+  }\n+\n+\n+  override def lookupTable(tableName: String, databaseName: Option[String]): Option[CrossdataTable] = {\n+\n+    val preparedStatement = connection.prepareStatement(s\"SELECT * FROM $db.$table WHERE $DatabaseField= ? AND $TableNameField= ?\")\n+    preparedStatement.setString(1, databaseName.getOrElse(\"\"))\n+    preparedStatement.setString(2, tableName)\n+    val resultSet = preparedStatement.executeQuery()\n+\n+    if (!resultSet.next) {\n+      None\n+    } else {\n+\n+      val database = resultSet.getString(DatabaseField)\n+      val table = resultSet.getString(TableNameField)\n+      val schemaJSON = resultSet.getString(SchemaField)\n+      val partitionColumn = resultSet.getString(PartitionColumnField)\n+      val provider = resultSet.getString(DatasourceField)\n+      val optsJSON = resultSet.getString(OptionsField)\n+      val version = resultSet.getString(CrossdataVersionField)\n+\n+      Some(\n+        CrossdataTable(table, Some(database), getUserSpecifiedSchema(schemaJSON), provider, getPartitionColumn(partitionColumn), getOptions(optsJSON), version)\n+      )\n+    }\n+  }\n+\n+  override def listPersistedTables(databaseName: Option[String]): Seq[(String, Boolean)] = {\n+    @tailrec\n+    def getSequenceAux(resultset: ResultSet, next: Boolean, set: Set[String] = Set()): Set[String] = {\n+      if (next) {\n+        val database = resultset.getString(DatabaseField)\n+        val table = resultset.getString(TableNameField)\n+        val tableId = if (database.trim.isEmpty) table else s\"$database.$table\"\n+        getSequenceAux(resultset, resultset.next(), set + tableId)\n+      } else {\n+        set\n+      }\n+    }\n+\n+    val statement = connection.createStatement\n+    val dbFilter = databaseName.fold(\"\")(dbName => s\"WHERE $DatabaseField ='$dbName'\")\n+    val resultSet = statement.executeQuery(s\"SELECT $DatabaseField, $TableNameField FROM $db.$table $dbFilter\")\n+\n+    getSequenceAux(resultSet, resultSet.next).map(tableId => (tableId, true)).toSeq\n+  }\n+\n+  override def persistTableMetadata(crossdataTable: CrossdataTable, logicalRelation: Option[LogicalPlan]): Unit = {\n+\n+    val tableSchema = serializeSchema(crossdataTable.userSpecifiedSchema.getOrElse(new StructType()))\n+\n+    val tableOptions = serializeOptions(crossdataTable.opts)\n+    val partitionColumn = serializePartitionColumn(crossdataTable.partitionColumn)\n+\n+    connection.setAutoCommit(false)\n+\n+    // check if the database-table exist in the persisted catalog\n+    val preparedStatement = connection.prepareStatement(s\"SELECT * FROM $db.$table WHERE $DatabaseField= ? AND $TableNameField= ?\")\n+    preparedStatement.setString(1, crossdataTable.dbName.getOrElse(\"\"))\n+    preparedStatement.setString(2, crossdataTable.tableName)\n+    val resultSet = preparedStatement.executeQuery()\n+\n+    if (!resultSet.next()) {\n+      val prepped = connection.prepareStatement(\n+        s\"\"\"|INSERT INTO $db.$table (\n+           | $DatabaseField, $TableNameField, $SchemaField, $DatasourceField, $PartitionColumnField, $OptionsField, $CrossdataVersionField\n+           |) VALUES (?,?,?,?,?,?,?)\n+       \"\"\".stripMargin)\n+      prepped.setString(1, crossdataTable.dbName.getOrElse(\"\"))\n+      prepped.setString(2, crossdataTable.tableName)\n+      prepped.setString(3, tableSchema)\n+      prepped.setString(4, crossdataTable.datasource)\n+      prepped.setString(5, partitionColumn)\n+      prepped.setString(6, tableOptions)\n+      prepped.setString(7, CrossdataVersion)\n+      prepped.execute()\n+    }\n+    else {\n+     val prepped = connection.prepareStatement(s\"\"\"|UPDATE $db.$table SET $SchemaField=?, $DatasourceField=?,$PartitionColumnField=?,$OptionsField=?,$CrossdataVersionField=?\n+          |WHERE $DatabaseField='${crossdataTable.dbName.getOrElse(\"\")}' AND $TableNameField='${crossdataTable.tableName}'\n+       \"\"\".stripMargin)\n+      prepped.setString(1, tableSchema)\n+      prepped.setString(2, crossdataTable.datasource)\n+      prepped.setString(3, partitionColumn)\n+      prepped.setString(4, tableOptions)\n+      prepped.setString(5, CrossdataVersion)\n+      prepped.execute()\n+    }\n+    connection.commit()\n+    connection.setAutoCommit(true)\n+\n+    val tableIdentifier = TableIdentifier(crossdataTable.tableName,crossdataTable.dbName).toSeq\n+    //Try to register the table.\n+    registerTable(tableIdentifier, logicalRelation.getOrElse(lookupRelation(tableIdentifier))\n+    )\n+  }\n+\n+  override def dropPersistedTable(tableName: String, databaseName: Option[String]): Unit = {\n+    connection.createStatement.executeUpdate(s\"DELETE FROM $db.$table WHERE tableName='$tableName' AND db='${databaseName.getOrElse(\"\")}'\")\n+  }\n+\n+  override def dropAllPersistedTables(): Unit = {\n+    connection.createStatement.executeUpdate(s\"DELETE FROM $db.$table\")\n+  }\n+\n+\n+  private def getUserSpecifiedSchema(schemaJSON: String): Option[StructType] = {","path":"core/src/main/scala/org/apache/spark/sql/crossdata/catalog/DerbyCatalog.scala","position":191,"original_position":191,"commit_id":"1b55f791f0478b41fe23af2244fab1ab04d55bed","original_commit_id":"1b55f791f0478b41fe23af2244fab1ab04d55bed","user":{"login":"darroyocazorla","id":8123986,"avatar_url":"https://avatars.githubusercontent.com/u/8123986?v=3","gravatar_id":"","url":"https://api.github.com/users/darroyocazorla","html_url":"https://github.com/darroyocazorla","followers_url":"https://api.github.com/users/darroyocazorla/followers","following_url":"https://api.github.com/users/darroyocazorla/following{/other_user}","gists_url":"https://api.github.com/users/darroyocazorla/gists{/gist_id}","starred_url":"https://api.github.com/users/darroyocazorla/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/darroyocazorla/subscriptions","organizations_url":"https://api.github.com/users/darroyocazorla/orgs","repos_url":"https://api.github.com/users/darroyocazorla/repos","events_url":"https://api.github.com/users/darroyocazorla/events{/privacy}","received_events_url":"https://api.github.com/users/darroyocazorla/received_events","type":"User","site_admin":false},"body":"Maybe, the utility methods could be added to JDBCUtils or CatalogUtils","created_at":"2015-10-29T11:06:58Z","updated_at":"2015-10-29T11:06:58Z","html_url":"https://github.com/Stratio/Crossdata/pull/164#discussion_r43372325","pull_request_url":"https://api.github.com/repos/Stratio/Crossdata/pulls/164","_links":{"self":{"href":"https://api.github.com/repos/Stratio/Crossdata/pulls/comments/43372325"},"html":{"href":"https://github.com/Stratio/Crossdata/pull/164#discussion_r43372325"},"pull_request":{"href":"https://api.github.com/repos/Stratio/Crossdata/pulls/164"}}},"pull_request":{"url":"https://api.github.com/repos/Stratio/Crossdata/pulls/164","id":49118947,"html_url":"https://github.com/Stratio/Crossdata/pull/164","diff_url":"https://github.com/Stratio/Crossdata/pull/164.diff","patch_url":"https://github.com/Stratio/Crossdata/pull/164.patch","issue_url":"https://api.github.com/repos/Stratio/Crossdata/issues/164","number":164,"state":"open","locked":false,"title":"[CROSSDATA-41][Catalog] Added derby support as default catalog","user":{"login":"ccaballe","id":2929015,"avatar_url":"https://avatars.githubusercontent.com/u/2929015?v=3","gravatar_id":"","url":"https://api.github.com/users/ccaballe","html_url":"https://github.com/ccaballe","followers_url":"https://api.github.com/users/ccaballe/followers","following_url":"https://api.github.com/users/ccaballe/following{/other_user}","gists_url":"https://api.github.com/users/ccaballe/gists{/gist_id}","starred_url":"https://api.github.com/users/ccaballe/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ccaballe/subscriptions","organizations_url":"https://api.github.com/users/ccaballe/orgs","repos_url":"https://api.github.com/users/ccaballe/repos","events_url":"https://api.github.com/users/ccaballe/events{/privacy}","received_events_url":"https://api.github.com/users/ccaballe/received_events","type":"User","site_admin":false},"body":"","created_at":"2015-10-29T10:06:02Z","updated_at":"2015-10-29T11:06:58Z","closed_at":null,"merged_at":null,"merge_commit_sha":"7971f5b507b6d2b413ef84a644a88d50e6a8d043","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/Stratio/Crossdata/pulls/164/commits","review_comments_url":"https://api.github.com/repos/Stratio/Crossdata/pulls/164/comments","review_comment_url":"https://api.github.com/repos/Stratio/Crossdata/pulls/comments{/number}","comments_url":"https://api.github.com/repos/Stratio/Crossdata/issues/164/comments","statuses_url":"https://api.github.com/repos/Stratio/Crossdata/statuses/1b55f791f0478b41fe23af2244fab1ab04d55bed","head":{"label":"ccaballe:issue/CROSSDATA-41_Default_Catalog","ref":"issue/CROSSDATA-41_Default_Catalog","sha":"1b55f791f0478b41fe23af2244fab1ab04d55bed","user":{"login":"ccaballe","id":2929015,"avatar_url":"https://avatars.githubusercontent.com/u/2929015?v=3","gravatar_id":"","url":"https://api.github.com/users/ccaballe","html_url":"https://github.com/ccaballe","followers_url":"https://api.github.com/users/ccaballe/followers","following_url":"https://api.github.com/users/ccaballe/following{/other_user}","gists_url":"https://api.github.com/users/ccaballe/gists{/gist_id}","starred_url":"https://api.github.com/users/ccaballe/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ccaballe/subscriptions","organizations_url":"https://api.github.com/users/ccaballe/orgs","repos_url":"https://api.github.com/users/ccaballe/repos","events_url":"https://api.github.com/users/ccaballe/events{/privacy}","received_events_url":"https://api.github.com/users/ccaballe/received_events","type":"User","site_admin":false},"repo":{"id":43314123,"name":"crossdata","full_name":"ccaballe/crossdata","owner":{"login":"ccaballe","id":2929015,"avatar_url":"https://avatars.githubusercontent.com/u/2929015?v=3","gravatar_id":"","url":"https://api.github.com/users/ccaballe","html_url":"https://github.com/ccaballe","followers_url":"https://api.github.com/users/ccaballe/followers","following_url":"https://api.github.com/users/ccaballe/following{/other_user}","gists_url":"https://api.github.com/users/ccaballe/gists{/gist_id}","starred_url":"https://api.github.com/users/ccaballe/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ccaballe/subscriptions","organizations_url":"https://api.github.com/users/ccaballe/orgs","repos_url":"https://api.github.com/users/ccaballe/repos","events_url":"https://api.github.com/users/ccaballe/events{/privacy}","received_events_url":"https://api.github.com/users/ccaballe/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/ccaballe/crossdata","description":"Easy access to big things","fork":true,"url":"https://api.github.com/repos/ccaballe/crossdata","forks_url":"https://api.github.com/repos/ccaballe/crossdata/forks","keys_url":"https://api.github.com/repos/ccaballe/crossdata/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ccaballe/crossdata/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ccaballe/crossdata/teams","hooks_url":"https://api.github.com/repos/ccaballe/crossdata/hooks","issue_events_url":"https://api.github.com/repos/ccaballe/crossdata/issues/events{/number}","events_url":"https://api.github.com/repos/ccaballe/crossdata/events","assignees_url":"https://api.github.com/repos/ccaballe/crossdata/assignees{/user}","branches_url":"https://api.github.com/repos/ccaballe/crossdata/branches{/branch}","tags_url":"https://api.github.com/repos/ccaballe/crossdata/tags","blobs_url":"https://api.github.com/repos/ccaballe/crossdata/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ccaballe/crossdata/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ccaballe/crossdata/git/refs{/sha}","trees_url":"https://api.github.com/repos/ccaballe/crossdata/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ccaballe/crossdata/statuses/{sha}","languages_url":"https://api.github.com/repos/ccaballe/crossdata/languages","stargazers_url":"https://api.github.com/repos/ccaballe/crossdata/stargazers","contributors_url":"https://api.github.com/repos/ccaballe/crossdata/contributors","subscribers_url":"https://api.github.com/repos/ccaballe/crossdata/subscribers","subscription_url":"https://api.github.com/repos/ccaballe/crossdata/subscription","commits_url":"https://api.github.com/repos/ccaballe/crossdata/commits{/sha}","git_commits_url":"https://api.github.com/repos/ccaballe/crossdata/git/commits{/sha}","comments_url":"https://api.github.com/repos/ccaballe/crossdata/comments{/number}","issue_comment_url":"https://api.github.com/repos/ccaballe/crossdata/issues/comments{/number}","contents_url":"https://api.github.com/repos/ccaballe/crossdata/contents/{+path}","compare_url":"https://api.github.com/repos/ccaballe/crossdata/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ccaballe/crossdata/merges","archive_url":"https://api.github.com/repos/ccaballe/crossdata/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ccaballe/crossdata/downloads","issues_url":"https://api.github.com/repos/ccaballe/crossdata/issues{/number}","pulls_url":"https://api.github.com/repos/ccaballe/crossdata/pulls{/number}","milestones_url":"https://api.github.com/repos/ccaballe/crossdata/milestones{/number}","notifications_url":"https://api.github.com/repos/ccaballe/crossdata/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ccaballe/crossdata/labels{/name}","releases_url":"https://api.github.com/repos/ccaballe/crossdata/releases{/id}","created_at":"2015-09-28T16:56:24Z","updated_at":"2015-09-28T16:56:28Z","pushed_at":"2015-10-29T10:05:19Z","git_url":"git://github.com/ccaballe/crossdata.git","ssh_url":"git@github.com:ccaballe/crossdata.git","clone_url":"https://github.com/ccaballe/crossdata.git","svn_url":"https://github.com/ccaballe/crossdata","homepage":"http://stratio.github.io/crossdata","size":13986,"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":"branch-0.4"}},"base":{"label":"Stratio:master","ref":"master","sha":"eed5feba0f4f242dfb3dd52f7e5b6142e0c80578","user":{"login":"Stratio","id":5228027,"avatar_url":"https://avatars.githubusercontent.com/u/5228027?v=3","gravatar_id":"","url":"https://api.github.com/users/Stratio","html_url":"https://github.com/Stratio","followers_url":"https://api.github.com/users/Stratio/followers","following_url":"https://api.github.com/users/Stratio/following{/other_user}","gists_url":"https://api.github.com/users/Stratio/gists{/gist_id}","starred_url":"https://api.github.com/users/Stratio/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Stratio/subscriptions","organizations_url":"https://api.github.com/users/Stratio/orgs","repos_url":"https://api.github.com/users/Stratio/repos","events_url":"https://api.github.com/users/Stratio/events{/privacy}","received_events_url":"https://api.github.com/users/Stratio/received_events","type":"Organization","site_admin":false},"repo":{"id":16574627,"name":"Crossdata","full_name":"Stratio/Crossdata","owner":{"login":"Stratio","id":5228027,"avatar_url":"https://avatars.githubusercontent.com/u/5228027?v=3","gravatar_id":"","url":"https://api.github.com/users/Stratio","html_url":"https://github.com/Stratio","followers_url":"https://api.github.com/users/Stratio/followers","following_url":"https://api.github.com/users/Stratio/following{/other_user}","gists_url":"https://api.github.com/users/Stratio/gists{/gist_id}","starred_url":"https://api.github.com/users/Stratio/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Stratio/subscriptions","organizations_url":"https://api.github.com/users/Stratio/orgs","repos_url":"https://api.github.com/users/Stratio/repos","events_url":"https://api.github.com/users/Stratio/events{/privacy}","received_events_url":"https://api.github.com/users/Stratio/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/Stratio/Crossdata","description":"Easy access to big things","fork":false,"url":"https://api.github.com/repos/Stratio/Crossdata","forks_url":"https://api.github.com/repos/Stratio/Crossdata/forks","keys_url":"https://api.github.com/repos/Stratio/Crossdata/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Stratio/Crossdata/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Stratio/Crossdata/teams","hooks_url":"https://api.github.com/repos/Stratio/Crossdata/hooks","issue_events_url":"https://api.github.com/repos/Stratio/Crossdata/issues/events{/number}","events_url":"https://api.github.com/repos/Stratio/Crossdata/events","assignees_url":"https://api.github.com/repos/Stratio/Crossdata/assignees{/user}","branches_url":"https://api.github.com/repos/Stratio/Crossdata/branches{/branch}","tags_url":"https://api.github.com/repos/Stratio/Crossdata/tags","blobs_url":"https://api.github.com/repos/Stratio/Crossdata/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Stratio/Crossdata/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Stratio/Crossdata/git/refs{/sha}","trees_url":"https://api.github.com/repos/Stratio/Crossdata/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Stratio/Crossdata/statuses/{sha}","languages_url":"https://api.github.com/repos/Stratio/Crossdata/languages","stargazers_url":"https://api.github.com/repos/Stratio/Crossdata/stargazers","contributors_url":"https://api.github.com/repos/Stratio/Crossdata/contributors","subscribers_url":"https://api.github.com/repos/Stratio/Crossdata/subscribers","subscription_url":"https://api.github.com/repos/Stratio/Crossdata/subscription","commits_url":"https://api.github.com/repos/Stratio/Crossdata/commits{/sha}","git_commits_url":"https://api.github.com/repos/Stratio/Crossdata/git/commits{/sha}","comments_url":"https://api.github.com/repos/Stratio/Crossdata/comments{/number}","issue_comment_url":"https://api.github.com/repos/Stratio/Crossdata/issues/comments{/number}","contents_url":"https://api.github.com/repos/Stratio/Crossdata/contents/{+path}","compare_url":"https://api.github.com/repos/Stratio/Crossdata/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Stratio/Crossdata/merges","archive_url":"https://api.github.com/repos/Stratio/Crossdata/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Stratio/Crossdata/downloads","issues_url":"https://api.github.com/repos/Stratio/Crossdata/issues{/number}","pulls_url":"https://api.github.com/repos/Stratio/Crossdata/pulls{/number}","milestones_url":"https://api.github.com/repos/Stratio/Crossdata/milestones{/number}","notifications_url":"https://api.github.com/repos/Stratio/Crossdata/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Stratio/Crossdata/labels{/name}","releases_url":"https://api.github.com/repos/Stratio/Crossdata/releases{/id}","created_at":"2014-02-06T09:41:52Z","updated_at":"2015-10-29T10:32:19Z","pushed_at":"2015-10-29T10:59:15Z","git_url":"git://github.com/Stratio/Crossdata.git","ssh_url":"git@github.com:Stratio/Crossdata.git","clone_url":"https://github.com/Stratio/Crossdata.git","svn_url":"https://github.com/Stratio/Crossdata","homepage":"http://stratio.github.io/crossdata","size":19504,"stargazers_count":80,"watchers_count":80,"language":"Scala","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":17,"mirror_url":null,"open_issues_count":32,"forks":17,"open_issues":32,"watchers":80,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/Stratio/Crossdata/pulls/164"},"html":{"href":"https://github.com/Stratio/Crossdata/pull/164"},"issue":{"href":"https://api.github.com/repos/Stratio/Crossdata/issues/164"},"comments":{"href":"https://api.github.com/repos/Stratio/Crossdata/issues/164/comments"},"review_comments":{"href":"https://api.github.com/repos/Stratio/Crossdata/pulls/164/comments"},"review_comment":{"href":"https://api.github.com/repos/Stratio/Crossdata/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/Stratio/Crossdata/pulls/164/commits"},"statuses":{"href":"https://api.github.com/repos/Stratio/Crossdata/statuses/1b55f791f0478b41fe23af2244fab1ab04d55bed"}}}}