{"action":"created","comment":{"url":"https://api.github.com/repos/OctopusDeploy/Nevermore/pulls/comments/173983989","pull_request_review_id":103262017,"id":173983989,"diff_hunk":"@@ -1,40 +1,85 @@\n using System;\n using System.Collections.Generic;\n-using Nevermore.Joins;\n+using Nevermore.AST;\n \n namespace Nevermore\n {\n-    public interface IQueryBuilder<TRecord> where TRecord : class\n+    public interface IOrderedQueryBuilder<TRecord> : IQueryBuilder<TRecord> where TRecord : class\n+    {\n+    }\n+\n+    public interface ITableSourceQueryBuilder<TRecord> : IQueryBuilder<TRecord> where TRecord : class\n     {\n-        IQueryGenerator QueryGenerator { get; }\n+        ITableSourceQueryBuilder<TRecord> View(string viewName);\n+        ITableSourceQueryBuilder<TRecord> Table(string tableName);\n+        ITableSourceQueryBuilder<TRecord> Alias(string tableAlias); \n+        IQueryBuilder<TRecord> Hint(string tableHint);\n+        IAliasedSelectSource AsAliasedSource();\n+    }\n \n+    public interface ISubquerySourceBuilder<TRecord> : IQueryBuilder<TRecord> where TRecord : class\n+    {\n+        ISubquerySource AsSource();\n+        ISubquerySourceBuilder<TRecord> Alias(string subqueryAlias);\n+    }\n+\n+    public interface IJoinSourceQueryBuilder<TRecord> : IQueryBuilder<TRecord> where TRecord : class\n+    {\n+        IJoinSourceQueryBuilder<TRecord> On(string leftField, JoinOperand operand, string rightField);\n+    }\n+\n+    public interface IQueryBuilder<TRecord> where TRecord : class\n+    {\n         IQueryBuilder<TRecord> Where(string whereClause);\n-        IQueryBuilder<TRecord> Where(string fieldName, SqlOperand operand, object value);\n-        IQueryBuilder<TRecord> Where(string fieldName, SqlOperand operand, object startValue, object endValue);\n-        IQueryBuilder<TRecord> Where(string fieldName, SqlOperand operand, IEnumerable<object> values);\n-        \n+        IQueryBuilder<TRecord> WhereParameterised(string fieldName, UnarySqlOperand operand, Parameter parameter);\n+        IQueryBuilder<TRecord> WhereParameterised(string fieldName, BinarySqlOperand operand, Parameter startValueParameter, Parameter endValueParameter);\n+        IQueryBuilder<TRecord> WhereParameterised(string fieldName, ArraySqlOperand operand, IEnumerable<Parameter> parameterNames);\n+\n         IOrderedQueryBuilder<TRecord> OrderBy(string orderByClause);\n         IOrderedQueryBuilder<TRecord> OrderByDescending(string orderByClause);\n+        IQueryBuilder<TRecord> IgnoreDefaultOrderBy();\n \n-        IQueryBuilder<TRecord> Join(IJoin join);\n-        IQueryBuilder<TRecord> Parameter(string name, object value);\n-        IQueryBuilder<TRecord> LikeParameter(string name, object value);\n-        IQueryBuilder<TRecord> LikePipedParameter(string name, object value);\n-        IQueryBuilder<TRecord> View(string viewName);\n-        IQueryBuilder<TRecord> Table(string tableName);\n-        IQueryBuilder<TRecord> Hint(string tableHint);\n-        IQueryBuilder<TRecord> NoLock();\n+        IQueryBuilder<TRecord> Column(string name);\n+        IQueryBuilder<TRecord> Column(string name, string columnAlias);\n+        IQueryBuilder<TRecord> Column(string name, string columnAlias, string tableAlias);\n+        IQueryBuilder<TRecord> AllColumns();\n+        IQueryBuilder<TRecord> CalculatedColumn(string expression, string columnAlias);\n+        IQueryBuilder<TNewRecord> AsType<TNewRecord>() where TNewRecord : class;\n \n+        IQueryBuilder<TRecord> AddRowNumberColumn(string columnAlias);\n+        IQueryBuilder<TRecord> AddRowNumberColumn(string columnAlias, params string[] partitionByColumns);\n+        IQueryBuilder<TRecord> AddRowNumberColumn(string columnAlias, params ColumnFromTable[] partitionByColumns);\n+        IQueryBuilder<TRecord> Parameter(Parameter parameter);\n+        IQueryBuilder<TRecord> ParameterDefault(Parameter parameter, object defaultValue);\n+        IQueryBuilder<TRecord> Parameter(Parameter parameter, object value);\n+\n+        IJoinSourceQueryBuilder<TRecord> Join(IAliasedSelectSource source, JoinType joinType);\n+        ISubquerySourceBuilder<TRecord> Union(IQueryBuilder<TRecord> queryBuilder);\n+        ISubquerySourceBuilder<TRecord> Subquery(); \n+        ISelectBuilder GetSelectBuilder();\n         int Count();\n         bool Any();\n         TRecord First();\n         IEnumerable<TRecord> Take(int take);\n         List<TRecord> ToList(int skip, int take);\n         List<TRecord> ToList(int skip, int take, out int totalResults);\n         List<TRecord> ToList();\n-        void Delete();\n         IEnumerable<TRecord> Stream();\n         IDictionary<string, TRecord> ToDictionary(Func<TRecord, string> keySelector);\n+        Parameters Parameters { get; }","path":"source/Nevermore/IQueryBuilder.cs","position":85,"original_position":85,"commit_id":"a8fe4664cfa4c64c7be1693ed674edc5f22d4131","original_commit_id":"a8fe4664cfa4c64c7be1693ed674edc5f22d4131","user":{"login":"TomPeters","id":1892715,"avatar_url":"https://avatars2.githubusercontent.com/u/1892715?v=4","gravatar_id":"","url":"https://api.github.com/users/TomPeters","html_url":"https://github.com/TomPeters","followers_url":"https://api.github.com/users/TomPeters/followers","following_url":"https://api.github.com/users/TomPeters/following{/other_user}","gists_url":"https://api.github.com/users/TomPeters/gists{/gist_id}","starred_url":"https://api.github.com/users/TomPeters/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/TomPeters/subscriptions","organizations_url":"https://api.github.com/users/TomPeters/orgs","repos_url":"https://api.github.com/users/TomPeters/repos","events_url":"https://api.github.com/users/TomPeters/events{/privacy}","received_events_url":"https://api.github.com/users/TomPeters/received_events","type":"User","site_admin":false},"body":"True, I suppose that's the easiest option","created_at":"2018-03-13T00:08:51Z","updated_at":"2018-03-13T00:08:51Z","html_url":"https://github.com/OctopusDeploy/Nevermore/pull/39#discussion_r173983989","pull_request_url":"https://api.github.com/repos/OctopusDeploy/Nevermore/pulls/39","author_association":"NONE","_links":{"self":{"href":"https://api.github.com/repos/OctopusDeploy/Nevermore/pulls/comments/173983989"},"html":{"href":"https://github.com/OctopusDeploy/Nevermore/pull/39#discussion_r173983989"},"pull_request":{"href":"https://api.github.com/repos/OctopusDeploy/Nevermore/pulls/39"}},"in_reply_to_id":173964964},"pull_request":{"url":"https://api.github.com/repos/OctopusDeploy/Nevermore/pulls/39","id":171870971,"html_url":"https://github.com/OctopusDeploy/Nevermore/pull/39","diff_url":"https://github.com/OctopusDeploy/Nevermore/pull/39.diff","patch_url":"https://github.com/OctopusDeploy/Nevermore/pull/39.patch","issue_url":"https://api.github.com/repos/OctopusDeploy/Nevermore/issues/39","number":39,"state":"open","locked":false,"title":"Build queries using an AST and extend query building features","user":{"login":"TomPeters","id":1892715,"avatar_url":"https://avatars2.githubusercontent.com/u/1892715?v=4","gravatar_id":"","url":"https://api.github.com/users/TomPeters","html_url":"https://github.com/TomPeters","followers_url":"https://api.github.com/users/TomPeters/followers","following_url":"https://api.github.com/users/TomPeters/following{/other_user}","gists_url":"https://api.github.com/users/TomPeters/gists{/gist_id}","starred_url":"https://api.github.com/users/TomPeters/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/TomPeters/subscriptions","organizations_url":"https://api.github.com/users/TomPeters/orgs","repos_url":"https://api.github.com/users/TomPeters/repos","events_url":"https://api.github.com/users/TomPeters/events{/privacy}","received_events_url":"https://api.github.com/users/TomPeters/received_events","type":"User","site_admin":false},"body":"# Goals\r\nThere are 3 main goals I am trying to address with this change:\r\n\r\n1. We want to be able to build queries for creating Stored Procedures, Functions, and Views\r\n2. We want to be able to use some more of the features in SQL server\r\n3. We want to make it a bit easier to extend the behaviour of query generation so that we can inject some application-specific business logic into the process\r\n\r\n## AST\r\nExtending our query generation code proved to be very difficult in its current form. This PR replaces a lot of the query generation code with an AST which can be used to perform the query generation. The idea is that this new structure is much easier to extend. \r\n\r\nFor example, explicit table/subquery aliasing was very difficult to add to the old query generation code. It was much easier to add now that there is an AST to back our query.\r\n\r\nAll parts of the AST are in the `AST` namespace. The AST is immutable. \r\n\r\n## `IQueryBuilder`\r\nUnfortunately, the `IQueryBuilder` is mutable, and usages of it in other projects rely on the fact that it is mutable, so this is unchanged.\r\n\r\nThe old model was: `IQueryBuilder` deletages to `SqlQueryGenerator`. `SqlQueryGenerator` was stateful and built up string expressions of parts of the query as it went. At the end, it would plug the main parts of the query together when you are ready to perform a query. All state was stored in `SqlQueryGenerator`.\r\n\r\nIn the new model we still have an `IQueryBuilder`, which delegates to an `ISelectBuilder` (there are multiple implementations). `ISelectBuilder` stores all state required to build an `ISelect`, which is a root node of the AST that represents a single \"select\" sql statement. Not all state is stored in the `ISelectBuilder`: Parameters are stored directly on the `IQueryBuilder`, since parameter value are not required in order to build an `ISelect`, but are only required at execution time.\r\n\r\nThere is some more type safety around what operations you can perform on the `IQueryBuilder`, implemented by sub-types of `IQueryBuilder`. For example, the `On` method can only be called on the `IJoinSourceQueryBuilder`, and you can only get access to the `IJoinSourceQueryBuilder` by calling `Join` on an `IQueryBuilder`. This keeps the typing a bit stricter and prevents needing to handle more edge cases in the code. It also forces the usage to be clearer and less ambiguous (eg the `On` keyword must apply to the specific `Join` that was _just_ added to the query).\r\n\r\n## Deletes\r\nIn the old code, you could call `.Delete()` at the end of any query. There were a number of things you could do during query generation that meant that the delete query would be invalid, or throw an exception. I have replaced this with a separate query builder just for deletes, which is a stripped down version of the normal query builder. This restricts what you can do with the delete query builder to only valid operations, which will make it much easier to achieve goal 3 ☝️.\r\n\r\n## Stored Procs / Functions\r\nPreviously, we just had parameters for queries. They had names and values. Nice and simple.\r\n\r\nNow it is more complex: If you are creating a stored proc, then you still have parameters, but they don't have values, they only have a name. But they also now must come with a data type as well in this case, and they can also come with a default value. This is all now supported, but one consequence is that I have rename `CommandParameters` (which represented the parameter values only) to `CommandParameterValues` in order to differentiate them from the parameters without values (`Parameters`) and their default values (`ParameterDefaults`).\r\n\r\n## Table aliasing\r\nWe rely more now on generating aliases for subqueries (this seemed fairly limited before). Previously this was done by producing a random string, but this breaks caching in sql server, so the process is now deterministic for the same query.\r\n\r\n## Breaking changes\r\n\r\n- Some operations (like joining) create a new `IQueryBuilder` and `ISelectBuilder` and therefore do not continue to mutate the original query builder. This is mostly isolated to things that change the \"source\" of a query (like joins/subqueries). There are only a limited number of usages in our code of joins that will need to be manually checked and possibly changed.\r\n- Type names changed / new types\r\n    - `IQueryBuilder` has more sub-types, but most code should be unaffected, and any code that is simply chaining queries will be unaffected\r\n    - `CommandParameters` renamed to `CommandParameterValues`\r\n- `Delete` removed from `IQueryBuilder`\r\n- Generated SQL is formatted differently\r\n- Generated SQL may actually be different for more complex queries, but should produce the same result\r\n- Some edge cases for nested queries/joins handled a little differently (and in a more predictable way now IMO), for example see `ShouldGenerateSelectForComplicatedSubqueryJoin`, where the explicit `.OrderBy(\"Id\")` call was applied to the end of the whole query, instead of against the subquery against which it was specified.\r\n- Some ways in which you could invoke the query builder are now not possible. For example\r\n`transaction.Query<MyDocument>().Where(\"foo = 1\").View(\"SomeView\")` will no longer compile, and needs to be replaced with `transaction.Query<MyDocument>().View(\"SomeView\").Where(\"foo = 1\")`","created_at":"2018-02-28T06:59:07Z","updated_at":"2018-03-13T00:08:51Z","closed_at":null,"merged_at":null,"merge_commit_sha":"9c63fe5764e17609bf9676dc8f0dbd53ab2f7b7b","assignee":{"login":"TomPeters","id":1892715,"avatar_url":"https://avatars2.githubusercontent.com/u/1892715?v=4","gravatar_id":"","url":"https://api.github.com/users/TomPeters","html_url":"https://github.com/TomPeters","followers_url":"https://api.github.com/users/TomPeters/followers","following_url":"https://api.github.com/users/TomPeters/following{/other_user}","gists_url":"https://api.github.com/users/TomPeters/gists{/gist_id}","starred_url":"https://api.github.com/users/TomPeters/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/TomPeters/subscriptions","organizations_url":"https://api.github.com/users/TomPeters/orgs","repos_url":"https://api.github.com/users/TomPeters/repos","events_url":"https://api.github.com/users/TomPeters/events{/privacy}","received_events_url":"https://api.github.com/users/TomPeters/received_events","type":"User","site_admin":false},"assignees":[{"login":"TomPeters","id":1892715,"avatar_url":"https://avatars2.githubusercontent.com/u/1892715?v=4","gravatar_id":"","url":"https://api.github.com/users/TomPeters","html_url":"https://github.com/TomPeters","followers_url":"https://api.github.com/users/TomPeters/followers","following_url":"https://api.github.com/users/TomPeters/following{/other_user}","gists_url":"https://api.github.com/users/TomPeters/gists{/gist_id}","starred_url":"https://api.github.com/users/TomPeters/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/TomPeters/subscriptions","organizations_url":"https://api.github.com/users/TomPeters/orgs","repos_url":"https://api.github.com/users/TomPeters/repos","events_url":"https://api.github.com/users/TomPeters/events{/privacy}","received_events_url":"https://api.github.com/users/TomPeters/received_events","type":"User","site_admin":false}],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/OctopusDeploy/Nevermore/pulls/39/commits","review_comments_url":"https://api.github.com/repos/OctopusDeploy/Nevermore/pulls/39/comments","review_comment_url":"https://api.github.com/repos/OctopusDeploy/Nevermore/pulls/comments{/number}","comments_url":"https://api.github.com/repos/OctopusDeploy/Nevermore/issues/39/comments","statuses_url":"https://api.github.com/repos/OctopusDeploy/Nevermore/statuses/a8fe4664cfa4c64c7be1693ed674edc5f22d4131","head":{"label":"OctopusDeploy:abstract-syntax-tree","ref":"abstract-syntax-tree","sha":"a8fe4664cfa4c64c7be1693ed674edc5f22d4131","user":{"login":"OctopusDeploy","id":1287123,"avatar_url":"https://avatars0.githubusercontent.com/u/1287123?v=4","gravatar_id":"","url":"https://api.github.com/users/OctopusDeploy","html_url":"https://github.com/OctopusDeploy","followers_url":"https://api.github.com/users/OctopusDeploy/followers","following_url":"https://api.github.com/users/OctopusDeploy/following{/other_user}","gists_url":"https://api.github.com/users/OctopusDeploy/gists{/gist_id}","starred_url":"https://api.github.com/users/OctopusDeploy/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/OctopusDeploy/subscriptions","organizations_url":"https://api.github.com/users/OctopusDeploy/orgs","repos_url":"https://api.github.com/users/OctopusDeploy/repos","events_url":"https://api.github.com/users/OctopusDeploy/events{/privacy}","received_events_url":"https://api.github.com/users/OctopusDeploy/received_events","type":"Organization","site_admin":false},"repo":{"id":37701483,"name":"Nevermore","full_name":"OctopusDeploy/Nevermore","owner":{"login":"OctopusDeploy","id":1287123,"avatar_url":"https://avatars0.githubusercontent.com/u/1287123?v=4","gravatar_id":"","url":"https://api.github.com/users/OctopusDeploy","html_url":"https://github.com/OctopusDeploy","followers_url":"https://api.github.com/users/OctopusDeploy/followers","following_url":"https://api.github.com/users/OctopusDeploy/following{/other_user}","gists_url":"https://api.github.com/users/OctopusDeploy/gists{/gist_id}","starred_url":"https://api.github.com/users/OctopusDeploy/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/OctopusDeploy/subscriptions","organizations_url":"https://api.github.com/users/OctopusDeploy/orgs","repos_url":"https://api.github.com/users/OctopusDeploy/repos","events_url":"https://api.github.com/users/OctopusDeploy/events{/privacy}","received_events_url":"https://api.github.com/users/OctopusDeploy/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/OctopusDeploy/Nevermore","description":"A JSON Document Store library for SQL Server","fork":false,"url":"https://api.github.com/repos/OctopusDeploy/Nevermore","forks_url":"https://api.github.com/repos/OctopusDeploy/Nevermore/forks","keys_url":"https://api.github.com/repos/OctopusDeploy/Nevermore/keys{/key_id}","collaborators_url":"https://api.github.com/repos/OctopusDeploy/Nevermore/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/OctopusDeploy/Nevermore/teams","hooks_url":"https://api.github.com/repos/OctopusDeploy/Nevermore/hooks","issue_events_url":"https://api.github.com/repos/OctopusDeploy/Nevermore/issues/events{/number}","events_url":"https://api.github.com/repos/OctopusDeploy/Nevermore/events","assignees_url":"https://api.github.com/repos/OctopusDeploy/Nevermore/assignees{/user}","branches_url":"https://api.github.com/repos/OctopusDeploy/Nevermore/branches{/branch}","tags_url":"https://api.github.com/repos/OctopusDeploy/Nevermore/tags","blobs_url":"https://api.github.com/repos/OctopusDeploy/Nevermore/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/OctopusDeploy/Nevermore/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/OctopusDeploy/Nevermore/git/refs{/sha}","trees_url":"https://api.github.com/repos/OctopusDeploy/Nevermore/git/trees{/sha}","statuses_url":"https://api.github.com/repos/OctopusDeploy/Nevermore/statuses/{sha}","languages_url":"https://api.github.com/repos/OctopusDeploy/Nevermore/languages","stargazers_url":"https://api.github.com/repos/OctopusDeploy/Nevermore/stargazers","contributors_url":"https://api.github.com/repos/OctopusDeploy/Nevermore/contributors","subscribers_url":"https://api.github.com/repos/OctopusDeploy/Nevermore/subscribers","subscription_url":"https://api.github.com/repos/OctopusDeploy/Nevermore/subscription","commits_url":"https://api.github.com/repos/OctopusDeploy/Nevermore/commits{/sha}","git_commits_url":"https://api.github.com/repos/OctopusDeploy/Nevermore/git/commits{/sha}","comments_url":"https://api.github.com/repos/OctopusDeploy/Nevermore/comments{/number}","issue_comment_url":"https://api.github.com/repos/OctopusDeploy/Nevermore/issues/comments{/number}","contents_url":"https://api.github.com/repos/OctopusDeploy/Nevermore/contents/{+path}","compare_url":"https://api.github.com/repos/OctopusDeploy/Nevermore/compare/{base}...{head}","merges_url":"https://api.github.com/repos/OctopusDeploy/Nevermore/merges","archive_url":"https://api.github.com/repos/OctopusDeploy/Nevermore/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/OctopusDeploy/Nevermore/downloads","issues_url":"https://api.github.com/repos/OctopusDeploy/Nevermore/issues{/number}","pulls_url":"https://api.github.com/repos/OctopusDeploy/Nevermore/pulls{/number}","milestones_url":"https://api.github.com/repos/OctopusDeploy/Nevermore/milestones{/number}","notifications_url":"https://api.github.com/repos/OctopusDeploy/Nevermore/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/OctopusDeploy/Nevermore/labels{/name}","releases_url":"https://api.github.com/repos/OctopusDeploy/Nevermore/releases{/id}","deployments_url":"https://api.github.com/repos/OctopusDeploy/Nevermore/deployments","created_at":"2015-06-19T04:27:01Z","updated_at":"2018-03-12T22:38:46Z","pushed_at":"2018-03-08T03:26:24Z","git_url":"git://github.com/OctopusDeploy/Nevermore.git","ssh_url":"git@github.com:OctopusDeploy/Nevermore.git","clone_url":"https://github.com/OctopusDeploy/Nevermore.git","svn_url":"https://github.com/OctopusDeploy/Nevermore","homepage":null,"size":906,"stargazers_count":21,"watchers_count":21,"language":"C#","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":3,"mirror_url":null,"archived":false,"open_issues_count":10,"license":{"key":"other","name":"Other","spdx_id":null,"url":null},"forks":3,"open_issues":10,"watchers":21,"default_branch":"master"}},"base":{"label":"OctopusDeploy:master","ref":"master","sha":"f3ac54e65ecc219df6c3da4fac60fba4fa1e5873","user":{"login":"OctopusDeploy","id":1287123,"avatar_url":"https://avatars0.githubusercontent.com/u/1287123?v=4","gravatar_id":"","url":"https://api.github.com/users/OctopusDeploy","html_url":"https://github.com/OctopusDeploy","followers_url":"https://api.github.com/users/OctopusDeploy/followers","following_url":"https://api.github.com/users/OctopusDeploy/following{/other_user}","gists_url":"https://api.github.com/users/OctopusDeploy/gists{/gist_id}","starred_url":"https://api.github.com/users/OctopusDeploy/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/OctopusDeploy/subscriptions","organizations_url":"https://api.github.com/users/OctopusDeploy/orgs","repos_url":"https://api.github.com/users/OctopusDeploy/repos","events_url":"https://api.github.com/users/OctopusDeploy/events{/privacy}","received_events_url":"https://api.github.com/users/OctopusDeploy/received_events","type":"Organization","site_admin":false},"repo":{"id":37701483,"name":"Nevermore","full_name":"OctopusDeploy/Nevermore","owner":{"login":"OctopusDeploy","id":1287123,"avatar_url":"https://avatars0.githubusercontent.com/u/1287123?v=4","gravatar_id":"","url":"https://api.github.com/users/OctopusDeploy","html_url":"https://github.com/OctopusDeploy","followers_url":"https://api.github.com/users/OctopusDeploy/followers","following_url":"https://api.github.com/users/OctopusDeploy/following{/other_user}","gists_url":"https://api.github.com/users/OctopusDeploy/gists{/gist_id}","starred_url":"https://api.github.com/users/OctopusDeploy/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/OctopusDeploy/subscriptions","organizations_url":"https://api.github.com/users/OctopusDeploy/orgs","repos_url":"https://api.github.com/users/OctopusDeploy/repos","events_url":"https://api.github.com/users/OctopusDeploy/events{/privacy}","received_events_url":"https://api.github.com/users/OctopusDeploy/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/OctopusDeploy/Nevermore","description":"A JSON Document Store library for SQL Server","fork":false,"url":"https://api.github.com/repos/OctopusDeploy/Nevermore","forks_url":"https://api.github.com/repos/OctopusDeploy/Nevermore/forks","keys_url":"https://api.github.com/repos/OctopusDeploy/Nevermore/keys{/key_id}","collaborators_url":"https://api.github.com/repos/OctopusDeploy/Nevermore/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/OctopusDeploy/Nevermore/teams","hooks_url":"https://api.github.com/repos/OctopusDeploy/Nevermore/hooks","issue_events_url":"https://api.github.com/repos/OctopusDeploy/Nevermore/issues/events{/number}","events_url":"https://api.github.com/repos/OctopusDeploy/Nevermore/events","assignees_url":"https://api.github.com/repos/OctopusDeploy/Nevermore/assignees{/user}","branches_url":"https://api.github.com/repos/OctopusDeploy/Nevermore/branches{/branch}","tags_url":"https://api.github.com/repos/OctopusDeploy/Nevermore/tags","blobs_url":"https://api.github.com/repos/OctopusDeploy/Nevermore/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/OctopusDeploy/Nevermore/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/OctopusDeploy/Nevermore/git/refs{/sha}","trees_url":"https://api.github.com/repos/OctopusDeploy/Nevermore/git/trees{/sha}","statuses_url":"https://api.github.com/repos/OctopusDeploy/Nevermore/statuses/{sha}","languages_url":"https://api.github.com/repos/OctopusDeploy/Nevermore/languages","stargazers_url":"https://api.github.com/repos/OctopusDeploy/Nevermore/stargazers","contributors_url":"https://api.github.com/repos/OctopusDeploy/Nevermore/contributors","subscribers_url":"https://api.github.com/repos/OctopusDeploy/Nevermore/subscribers","subscription_url":"https://api.github.com/repos/OctopusDeploy/Nevermore/subscription","commits_url":"https://api.github.com/repos/OctopusDeploy/Nevermore/commits{/sha}","git_commits_url":"https://api.github.com/repos/OctopusDeploy/Nevermore/git/commits{/sha}","comments_url":"https://api.github.com/repos/OctopusDeploy/Nevermore/comments{/number}","issue_comment_url":"https://api.github.com/repos/OctopusDeploy/Nevermore/issues/comments{/number}","contents_url":"https://api.github.com/repos/OctopusDeploy/Nevermore/contents/{+path}","compare_url":"https://api.github.com/repos/OctopusDeploy/Nevermore/compare/{base}...{head}","merges_url":"https://api.github.com/repos/OctopusDeploy/Nevermore/merges","archive_url":"https://api.github.com/repos/OctopusDeploy/Nevermore/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/OctopusDeploy/Nevermore/downloads","issues_url":"https://api.github.com/repos/OctopusDeploy/Nevermore/issues{/number}","pulls_url":"https://api.github.com/repos/OctopusDeploy/Nevermore/pulls{/number}","milestones_url":"https://api.github.com/repos/OctopusDeploy/Nevermore/milestones{/number}","notifications_url":"https://api.github.com/repos/OctopusDeploy/Nevermore/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/OctopusDeploy/Nevermore/labels{/name}","releases_url":"https://api.github.com/repos/OctopusDeploy/Nevermore/releases{/id}","deployments_url":"https://api.github.com/repos/OctopusDeploy/Nevermore/deployments","created_at":"2015-06-19T04:27:01Z","updated_at":"2018-03-12T22:38:46Z","pushed_at":"2018-03-08T03:26:24Z","git_url":"git://github.com/OctopusDeploy/Nevermore.git","ssh_url":"git@github.com:OctopusDeploy/Nevermore.git","clone_url":"https://github.com/OctopusDeploy/Nevermore.git","svn_url":"https://github.com/OctopusDeploy/Nevermore","homepage":null,"size":906,"stargazers_count":21,"watchers_count":21,"language":"C#","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":3,"mirror_url":null,"archived":false,"open_issues_count":10,"license":{"key":"other","name":"Other","spdx_id":null,"url":null},"forks":3,"open_issues":10,"watchers":21,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/OctopusDeploy/Nevermore/pulls/39"},"html":{"href":"https://github.com/OctopusDeploy/Nevermore/pull/39"},"issue":{"href":"https://api.github.com/repos/OctopusDeploy/Nevermore/issues/39"},"comments":{"href":"https://api.github.com/repos/OctopusDeploy/Nevermore/issues/39/comments"},"review_comments":{"href":"https://api.github.com/repos/OctopusDeploy/Nevermore/pulls/39/comments"},"review_comment":{"href":"https://api.github.com/repos/OctopusDeploy/Nevermore/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/OctopusDeploy/Nevermore/pulls/39/commits"},"statuses":{"href":"https://api.github.com/repos/OctopusDeploy/Nevermore/statuses/a8fe4664cfa4c64c7be1693ed674edc5f22d4131"}},"author_association":"NONE"}}
{"actor":{"display_login":"TomPeters"}}