{"action":"created","comment":{"url":"https://api.github.com/repos/RaduBerinde/cockroach/pulls/comments/58798735","id":58798735,"diff_hunk":"@@ -158,108 +158,352 @@ record (row or index entry).\n \n [1]: http://research.google.com/archive/sawzall.html\n \n-## Logical plan\n-\n-To introduce the main concepts we will make use of a sample query:\n+## Logical model and logical plans\n+\n+\n+This is a description of a logical model which can be used to talk about logical\n+plans. It is a conceptual model and *not* a description of what actually happens\n+in our system.\n+\n+The logical plan is made out of *logical nodes* or *aggregators*. Each\n+aggregator can be thought of as processing an input stream of data (or more\n+streams for joins, but let's leave that aside for now) and producing an output\n+stream of data. Each data element is a tuple of column values; both the input\n+and the output streams have a set schema. The schema is a set of columns and\n+types, with each data element having a datum for each column.\n+\n+The data going into an aggregator is grouped based on a subset of the columns\n+(called the *group key*). The aggregator performs some operation across all the\n+elements of each group. The results for a group are independent of the data in\n+the other groups (this is where distributed processing will come in - we will be\n+able to process separate groups on separate nodes; but at the logical level we\n+pretend everything is non-distributed). If there is no group key (empty set of\n+columns), all data is in a single group. The group key can be the full set of\n+input columns, which means there is no grouping; this is a special but important\n+case in which we are not aggregating multiple pieces of data, but we may be\n+filtering, transforming, or reordering individual pieces of data.\n+\n+Some aggregators can make use of SQL expressions, evaluating them with various\n+inputs as part of their work. In particular, we introduce the *program*\n+aggregator which is a \"programmable\" aggregator which processes the input stream\n+sequentially (one element at a time), potentially emitting output elements. This\n+is an aggregator with no grouping (group key is the full set of columns); the\n+processing of each data element is independent.\n+\n+Special `TableReader` aggregators with no inputs are used as data sources. A\n+special `Final` aggregator with no outputs is used for the results of the\n+query/statement.\n+\n+Some aggregators have an *ordering requirement* (`Limit`, `Final`) on the input\n+stream (a list of columns with corresponding ascending/descending requirements).\n+Some nodes (like `TableReader`) can guarantee a certain ordering on their output\n+stream, called an *ordering guarantee* (same as the `orderingInfo` in the\n+current code). All nodes in the logical plan have an associated *ordering\n+characterization* function that maps an ordering guarantee on the input stream\n+into an ordering guarantee for the output stream - meaning that if the input is\n+ordered according to the input guarantee, the output guarantee will hold.\n+\n+The ordering guarantee of the `TableReader`s along with the characterization\n+functions can be used to propagate ordering information across the logical plan.\n+When there is a mismatch (an aggregator has an ordering requirement that is not\n+matched by a guarantee), we insert a *sorting node* - this is an aggregator with\n+output schema identical to the input schema that reorders the elements in the\n+input stream providing a certain output order guarantee regardless of the input\n+ordering. Like a program, the sorting node is a non-grouping aggregator.  We can\n+perform optimizations wrt sorting at the logical plan level - we could\n+potentially put the sorting node earlier in the pipeline, or split it into\n+multiple nodes with one that performs preliminary sorting in an earlier stage.\n+\n+To introduce the main types of aggregators we will make use of a sample query.\n+\n+### Example 1\n \n ```sql\n-TABLE Orders (\n-   OId INT PRIMARY KEY,\n-   CId INT,\n-   Value DECIMAL,\n-   Date DATE\n-)\n+TABLE Orders (OId INT PRIMARY KEY, CId INT, Value DECIMAL, Date DATE)\n \n SELECT CID, SUM(VALUE) FROM Orders\n   WHERE DATE > 2015\n   GROUP BY CID\n   ORDER BY 1 - SUM(Value)\n ```\n \n-Here is a representation of the aggregators and programs that together can\n-execute this query. Note that this is not a language we are introducing, it is\n-for conceptualizing.\n+Here is a potential description of the aggregators and how they are \"connected\":\n+\n+```\n+TABLEREADER src\n+  Table: Orders\n+  Output schema: Oid:INT, Cid:INT, Value:DECIMAL, Date:DATE\n+  Ordering guarantee: Oid\n+\n+PROGRAM filter\n+  Input schema: Oid:INT, Cid:INT, Value:DECIMAL, Date:DATE\n+  Output schema: Cid, Value\n+  Ordering characterization: if input ordered by Cid[,Value] output ordered by Cid[,Value]\n+  SQL Expressions: E(x:DATE) BOOL = (x > 2015)\n+  Code {\n+    IF E(Date) EMIT Cid, Value\n+  }\n+\n+AGGREGATOR summer\n+  Input schema: Cid:INT, Value:DECIMAL\n+  Output schema: Cid:INT, ValueSum:DECIMAL\n+  Group Key: Cid\n+  Ordering characterization: if input ordered by Cid, output ordered by Cid\n+\n+PROGRAM sortval\n+  Input schema: Cid:INT, ValueSum:DECIMAL\n+  Output schema: SortVal:DECIMAL, Cid:INT, ValueSum:DECIMAL\n+  Ordering characterization: if input ordered by [Cid,]ValueSum[,Cid], output ordered by [Cid,]-ValueSum[,Cid]\n+  SQL Expressions: E(x:INT) INT = (1 - x)\n+  Code {\n+    EMIT E(ValueSum), CId, ValueSum\n+  }\n+\n+AGGREGATOR final:\n+  Input schema: SortVal:DECIMAL, Cid:INT, ValueSum:DECIMAL\n+  Input ordering requirement: SortVal\n+  Group Key: none\n \n+Composition: src -> filter -> summer -> sortval -> final\n ```\n-AGGREGATOR summer[Cid:INT] SUM OF (Value:DECIMAL)\n \n-AGGREGATOR sorter[OrderVal:DECIMAL] COLLECTION OF (CId:INT, Value:DECIMAL)\n+Note that the logical description does not include sorting nodes. This\n+preliminary plan will lead to a full logical plan (with any necessary sorting\n+nodes) when we propagate ordering information. We will have to insert a sorting\n+node before `final`:\n+```\n+src -> filter -> summer -> sortval -> sort(OrderSum) -> final\n+```\n+This is the complete logical plan.\n \n-PROGRAM1(OId:INT, CId:INT, Value:DECIMAL, Date:DATE) {\n-  if Date > 2015 {\n-    EMIT INTO summer[CId] Value\n+In this example we only had one option for the sorting node. Let's look at\n+another example.\n+\n+\n+### Example 2\n+\n+```sql\n+TABLE People (Age INT, NetWorth DECIMAL, ...)\n+\n+SELECT Age, Sum(NetWorth) FROM v GROUP BY AGE ORDER BY AGE\n+```\n+\n+Preliminary logical plan description:\n+```\n+TABLEREADER src\n+  Table: People\n+  Output schema: Age:INT, NetWorth:DECIMAL\n+  Ordering guarantee: XXX  // will consider different cases later\n+\n+AGGREGATOR summer\n+  Input schema: Age:INT, NetWorth:DECIMAL\n+  Output schema: Age:INT, NetWorthSum:DECIMAL\n+  Group Key: Age\n+  Ordering characterization: if input ordered by Age, output ordered by Age\n+\n+AGGREGATOR final:\n+  Input schema: Age:INT, NetWorthSum:DECIMAL\n+  Input ordering requirement: Age\n+  Group Key: none\n+\n+Composition: src -> summer -> final\n+```\n+\n+The `summer` aggregator can perform aggregation in two ways - if the input is\n+not ordered by Age it will use an unordered map with one entry per `Age` and the\n+results will be output in arbitrary order; if the input is ordered by `Age` it can\n+aggregate on one age at a time and it will emit the results in age order.","path":"docs/RFCS/distributed_sql.md","position":197,"original_position":175,"commit_id":"eef9fd6a43c6fa34264c6c35824ea484f3600fd5","original_commit_id":"e4f4e8e96c3a06fd2625f8ef222e5da9eee80567","user":{"login":"andreimatei","id":377201,"avatar_url":"https://avatars.githubusercontent.com/u/377201?v=3","gravatar_id":"","url":"https://api.github.com/users/andreimatei","html_url":"https://github.com/andreimatei","followers_url":"https://api.github.com/users/andreimatei/followers","following_url":"https://api.github.com/users/andreimatei/following{/other_user}","gists_url":"https://api.github.com/users/andreimatei/gists{/gist_id}","starred_url":"https://api.github.com/users/andreimatei/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/andreimatei/subscriptions","organizations_url":"https://api.github.com/users/andreimatei/orgs","repos_url":"https://api.github.com/users/andreimatei/repos","events_url":"https://api.github.com/users/andreimatei/events{/privacy}","received_events_url":"https://api.github.com/users/andreimatei/received_events","type":"User","site_admin":false},"body":"I think it's worth talking about a 3rd option too: using an ordered map. In that case the intra-stream characterization function is `<anything> => sorted by age`. And make an asterisk that will hold when we distribute the summer.","created_at":"2016-04-06T23:22:46Z","updated_at":"2016-04-06T23:22:46Z","html_url":"https://github.com/RaduBerinde/cockroach/pull/6#discussion_r58798735","pull_request_url":"https://api.github.com/repos/RaduBerinde/cockroach/pulls/6","_links":{"self":{"href":"https://api.github.com/repos/RaduBerinde/cockroach/pulls/comments/58798735"},"html":{"href":"https://github.com/RaduBerinde/cockroach/pull/6#discussion_r58798735"},"pull_request":{"href":"https://api.github.com/repos/RaduBerinde/cockroach/pulls/6"}}},"pull_request":{"url":"https://api.github.com/repos/RaduBerinde/cockroach/pulls/6","id":65385546,"html_url":"https://github.com/RaduBerinde/cockroach/pull/6","diff_url":"https://github.com/RaduBerinde/cockroach/pull/6.diff","patch_url":"https://github.com/RaduBerinde/cockroach/pull/6.patch","issue_url":"https://api.github.com/repos/RaduBerinde/cockroach/issues/6","number":6,"state":"open","locked":false,"title":"added the better logical model","user":{"login":"RaduBerinde","id":16544120,"avatar_url":"https://avatars.githubusercontent.com/u/16544120?v=3","gravatar_id":"","url":"https://api.github.com/users/RaduBerinde","html_url":"https://github.com/RaduBerinde","followers_url":"https://api.github.com/users/RaduBerinde/followers","following_url":"https://api.github.com/users/RaduBerinde/following{/other_user}","gists_url":"https://api.github.com/users/RaduBerinde/gists{/gist_id}","starred_url":"https://api.github.com/users/RaduBerinde/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/RaduBerinde/subscriptions","organizations_url":"https://api.github.com/users/RaduBerinde/orgs","repos_url":"https://api.github.com/users/RaduBerinde/repos","events_url":"https://api.github.com/users/RaduBerinde/events{/privacy}","received_events_url":"https://api.github.com/users/RaduBerinde/received_events","type":"User","site_admin":false},"body":"Major changes:\r\n - formalized the logical model of streams and ordering\r\n - unified aggregators and programs\r\n - all aggregators can use SQL expressions. This will be very useful for outer joins, where the join processor will need to internally evaluate the full `ON` expression. It is also useful to avoid unnecessary program stages just to calculate expression values to feed into an aggregator.\r\n\r\nhttps://github.com/RaduBerinde/cockroach/blob/c2bd9ece00b04c87ec9b144f48ce5883f9e58cef/docs/RFCS/distributed_sql.md","created_at":"2016-04-05T22:58:04Z","updated_at":"2016-04-06T23:22:46Z","closed_at":null,"merged_at":null,"merge_commit_sha":"8b5d30458a2d244ca5538513562f5356d39237d1","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/RaduBerinde/cockroach/pulls/6/commits","review_comments_url":"https://api.github.com/repos/RaduBerinde/cockroach/pulls/6/comments","review_comment_url":"https://api.github.com/repos/RaduBerinde/cockroach/pulls/comments{/number}","comments_url":"https://api.github.com/repos/RaduBerinde/cockroach/issues/6/comments","statuses_url":"https://api.github.com/repos/RaduBerinde/cockroach/statuses/eef9fd6a43c6fa34264c6c35824ea484f3600fd5","head":{"label":"RaduBerinde:dist-sql-rfc-work","ref":"dist-sql-rfc-work","sha":"eef9fd6a43c6fa34264c6c35824ea484f3600fd5","user":{"login":"RaduBerinde","id":16544120,"avatar_url":"https://avatars.githubusercontent.com/u/16544120?v=3","gravatar_id":"","url":"https://api.github.com/users/RaduBerinde","html_url":"https://github.com/RaduBerinde","followers_url":"https://api.github.com/users/RaduBerinde/followers","following_url":"https://api.github.com/users/RaduBerinde/following{/other_user}","gists_url":"https://api.github.com/users/RaduBerinde/gists{/gist_id}","starred_url":"https://api.github.com/users/RaduBerinde/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/RaduBerinde/subscriptions","organizations_url":"https://api.github.com/users/RaduBerinde/orgs","repos_url":"https://api.github.com/users/RaduBerinde/repos","events_url":"https://api.github.com/users/RaduBerinde/events{/privacy}","received_events_url":"https://api.github.com/users/RaduBerinde/received_events","type":"User","site_admin":false},"repo":{"id":49111463,"name":"cockroach","full_name":"RaduBerinde/cockroach","owner":{"login":"RaduBerinde","id":16544120,"avatar_url":"https://avatars.githubusercontent.com/u/16544120?v=3","gravatar_id":"","url":"https://api.github.com/users/RaduBerinde","html_url":"https://github.com/RaduBerinde","followers_url":"https://api.github.com/users/RaduBerinde/followers","following_url":"https://api.github.com/users/RaduBerinde/following{/other_user}","gists_url":"https://api.github.com/users/RaduBerinde/gists{/gist_id}","starred_url":"https://api.github.com/users/RaduBerinde/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/RaduBerinde/subscriptions","organizations_url":"https://api.github.com/users/RaduBerinde/orgs","repos_url":"https://api.github.com/users/RaduBerinde/repos","events_url":"https://api.github.com/users/RaduBerinde/events{/privacy}","received_events_url":"https://api.github.com/users/RaduBerinde/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/RaduBerinde/cockroach","description":"A Scalable, Survivable, Strongly-Consistent SQL Database","fork":true,"url":"https://api.github.com/repos/RaduBerinde/cockroach","forks_url":"https://api.github.com/repos/RaduBerinde/cockroach/forks","keys_url":"https://api.github.com/repos/RaduBerinde/cockroach/keys{/key_id}","collaborators_url":"https://api.github.com/repos/RaduBerinde/cockroach/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/RaduBerinde/cockroach/teams","hooks_url":"https://api.github.com/repos/RaduBerinde/cockroach/hooks","issue_events_url":"https://api.github.com/repos/RaduBerinde/cockroach/issues/events{/number}","events_url":"https://api.github.com/repos/RaduBerinde/cockroach/events","assignees_url":"https://api.github.com/repos/RaduBerinde/cockroach/assignees{/user}","branches_url":"https://api.github.com/repos/RaduBerinde/cockroach/branches{/branch}","tags_url":"https://api.github.com/repos/RaduBerinde/cockroach/tags","blobs_url":"https://api.github.com/repos/RaduBerinde/cockroach/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/RaduBerinde/cockroach/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/RaduBerinde/cockroach/git/refs{/sha}","trees_url":"https://api.github.com/repos/RaduBerinde/cockroach/git/trees{/sha}","statuses_url":"https://api.github.com/repos/RaduBerinde/cockroach/statuses/{sha}","languages_url":"https://api.github.com/repos/RaduBerinde/cockroach/languages","stargazers_url":"https://api.github.com/repos/RaduBerinde/cockroach/stargazers","contributors_url":"https://api.github.com/repos/RaduBerinde/cockroach/contributors","subscribers_url":"https://api.github.com/repos/RaduBerinde/cockroach/subscribers","subscription_url":"https://api.github.com/repos/RaduBerinde/cockroach/subscription","commits_url":"https://api.github.com/repos/RaduBerinde/cockroach/commits{/sha}","git_commits_url":"https://api.github.com/repos/RaduBerinde/cockroach/git/commits{/sha}","comments_url":"https://api.github.com/repos/RaduBerinde/cockroach/comments{/number}","issue_comment_url":"https://api.github.com/repos/RaduBerinde/cockroach/issues/comments{/number}","contents_url":"https://api.github.com/repos/RaduBerinde/cockroach/contents/{+path}","compare_url":"https://api.github.com/repos/RaduBerinde/cockroach/compare/{base}...{head}","merges_url":"https://api.github.com/repos/RaduBerinde/cockroach/merges","archive_url":"https://api.github.com/repos/RaduBerinde/cockroach/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/RaduBerinde/cockroach/downloads","issues_url":"https://api.github.com/repos/RaduBerinde/cockroach/issues{/number}","pulls_url":"https://api.github.com/repos/RaduBerinde/cockroach/pulls{/number}","milestones_url":"https://api.github.com/repos/RaduBerinde/cockroach/milestones{/number}","notifications_url":"https://api.github.com/repos/RaduBerinde/cockroach/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/RaduBerinde/cockroach/labels{/name}","releases_url":"https://api.github.com/repos/RaduBerinde/cockroach/releases{/id}","deployments_url":"https://api.github.com/repos/RaduBerinde/cockroach/deployments","created_at":"2016-01-06T04:07:30Z","updated_at":"2016-01-14T02:30:27Z","pushed_at":"2016-04-06T19:32:49Z","git_url":"git://github.com/RaduBerinde/cockroach.git","ssh_url":"git@github.com:RaduBerinde/cockroach.git","clone_url":"https://github.com/RaduBerinde/cockroach.git","svn_url":"https://github.com/RaduBerinde/cockroach","homepage":"http://www.cockroachlabs.com","size":139905,"stargazers_count":1,"watchers_count":1,"language":"Go","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":3,"forks":0,"open_issues":3,"watchers":1,"default_branch":"master"}},"base":{"label":"RaduBerinde:dist-sql-rfc","ref":"dist-sql-rfc","sha":"2214acbd46c6265e4b44c3be972d4b79496a5979","user":{"login":"RaduBerinde","id":16544120,"avatar_url":"https://avatars.githubusercontent.com/u/16544120?v=3","gravatar_id":"","url":"https://api.github.com/users/RaduBerinde","html_url":"https://github.com/RaduBerinde","followers_url":"https://api.github.com/users/RaduBerinde/followers","following_url":"https://api.github.com/users/RaduBerinde/following{/other_user}","gists_url":"https://api.github.com/users/RaduBerinde/gists{/gist_id}","starred_url":"https://api.github.com/users/RaduBerinde/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/RaduBerinde/subscriptions","organizations_url":"https://api.github.com/users/RaduBerinde/orgs","repos_url":"https://api.github.com/users/RaduBerinde/repos","events_url":"https://api.github.com/users/RaduBerinde/events{/privacy}","received_events_url":"https://api.github.com/users/RaduBerinde/received_events","type":"User","site_admin":false},"repo":{"id":49111463,"name":"cockroach","full_name":"RaduBerinde/cockroach","owner":{"login":"RaduBerinde","id":16544120,"avatar_url":"https://avatars.githubusercontent.com/u/16544120?v=3","gravatar_id":"","url":"https://api.github.com/users/RaduBerinde","html_url":"https://github.com/RaduBerinde","followers_url":"https://api.github.com/users/RaduBerinde/followers","following_url":"https://api.github.com/users/RaduBerinde/following{/other_user}","gists_url":"https://api.github.com/users/RaduBerinde/gists{/gist_id}","starred_url":"https://api.github.com/users/RaduBerinde/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/RaduBerinde/subscriptions","organizations_url":"https://api.github.com/users/RaduBerinde/orgs","repos_url":"https://api.github.com/users/RaduBerinde/repos","events_url":"https://api.github.com/users/RaduBerinde/events{/privacy}","received_events_url":"https://api.github.com/users/RaduBerinde/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/RaduBerinde/cockroach","description":"A Scalable, Survivable, Strongly-Consistent SQL Database","fork":true,"url":"https://api.github.com/repos/RaduBerinde/cockroach","forks_url":"https://api.github.com/repos/RaduBerinde/cockroach/forks","keys_url":"https://api.github.com/repos/RaduBerinde/cockroach/keys{/key_id}","collaborators_url":"https://api.github.com/repos/RaduBerinde/cockroach/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/RaduBerinde/cockroach/teams","hooks_url":"https://api.github.com/repos/RaduBerinde/cockroach/hooks","issue_events_url":"https://api.github.com/repos/RaduBerinde/cockroach/issues/events{/number}","events_url":"https://api.github.com/repos/RaduBerinde/cockroach/events","assignees_url":"https://api.github.com/repos/RaduBerinde/cockroach/assignees{/user}","branches_url":"https://api.github.com/repos/RaduBerinde/cockroach/branches{/branch}","tags_url":"https://api.github.com/repos/RaduBerinde/cockroach/tags","blobs_url":"https://api.github.com/repos/RaduBerinde/cockroach/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/RaduBerinde/cockroach/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/RaduBerinde/cockroach/git/refs{/sha}","trees_url":"https://api.github.com/repos/RaduBerinde/cockroach/git/trees{/sha}","statuses_url":"https://api.github.com/repos/RaduBerinde/cockroach/statuses/{sha}","languages_url":"https://api.github.com/repos/RaduBerinde/cockroach/languages","stargazers_url":"https://api.github.com/repos/RaduBerinde/cockroach/stargazers","contributors_url":"https://api.github.com/repos/RaduBerinde/cockroach/contributors","subscribers_url":"https://api.github.com/repos/RaduBerinde/cockroach/subscribers","subscription_url":"https://api.github.com/repos/RaduBerinde/cockroach/subscription","commits_url":"https://api.github.com/repos/RaduBerinde/cockroach/commits{/sha}","git_commits_url":"https://api.github.com/repos/RaduBerinde/cockroach/git/commits{/sha}","comments_url":"https://api.github.com/repos/RaduBerinde/cockroach/comments{/number}","issue_comment_url":"https://api.github.com/repos/RaduBerinde/cockroach/issues/comments{/number}","contents_url":"https://api.github.com/repos/RaduBerinde/cockroach/contents/{+path}","compare_url":"https://api.github.com/repos/RaduBerinde/cockroach/compare/{base}...{head}","merges_url":"https://api.github.com/repos/RaduBerinde/cockroach/merges","archive_url":"https://api.github.com/repos/RaduBerinde/cockroach/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/RaduBerinde/cockroach/downloads","issues_url":"https://api.github.com/repos/RaduBerinde/cockroach/issues{/number}","pulls_url":"https://api.github.com/repos/RaduBerinde/cockroach/pulls{/number}","milestones_url":"https://api.github.com/repos/RaduBerinde/cockroach/milestones{/number}","notifications_url":"https://api.github.com/repos/RaduBerinde/cockroach/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/RaduBerinde/cockroach/labels{/name}","releases_url":"https://api.github.com/repos/RaduBerinde/cockroach/releases{/id}","deployments_url":"https://api.github.com/repos/RaduBerinde/cockroach/deployments","created_at":"2016-01-06T04:07:30Z","updated_at":"2016-01-14T02:30:27Z","pushed_at":"2016-04-06T19:32:49Z","git_url":"git://github.com/RaduBerinde/cockroach.git","ssh_url":"git@github.com:RaduBerinde/cockroach.git","clone_url":"https://github.com/RaduBerinde/cockroach.git","svn_url":"https://github.com/RaduBerinde/cockroach","homepage":"http://www.cockroachlabs.com","size":139905,"stargazers_count":1,"watchers_count":1,"language":"Go","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":3,"forks":0,"open_issues":3,"watchers":1,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/RaduBerinde/cockroach/pulls/6"},"html":{"href":"https://github.com/RaduBerinde/cockroach/pull/6"},"issue":{"href":"https://api.github.com/repos/RaduBerinde/cockroach/issues/6"},"comments":{"href":"https://api.github.com/repos/RaduBerinde/cockroach/issues/6/comments"},"review_comments":{"href":"https://api.github.com/repos/RaduBerinde/cockroach/pulls/6/comments"},"review_comment":{"href":"https://api.github.com/repos/RaduBerinde/cockroach/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/RaduBerinde/cockroach/pulls/6/commits"},"statuses":{"href":"https://api.github.com/repos/RaduBerinde/cockroach/statuses/eef9fd6a43c6fa34264c6c35824ea484f3600fd5"}}}}