GitHub PullRequestReviewCommentEvent at 2014-06-10 12:21:28
Repository: modeshape
Actor: VadymKarko
Payload: {"action":"created","comment":{"url":"https://api.github.com/repos/ModeShape/modeshape/pulls/comments/13589959","id":13589959,"diff_hunk":"@@ -0,0 +1,191 @@\n+/*\n+ * ModeShape (http://www.modeshape.org)\n+ * See the COPYRIGHT.txt file distributed with this work for information\n+ * regarding copyright ownership.  Some portions may be licensed\n+ * to Red Hat, Inc. under one or more contributor license agreements.\n+ * See the AUTHORS.txt file in the distribution for a full listing of\n+ * individual contributors.\n+ *\n+ * ModeShape is free software. Unless otherwise indicated, all code in ModeShape\n+ * is licensed to you under the terms of the GNU Lesser General Public License as\n+ * published by the Free Software Foundation; either version 2.1 of\n+ * the License, or (at your option) any later version.\n+ *\n+ * ModeShape is distributed in the hope that it will be useful,\n+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\n+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n+ * Lesser General Public License for more details.\n+ *\n+ * You should have received a copy of the GNU Lesser General Public\n+ * License along with this software; if not, write to the Free\n+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA\n+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.\n+ */\n+package org.modeshape.jcr.query.process;\n+\n+import java.util.Collections;\n+import java.util.List;\n+import java.util.ArrayList;\n+import javax.jcr.query.qom.QueryObjectModelConstants;\n+import javax.jcr.query.qom.StaticOperand;\n+import org.modeshape.jcr.api.query.qom.Operator;\n+import org.modeshape.jcr.query.QueryResults;\n+import org.modeshape.jcr.query.model.Comparison;\n+import org.modeshape.jcr.query.model.Constraint;\n+import org.modeshape.jcr.query.model.Length;\n+import org.modeshape.jcr.query.model.Literal;\n+import org.modeshape.jcr.query.model.Not;\n+import org.modeshape.jcr.query.model.Or;\n+import org.modeshape.jcr.query.model.PropertyExistence;\n+import org.modeshape.jcr.query.model.PropertyValue;\n+import org.modeshape.jcr.query.model.SetCriteria;\n+\n+\n+/**\n+ * Helper class to avoid entering queries with empty strings into Lucene<br/>\n+ * See issue <a href=\"https://issues.jboss.org/browse/MODE-2174\">MODE-2174</a>\n+ * @author: vadym.karko\n+ * @since: 3/31/14 1:47 PM\n+ */\n+public class LuceneQueryDistributor {\n+    /**\n+     * Define places in query according to position in query\n+     * <table>\n+     *     <tr><td><b>EQUALS</b></td><td><code>SELECT &#8230 WHERE x = ''</code></td></tr>\n+     *     <tr><td><b>NULL</b></td><td><code>SELECT &#8230 WHERE x IS NULL</code></td></tr>\n+     *     <tr><td><b>LENGTH</b></td><td><code>SELECT &#8230 WHERE LENGTH(x) = 0</code></td></tr>\n+     *     <tr><td><b>IN</b></td><td><code>SELECT &#8230 WHERE x IN (&#8230, '', &#8230)</code></td></tr>\n+     *     <tr><td><b>OR</b></td><td><code>SELECT &#8230 WHERE x = '' OR &#8230</code></td></tr>\n+     *     <tr><td><b>NOWHERE</b></td><td> none of mentioned above</td></tr>\n+     * </table>\n+     */\n+    private enum ContainsEmpty {EQUALS, NULL, LENGTH, IN, OR, NOWHERE}\n+\n+    private final List<Constraint> luceneConstraints;\n+    private final List<Constraint> postConstraints;\n+    private final QueryResults.Columns columns;\n+\n+\n+    public LuceneQueryDistributor(QueryResults.Columns columns) {\n+        this.columns = columns;\n+        luceneConstraints = new ArrayList<Constraint>();\n+        postConstraints = new ArrayList<Constraint>();\n+    }\n+\n+    /**\n+     * Distributes constraint directly in Lucene or post process.<br/>\n+     * Add constraint in prepared constraints (<code>luceneConstraints</code>) if it has no empty strings,\n+     * otherwise in post processing constraints (<code>postConstraints</code>)\n+     * @param constraint constraint that should be distributed\n+     */\n+    public void distribute(Constraint constraint) {\n+        switch (isQueryContainsEmpty(constraint)) {\n+            case EQUALS:    // ... WHERE x = ''\n+            case NULL:      // ... WHERE x IS NULL\n+            case IN:        // ... WHERE x IN ('')\n+            case OR:        // ... OR ...\n+                postConstraints.add(constraint);\n+            break;\n+\n+            case LENGTH:\n+                Operator operator = ((Comparison) constraint).operator();\n+                Length length = (Length)((Comparison) constraint).getOperand1();\n+\n+                switch (operator) {\n+                    // ... WHERE LENGTH(x) = 0  <=> ... WHERE x = ''\n+                    case EQUAL_TO:\n+                        Constraint emptyString = new Comparison(\n+                                new PropertyValue(length.selectorName(), length.getPropertyValue().getPropertyName()),\n+                                Operator.EQUAL_TO,\n+                                new Literal(\"\")\n+                        );\n+\n+                        postConstraints.add(emptyString);\n+                    break;\n+\n+                    // ... WHERE LENGTH(x) >= 0  <=> ... WHERE x IS NOT NULL\n+                    case GREATER_THAN_OR_EQUAL_TO:\n+                        PropertyExistence existence = new PropertyExistence(\n+                                length.selectorName(),\n+                                length.getPropertyValue().getPropertyName()\n+                        );\n+\n+                        postConstraints.add(existence);\n+                    break;\n+\n+                    default: postConstraints.add(constraint); break;\n+                }\n+            break;\n+\n+            default: luceneConstraints.add(constraint); break;\n+        }\n+    }\n+\n+\n+    /**\n+     * Checks if query has empty string, and if so, where exactly in query\n+     * @param constraint constraint that should be checked\n+     * @return {@link ContainsEmpty#NOWHERE} if empty string not found\n+     * @see ContainsEmpty\n+     */\n+    private ContainsEmpty isQueryContainsEmpty(Constraint constraint) {\n+        if (constraint instanceof Comparison) {\n+            Comparison comparison = (Comparison)constraint;\n+            String value = comparison.getOperand2().toString();\n+\n+            // ... WHERE x = ''\n+            if (\"''\".equals(value)) return ContainsEmpty.EQUALS;\n+\n+            // ... WHERE LENGTH(x) = 0\n+            if ((QueryObjectModelConstants.JCR_OPERATOR_EQUAL_TO.equals(comparison.getOperator()) ||\n+                 QueryObjectModelConstants.JCR_OPERATOR_GREATER_THAN.equals(comparison.getOperator()) ||\n+                 QueryObjectModelConstants.JCR_OPERATOR_GREATER_THAN_OR_EQUAL_TO.equals(comparison.getOperator())) &&\n+                \"CAST('0' AS LONG)\".equals(value)) return ContainsEmpty.LENGTH;\n+        }\n+        // ... WHERE x IS NOT NULL\n+        else if (constraint instanceof Not) {\n+            Not not = (Not)constraint;\n+\n+            return isQueryContainsEmpty(not.getConstraint());","path":"modeshape-jcr/src/main/java/org/modeshape/jcr/query/process/LuceneQueryDistributor.java","position":149,"original_position":149,"commit_id":"5ccfe095b415ecf8eb584e82652315d2e21e961e","original_commit_id":"5ccfe095b415ecf8eb584e82652315d2e21e961e","user":{"login":"VadymKarko","id":4687703,"avatar_url":"https://avatars.githubusercontent.com/u/4687703?","gravatar_id":"247a32f01448da17fd0d7ef18352f49f","url":"https://api.github.com/users/VadymKarko","html_url":"https://github.com/VadymKarko","followers_url":"https://api.github.com/users/VadymKarko/followers","following_url":"https://api.github.com/users/VadymKarko/following{/other_user}","gists_url":"https://api.github.com/users/VadymKarko/gists{/gist_id}","starred_url":"https://api.github.com/users/VadymKarko/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/VadymKarko/subscriptions","organizations_url":"https://api.github.com/users/VadymKarko/orgs","repos_url":"https://api.github.com/users/VadymKarko/repos","events_url":"https://api.github.com/users/VadymKarko/events{/privacy}","received_events_url":"https://api.github.com/users/VadymKarko/received_events","type":"User","site_admin":false},"body":"When query like ```... WHERE x IS NULL``` is used, it transforms to constraint like ```NOT(x IS NOT NULL)``` which is an instance of ```Not``` with included ```PropertyExistance```. So, we can simply retrieve this included property existance constraint ```x IS NOT NULL``` and check if it has empty or null string value, by recursively calling ```isQueryContainsEmpty(...)``` with this retrieved constraint as an argument.","created_at":"2014-06-10T12:21:28Z","updated_at":"2014-06-10T12:21:28Z","html_url":"https://github.com/ModeShape/modeshape/pull/1134#discussion_r13589959","pull_request_url":"https://api.github.com/repos/ModeShape/modeshape/pulls/1134","_links":{"self":{"href":"https://api.github.com/repos/ModeShape/modeshape/pulls/comments/13589959"},"html":{"href":"https://github.com/ModeShape/modeshape/pull/1134#discussion_r13589959"},"pull_request":{"href":"https://api.github.com/repos/ModeShape/modeshape/pulls/1134"}}},"pull_request":{"url":"https://api.github.com/repos/ModeShape/modeshape/pulls/1134","id":16317295,"html_url":"https://github.com/ModeShape/modeshape/pull/1134","diff_url":"https://github.com/ModeShape/modeshape/pull/1134.diff","patch_url":"https://github.com/ModeShape/modeshape/pull/1134.patch","issue_url":"https://api.github.com/repos/ModeShape/modeshape/issues/1134","number":1134,"state":"open","title":"MODE-2174 JCR Query empty string in comparison","user":{"login":"VadymKarko","id":4687703,"avatar_url":"https://avatars.githubusercontent.com/u/4687703?","gravatar_id":"247a32f01448da17fd0d7ef18352f49f","url":"https://api.github.com/users/VadymKarko","html_url":"https://github.com/VadymKarko","followers_url":"https://api.github.com/users/VadymKarko/followers","following_url":"https://api.github.com/users/VadymKarko/following{/other_user}","gists_url":"https://api.github.com/users/VadymKarko/gists{/gist_id}","starred_url":"https://api.github.com/users/VadymKarko/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/VadymKarko/subscriptions","organizations_url":"https://api.github.com/users/VadymKarko/orgs","repos_url":"https://api.github.com/users/VadymKarko/repos","events_url":"https://api.github.com/users/VadymKarko/events{/privacy}","received_events_url":"https://api.github.com/users/VadymKarko/received_events","type":"User","site_admin":false},"body":"This is a fix solution of a bug [MODE-2174](https://issues.jboss.org/browse/MODE-2174) \"JCR Query in Modeshape returns no result when empty string used in comparison\" for ModeShape **3.7.x** version.\r\n\r\nThis approach is based on using Lucene post processing constraints. Every query is checked for presence of empty string constraint (see class ```LuceneQueryDistributor```) and if so, then push this constraint into post processing.","created_at":"2014-05-25T20:49:39Z","updated_at":"2014-06-10T12:21:28Z","closed_at":null,"merged_at":null,"merge_commit_sha":"41eb75fe952ac2f4c61c72095fc588bc70a44bb7","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/ModeShape/modeshape/pulls/1134/commits","review_comments_url":"https://api.github.com/repos/ModeShape/modeshape/pulls/1134/comments","review_comment_url":"https://api.github.com/repos/ModeShape/modeshape/pulls/comments/{number}","comments_url":"https://api.github.com/repos/ModeShape/modeshape/issues/1134/comments","statuses_url":"https://api.github.com/repos/ModeShape/modeshape/statuses/5ccfe095b415ecf8eb584e82652315d2e21e961e","head":{"label":"VadymKarko:3.x","ref":"3.x","sha":"5ccfe095b415ecf8eb584e82652315d2e21e961e","user":{"login":"VadymKarko","id":4687703,"avatar_url":"https://avatars.githubusercontent.com/u/4687703?","gravatar_id":"247a32f01448da17fd0d7ef18352f49f","url":"https://api.github.com/users/VadymKarko","html_url":"https://github.com/VadymKarko","followers_url":"https://api.github.com/users/VadymKarko/followers","following_url":"https://api.github.com/users/VadymKarko/following{/other_user}","gists_url":"https://api.github.com/users/VadymKarko/gists{/gist_id}","starred_url":"https://api.github.com/users/VadymKarko/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/VadymKarko/subscriptions","organizations_url":"https://api.github.com/users/VadymKarko/orgs","repos_url":"https://api.github.com/users/VadymKarko/repos","events_url":"https://api.github.com/users/VadymKarko/events{/privacy}","received_events_url":"https://api.github.com/users/VadymKarko/received_events","type":"User","site_admin":false},"repo":{"id":13387347,"name":"modeshape","full_name":"VadymKarko/modeshape","owner":{"login":"VadymKarko","id":4687703,"avatar_url":"https://avatars.githubusercontent.com/u/4687703?","gravatar_id":"247a32f01448da17fd0d7ef18352f49f","url":"https://api.github.com/users/VadymKarko","html_url":"https://github.com/VadymKarko","followers_url":"https://api.github.com/users/VadymKarko/followers","following_url":"https://api.github.com/users/VadymKarko/following{/other_user}","gists_url":"https://api.github.com/users/VadymKarko/gists{/gist_id}","starred_url":"https://api.github.com/users/VadymKarko/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/VadymKarko/subscriptions","organizations_url":"https://api.github.com/users/VadymKarko/orgs","repos_url":"https://api.github.com/users/VadymKarko/repos","events_url":"https://api.github.com/users/VadymKarko/events{/privacy}","received_events_url":"https://api.github.com/users/VadymKarko/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/VadymKarko/modeshape","description":"ModeShape is a distributed, hierarchical, transactional, and consistent data store with support for queries, full-text search, events, versioning, references, and flexible and dynamic schemas. It is very fast, highly available, extremely scalable, and it is 100% open source and written in Java. Clients use the JSR-283 standard Java API for content repositories (aka, JCR) or ModeShape's REST API, and can query content through JDBC and SQL.","fork":true,"url":"https://api.github.com/repos/VadymKarko/modeshape","forks_url":"https://api.github.com/repos/VadymKarko/modeshape/forks","keys_url":"https://api.github.com/repos/VadymKarko/modeshape/keys{/key_id}","collaborators_url":"https://api.github.com/repos/VadymKarko/modeshape/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/VadymKarko/modeshape/teams","hooks_url":"https://api.github.com/repos/VadymKarko/modeshape/hooks","issue_events_url":"https://api.github.com/repos/VadymKarko/modeshape/issues/events{/number}","events_url":"https://api.github.com/repos/VadymKarko/modeshape/events","assignees_url":"https://api.github.com/repos/VadymKarko/modeshape/assignees{/user}","branches_url":"https://api.github.com/repos/VadymKarko/modeshape/branches{/branch}","tags_url":"https://api.github.com/repos/VadymKarko/modeshape/tags","blobs_url":"https://api.github.com/repos/VadymKarko/modeshape/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/VadymKarko/modeshape/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/VadymKarko/modeshape/git/refs{/sha}","trees_url":"https://api.github.com/repos/VadymKarko/modeshape/git/trees{/sha}","statuses_url":"https://api.github.com/repos/VadymKarko/modeshape/statuses/{sha}","languages_url":"https://api.github.com/repos/VadymKarko/modeshape/languages","stargazers_url":"https://api.github.com/repos/VadymKarko/modeshape/stargazers","contributors_url":"https://api.github.com/repos/VadymKarko/modeshape/contributors","subscribers_url":"https://api.github.com/repos/VadymKarko/modeshape/subscribers","subscription_url":"https://api.github.com/repos/VadymKarko/modeshape/subscription","commits_url":"https://api.github.com/repos/VadymKarko/modeshape/commits{/sha}","git_commits_url":"https://api.github.com/repos/VadymKarko/modeshape/git/commits{/sha}","comments_url":"https://api.github.com/repos/VadymKarko/modeshape/comments{/number}","issue_comment_url":"https://api.github.com/repos/VadymKarko/modeshape/issues/comments/{number}","contents_url":"https://api.github.com/repos/VadymKarko/modeshape/contents/{+path}","compare_url":"https://api.github.com/repos/VadymKarko/modeshape/compare/{base}...{head}","merges_url":"https://api.github.com/repos/VadymKarko/modeshape/merges","archive_url":"https://api.github.com/repos/VadymKarko/modeshape/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/VadymKarko/modeshape/downloads","issues_url":"https://api.github.com/repos/VadymKarko/modeshape/issues{/number}","pulls_url":"https://api.github.com/repos/VadymKarko/modeshape/pulls{/number}","milestones_url":"https://api.github.com/repos/VadymKarko/modeshape/milestones{/number}","notifications_url":"https://api.github.com/repos/VadymKarko/modeshape/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/VadymKarko/modeshape/labels{/name}","releases_url":"https://api.github.com/repos/VadymKarko/modeshape/releases{/id}","created_at":"2013-10-07T15:20:48Z","updated_at":"2014-05-25T21:02:22Z","pushed_at":"2014-05-25T20:45:32Z","git_url":"git://github.com/VadymKarko/modeshape.git","ssh_url":"git@github.com:VadymKarko/modeshape.git","clone_url":"https://github.com/VadymKarko/modeshape.git","svn_url":"https://github.com/VadymKarko/modeshape","homepage":"http://www.modeshape.org","size":112579,"stargazers_count":0,"watchers_count":0,"language":"Java","has_issues":false,"has_downloads":true,"has_wiki":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"ModeShape:3.x","ref":"3.x","sha":"92b4744203987b5cf5b52cfab026bfe458843287","user":{"login":"ModeShape","id":148023,"avatar_url":"https://avatars.githubusercontent.com/u/148023?","gravatar_id":"6cd2b842d5c01ad07b0015d5fc7694f3","url":"https://api.github.com/users/ModeShape","html_url":"https://github.com/ModeShape","followers_url":"https://api.github.com/users/ModeShape/followers","following_url":"https://api.github.com/users/ModeShape/following{/other_user}","gists_url":"https://api.github.com/users/ModeShape/gists{/gist_id}","starred_url":"https://api.github.com/users/ModeShape/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ModeShape/subscriptions","organizations_url":"https://api.github.com/users/ModeShape/orgs","repos_url":"https://api.github.com/users/ModeShape/repos","events_url":"https://api.github.com/users/ModeShape/events{/privacy}","received_events_url":"https://api.github.com/users/ModeShape/received_events","type":"Organization","site_admin":false},"repo":{"id":1244027,"name":"modeshape","full_name":"ModeShape/modeshape","owner":{"login":"ModeShape","id":148023,"avatar_url":"https://avatars.githubusercontent.com/u/148023?","gravatar_id":"6cd2b842d5c01ad07b0015d5fc7694f3","url":"https://api.github.com/users/ModeShape","html_url":"https://github.com/ModeShape","followers_url":"https://api.github.com/users/ModeShape/followers","following_url":"https://api.github.com/users/ModeShape/following{/other_user}","gists_url":"https://api.github.com/users/ModeShape/gists{/gist_id}","starred_url":"https://api.github.com/users/ModeShape/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ModeShape/subscriptions","organizations_url":"https://api.github.com/users/ModeShape/orgs","repos_url":"https://api.github.com/users/ModeShape/repos","events_url":"https://api.github.com/users/ModeShape/events{/privacy}","received_events_url":"https://api.github.com/users/ModeShape/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/ModeShape/modeshape","description":"ModeShape is a distributed, hierarchical, transactional, and consistent data store with support for queries, full-text search, events, versioning, references, and flexible and dynamic schemas. It is very fast, highly available, extremely scalable, and it is 100% open source and written in Java. Clients use the JSR-283 standard Java API for content repositories (aka, JCR) or ModeShape's REST API, and can query content through JDBC and SQL.","fork":false,"url":"https://api.github.com/repos/ModeShape/modeshape","forks_url":"https://api.github.com/repos/ModeShape/modeshape/forks","keys_url":"https://api.github.com/repos/ModeShape/modeshape/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ModeShape/modeshape/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ModeShape/modeshape/teams","hooks_url":"https://api.github.com/repos/ModeShape/modeshape/hooks","issue_events_url":"https://api.github.com/repos/ModeShape/modeshape/issues/events{/number}","events_url":"https://api.github.com/repos/ModeShape/modeshape/events","assignees_url":"https://api.github.com/repos/ModeShape/modeshape/assignees{/user}","branches_url":"https://api.github.com/repos/ModeShape/modeshape/branches{/branch}","tags_url":"https://api.github.com/repos/ModeShape/modeshape/tags","blobs_url":"https://api.github.com/repos/ModeShape/modeshape/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ModeShape/modeshape/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ModeShape/modeshape/git/refs{/sha}","trees_url":"https://api.github.com/repos/ModeShape/modeshape/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ModeShape/modeshape/statuses/{sha}","languages_url":"https://api.github.com/repos/ModeShape/modeshape/languages","stargazers_url":"https://api.github.com/repos/ModeShape/modeshape/stargazers","contributors_url":"https://api.github.com/repos/ModeShape/modeshape/contributors","subscribers_url":"https://api.github.com/repos/ModeShape/modeshape/subscribers","subscription_url":"https://api.github.com/repos/ModeShape/modeshape/subscription","commits_url":"https://api.github.com/repos/ModeShape/modeshape/commits{/sha}","git_commits_url":"https://api.github.com/repos/ModeShape/modeshape/git/commits{/sha}","comments_url":"https://api.github.com/repos/ModeShape/modeshape/comments{/number}","issue_comment_url":"https://api.github.com/repos/ModeShape/modeshape/issues/comments/{number}","contents_url":"https://api.github.com/repos/ModeShape/modeshape/contents/{+path}","compare_url":"https://api.github.com/repos/ModeShape/modeshape/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ModeShape/modeshape/merges","archive_url":"https://api.github.com/repos/ModeShape/modeshape/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ModeShape/modeshape/downloads","issues_url":"https://api.github.com/repos/ModeShape/modeshape/issues{/number}","pulls_url":"https://api.github.com/repos/ModeShape/modeshape/pulls{/number}","milestones_url":"https://api.github.com/repos/ModeShape/modeshape/milestones{/number}","notifications_url":"https://api.github.com/repos/ModeShape/modeshape/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ModeShape/modeshape/labels{/name}","releases_url":"https://api.github.com/repos/ModeShape/modeshape/releases{/id}","created_at":"2011-01-12T02:30:46Z","updated_at":"2014-06-09T14:49:22Z","pushed_at":"2014-06-09T14:49:22Z","git_url":"git://github.com/ModeShape/modeshape.git","ssh_url":"git@github.com:ModeShape/modeshape.git","clone_url":"https://github.com/ModeShape/modeshape.git","svn_url":"https://github.com/ModeShape/modeshape","homepage":"http://www.modeshape.org","size":141769,"stargazers_count":110,"watchers_count":110,"language":"Java","has_issues":false,"has_downloads":true,"has_wiki":false,"forks_count":116,"mirror_url":null,"open_issues_count":4,"forks":116,"open_issues":4,"watchers":110,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/ModeShape/modeshape/pulls/1134"},"html":{"href":"https://github.com/ModeShape/modeshape/pull/1134"},"issue":{"href":"https://api.github.com/repos/ModeShape/modeshape/issues/1134"},"comments":{"href":"https://api.github.com/repos/ModeShape/modeshape/issues/1134/comments"},"review_comments":{"href":"https://api.github.com/repos/ModeShape/modeshape/pulls/1134/comments"},"review_comment":{"href":"https://api.github.com/repos/ModeShape/modeshape/pulls/comments/{number}"},"commits":{"href":"https://api.github.com/repos/ModeShape/modeshape/pulls/1134/commits"},"statuses":{"href":"https://api.github.com/repos/ModeShape/modeshape/statuses/5ccfe095b415ecf8eb584e82652315d2e21e961e"}}}}