{"action":"created","comment":{"url":"https://api.github.com/repos/icgc-dcc/dcc-portal/pulls/comments/74457338","id":74457338,"diff_hunk":"@@ -115,28 +120,55 @@ public String convertFilters(JqlFilters filters, Type indexType) {\n     }\n \n     // These fields are required to create the correct nesting order. E.g. nested(gene, nested(gene.ssm ...))\n-    val fieldsGrouppedByNestedPath = ArrayListMultimap.<String, JqlField> create();\n+    val fieldsGroupedByNestedPath = groupFields(filters, indexType, IS);\n+    val notFieldsGroupedByNestedPath = groupFields(filters, indexType, NOT);\n+\n+    val groupedFilters = getGroupedFilters(fieldsGroupedByNestedPath, indexType, false);\n+    val notFilters = getGroupedFilters(notFieldsGroupedByNestedPath, indexType, true);\n+\n+    return Stream.concat(groupedFilters.values().stream(), notFilters.values().stream()).collect(joining(\",\"));\n+  }\n+\n+  private ListMultimap<String, JqlField> groupFields(JqlFilters filters, Type indexType, Operation operation) {\n+    val groupedByNestedPath = ArrayListMultimap.<String, JqlField> create();\n \n-    // filterKind is 'donor' in a filter {donor:{id:{is:'DO1'}}}\n     for (val entry : filters.getKindValues().entrySet()) {\n-      val fieldsByNestedPath = groupFieldsByNestedPath(entry.getKey(), entry.getValue(), indexType);\n-      fieldsGrouppedByNestedPath.putAll(fieldsByNestedPath);\n+      // This guy needs to be mutable because groupFieldsByNestedPath method mutates it.\n+      List<JqlField> values = entry.getValue().stream()\n+          .filter(f -> f.getOperation() == operation)\n+          .map(f -> operation == NOT ? new JqlField(f.getName(), IS, f.getValue(), f.getPrefix()) : f)\n+          .collect(toList());\n+      if (values.size() > 0) {\n+        val fieldsByNestedPath = groupFieldsByNestedPath(entry.getKey(), values, indexType);\n+        groupedByNestedPath.putAll(fieldsByNestedPath);\n+      }\n+    }\n+\n+    return groupedByNestedPath;\n+  }\n+\n+  private Map<String, String> getGroupedFilters(ListMultimap<String, JqlField> fieldsGroupedByNestedPath,\n+      Type indexType, boolean notFilter) {\n+    Map<String, String> groupedFilters = new HashMap<>();","path":"dcc-portal-server/src/main/java/org/icgc/dcc/portal/server/pql/convert/FiltersConverter.java","position":64,"original_position":64,"commit_id":"1870aa4e56b1fc07caee384116ca9c31a8f967bf","original_commit_id":"1870aa4e56b1fc07caee384116ca9c31a8f967bf","user":{"login":"btiernay","id":2717578,"avatar_url":"https://avatars.githubusercontent.com/u/2717578?v=3","gravatar_id":"","url":"https://api.github.com/users/btiernay","html_url":"https://github.com/btiernay","followers_url":"https://api.github.com/users/btiernay/followers","following_url":"https://api.github.com/users/btiernay/following{/other_user}","gists_url":"https://api.github.com/users/btiernay/gists{/gist_id}","starred_url":"https://api.github.com/users/btiernay/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/btiernay/subscriptions","organizations_url":"https://api.github.com/users/btiernay/orgs","repos_url":"https://api.github.com/users/btiernay/repos","events_url":"https://api.github.com/users/btiernay/events{/privacy}","received_events_url":"https://api.github.com/users/btiernay/received_events","type":"User","site_admin":false},"body":"`val groupedFilters = Maps.<String, String>newHashMap();` is preferred.","created_at":"2016-08-11T16:37:46Z","updated_at":"2016-08-11T16:37:46Z","html_url":"https://github.com/icgc-dcc/dcc-portal/pull/77#discussion_r74457338","pull_request_url":"https://api.github.com/repos/icgc-dcc/dcc-portal/pulls/77","_links":{"self":{"href":"https://api.github.com/repos/icgc-dcc/dcc-portal/pulls/comments/74457338"},"html":{"href":"https://github.com/icgc-dcc/dcc-portal/pull/77#discussion_r74457338"},"pull_request":{"href":"https://api.github.com/repos/icgc-dcc/dcc-portal/pulls/77"}}},"pull_request":{"url":"https://api.github.com/repos/icgc-dcc/dcc-portal/pulls/77","id":80975227,"html_url":"https://github.com/icgc-dcc/dcc-portal/pull/77","diff_url":"https://github.com/icgc-dcc/dcc-portal/pull/77.diff","patch_url":"https://github.com/icgc-dcc/dcc-portal/pull/77.patch","issue_url":"https://api.github.com/repos/icgc-dcc/dcc-portal/issues/77","number":77,"state":"open","locked":false,"title":"Feature/dcc 5113 not query donors","user":{"login":"andricDu","id":6350043,"avatar_url":"https://avatars.githubusercontent.com/u/6350043?v=3","gravatar_id":"","url":"https://api.github.com/users/andricDu","html_url":"https://github.com/andricDu","followers_url":"https://api.github.com/users/andricDu/followers","following_url":"https://api.github.com/users/andricDu/following{/other_user}","gists_url":"https://api.github.com/users/andricDu/gists{/gist_id}","starred_url":"https://api.github.com/users/andricDu/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/andricDu/subscriptions","organizations_url":"https://api.github.com/users/andricDu/orgs","repos_url":"https://api.github.com/users/andricDu/repos","events_url":"https://api.github.com/users/andricDu/events{/privacy}","received_events_url":"https://api.github.com/users/andricDu/received_events","type":"User","site_admin":false},"body":"This is a fix/enhancement for queries that feature negated terms on their nested documents.\r\n\r\nThis PR enhances the functionality of the ES AST visitor logic, as well as modifies the JQL to PQL conversion to produce a PQL query that correctly nests the nested query under a not node.  ","created_at":"2016-08-11T15:11:48Z","updated_at":"2016-08-11T16:37:46Z","closed_at":null,"merged_at":null,"merge_commit_sha":"41d93c2861815b2522c52543c75ab459c9bc453a","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/icgc-dcc/dcc-portal/pulls/77/commits","review_comments_url":"https://api.github.com/repos/icgc-dcc/dcc-portal/pulls/77/comments","review_comment_url":"https://api.github.com/repos/icgc-dcc/dcc-portal/pulls/comments{/number}","comments_url":"https://api.github.com/repos/icgc-dcc/dcc-portal/issues/77/comments","statuses_url":"https://api.github.com/repos/icgc-dcc/dcc-portal/statuses/1870aa4e56b1fc07caee384116ca9c31a8f967bf","head":{"label":"icgc-dcc:feature/DCC-5113-not-query-donors","ref":"feature/DCC-5113-not-query-donors","sha":"1870aa4e56b1fc07caee384116ca9c31a8f967bf","user":{"login":"icgc-dcc","id":1508638,"avatar_url":"https://avatars.githubusercontent.com/u/1508638?v=3","gravatar_id":"","url":"https://api.github.com/users/icgc-dcc","html_url":"https://github.com/icgc-dcc","followers_url":"https://api.github.com/users/icgc-dcc/followers","following_url":"https://api.github.com/users/icgc-dcc/following{/other_user}","gists_url":"https://api.github.com/users/icgc-dcc/gists{/gist_id}","starred_url":"https://api.github.com/users/icgc-dcc/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/icgc-dcc/subscriptions","organizations_url":"https://api.github.com/users/icgc-dcc/orgs","repos_url":"https://api.github.com/users/icgc-dcc/repos","events_url":"https://api.github.com/users/icgc-dcc/events{/privacy}","received_events_url":"https://api.github.com/users/icgc-dcc/received_events","type":"Organization","site_admin":false},"repo":{"id":62242110,"name":"dcc-portal","full_name":"icgc-dcc/dcc-portal","owner":{"login":"icgc-dcc","id":1508638,"avatar_url":"https://avatars.githubusercontent.com/u/1508638?v=3","gravatar_id":"","url":"https://api.github.com/users/icgc-dcc","html_url":"https://github.com/icgc-dcc","followers_url":"https://api.github.com/users/icgc-dcc/followers","following_url":"https://api.github.com/users/icgc-dcc/following{/other_user}","gists_url":"https://api.github.com/users/icgc-dcc/gists{/gist_id}","starred_url":"https://api.github.com/users/icgc-dcc/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/icgc-dcc/subscriptions","organizations_url":"https://api.github.com/users/icgc-dcc/orgs","repos_url":"https://api.github.com/users/icgc-dcc/repos","events_url":"https://api.github.com/users/icgc-dcc/events{/privacy}","received_events_url":"https://api.github.com/users/icgc-dcc/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/icgc-dcc/dcc-portal","description":"Data portal for exploring and accessing data","fork":false,"url":"https://api.github.com/repos/icgc-dcc/dcc-portal","forks_url":"https://api.github.com/repos/icgc-dcc/dcc-portal/forks","keys_url":"https://api.github.com/repos/icgc-dcc/dcc-portal/keys{/key_id}","collaborators_url":"https://api.github.com/repos/icgc-dcc/dcc-portal/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/icgc-dcc/dcc-portal/teams","hooks_url":"https://api.github.com/repos/icgc-dcc/dcc-portal/hooks","issue_events_url":"https://api.github.com/repos/icgc-dcc/dcc-portal/issues/events{/number}","events_url":"https://api.github.com/repos/icgc-dcc/dcc-portal/events","assignees_url":"https://api.github.com/repos/icgc-dcc/dcc-portal/assignees{/user}","branches_url":"https://api.github.com/repos/icgc-dcc/dcc-portal/branches{/branch}","tags_url":"https://api.github.com/repos/icgc-dcc/dcc-portal/tags","blobs_url":"https://api.github.com/repos/icgc-dcc/dcc-portal/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/icgc-dcc/dcc-portal/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/icgc-dcc/dcc-portal/git/refs{/sha}","trees_url":"https://api.github.com/repos/icgc-dcc/dcc-portal/git/trees{/sha}","statuses_url":"https://api.github.com/repos/icgc-dcc/dcc-portal/statuses/{sha}","languages_url":"https://api.github.com/repos/icgc-dcc/dcc-portal/languages","stargazers_url":"https://api.github.com/repos/icgc-dcc/dcc-portal/stargazers","contributors_url":"https://api.github.com/repos/icgc-dcc/dcc-portal/contributors","subscribers_url":"https://api.github.com/repos/icgc-dcc/dcc-portal/subscribers","subscription_url":"https://api.github.com/repos/icgc-dcc/dcc-portal/subscription","commits_url":"https://api.github.com/repos/icgc-dcc/dcc-portal/commits{/sha}","git_commits_url":"https://api.github.com/repos/icgc-dcc/dcc-portal/git/commits{/sha}","comments_url":"https://api.github.com/repos/icgc-dcc/dcc-portal/comments{/number}","issue_comment_url":"https://api.github.com/repos/icgc-dcc/dcc-portal/issues/comments{/number}","contents_url":"https://api.github.com/repos/icgc-dcc/dcc-portal/contents/{+path}","compare_url":"https://api.github.com/repos/icgc-dcc/dcc-portal/compare/{base}...{head}","merges_url":"https://api.github.com/repos/icgc-dcc/dcc-portal/merges","archive_url":"https://api.github.com/repos/icgc-dcc/dcc-portal/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/icgc-dcc/dcc-portal/downloads","issues_url":"https://api.github.com/repos/icgc-dcc/dcc-portal/issues{/number}","pulls_url":"https://api.github.com/repos/icgc-dcc/dcc-portal/pulls{/number}","milestones_url":"https://api.github.com/repos/icgc-dcc/dcc-portal/milestones{/number}","notifications_url":"https://api.github.com/repos/icgc-dcc/dcc-portal/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/icgc-dcc/dcc-portal/labels{/name}","releases_url":"https://api.github.com/repos/icgc-dcc/dcc-portal/releases{/id}","deployments_url":"https://api.github.com/repos/icgc-dcc/dcc-portal/deployments","created_at":"2016-06-29T16:44:10Z","updated_at":"2016-07-18T13:55:22Z","pushed_at":"2016-08-11T16:16:10Z","git_url":"git://github.com/icgc-dcc/dcc-portal.git","ssh_url":"git@github.com:icgc-dcc/dcc-portal.git","clone_url":"https://github.com/icgc-dcc/dcc-portal.git","svn_url":"https://github.com/icgc-dcc/dcc-portal","homepage":"https://dcc.icgc.org/","size":11825,"stargazers_count":3,"watchers_count":3,"language":"JavaScript","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":1,"mirror_url":null,"open_issues_count":2,"forks":1,"open_issues":2,"watchers":3,"default_branch":"develop"}},"base":{"label":"icgc-dcc:develop","ref":"develop","sha":"5881b722264df68cb50c6f32499dd48542dd34d2","user":{"login":"icgc-dcc","id":1508638,"avatar_url":"https://avatars.githubusercontent.com/u/1508638?v=3","gravatar_id":"","url":"https://api.github.com/users/icgc-dcc","html_url":"https://github.com/icgc-dcc","followers_url":"https://api.github.com/users/icgc-dcc/followers","following_url":"https://api.github.com/users/icgc-dcc/following{/other_user}","gists_url":"https://api.github.com/users/icgc-dcc/gists{/gist_id}","starred_url":"https://api.github.com/users/icgc-dcc/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/icgc-dcc/subscriptions","organizations_url":"https://api.github.com/users/icgc-dcc/orgs","repos_url":"https://api.github.com/users/icgc-dcc/repos","events_url":"https://api.github.com/users/icgc-dcc/events{/privacy}","received_events_url":"https://api.github.com/users/icgc-dcc/received_events","type":"Organization","site_admin":false},"repo":{"id":62242110,"name":"dcc-portal","full_name":"icgc-dcc/dcc-portal","owner":{"login":"icgc-dcc","id":1508638,"avatar_url":"https://avatars.githubusercontent.com/u/1508638?v=3","gravatar_id":"","url":"https://api.github.com/users/icgc-dcc","html_url":"https://github.com/icgc-dcc","followers_url":"https://api.github.com/users/icgc-dcc/followers","following_url":"https://api.github.com/users/icgc-dcc/following{/other_user}","gists_url":"https://api.github.com/users/icgc-dcc/gists{/gist_id}","starred_url":"https://api.github.com/users/icgc-dcc/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/icgc-dcc/subscriptions","organizations_url":"https://api.github.com/users/icgc-dcc/orgs","repos_url":"https://api.github.com/users/icgc-dcc/repos","events_url":"https://api.github.com/users/icgc-dcc/events{/privacy}","received_events_url":"https://api.github.com/users/icgc-dcc/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/icgc-dcc/dcc-portal","description":"Data portal for exploring and accessing data","fork":false,"url":"https://api.github.com/repos/icgc-dcc/dcc-portal","forks_url":"https://api.github.com/repos/icgc-dcc/dcc-portal/forks","keys_url":"https://api.github.com/repos/icgc-dcc/dcc-portal/keys{/key_id}","collaborators_url":"https://api.github.com/repos/icgc-dcc/dcc-portal/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/icgc-dcc/dcc-portal/teams","hooks_url":"https://api.github.com/repos/icgc-dcc/dcc-portal/hooks","issue_events_url":"https://api.github.com/repos/icgc-dcc/dcc-portal/issues/events{/number}","events_url":"https://api.github.com/repos/icgc-dcc/dcc-portal/events","assignees_url":"https://api.github.com/repos/icgc-dcc/dcc-portal/assignees{/user}","branches_url":"https://api.github.com/repos/icgc-dcc/dcc-portal/branches{/branch}","tags_url":"https://api.github.com/repos/icgc-dcc/dcc-portal/tags","blobs_url":"https://api.github.com/repos/icgc-dcc/dcc-portal/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/icgc-dcc/dcc-portal/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/icgc-dcc/dcc-portal/git/refs{/sha}","trees_url":"https://api.github.com/repos/icgc-dcc/dcc-portal/git/trees{/sha}","statuses_url":"https://api.github.com/repos/icgc-dcc/dcc-portal/statuses/{sha}","languages_url":"https://api.github.com/repos/icgc-dcc/dcc-portal/languages","stargazers_url":"https://api.github.com/repos/icgc-dcc/dcc-portal/stargazers","contributors_url":"https://api.github.com/repos/icgc-dcc/dcc-portal/contributors","subscribers_url":"https://api.github.com/repos/icgc-dcc/dcc-portal/subscribers","subscription_url":"https://api.github.com/repos/icgc-dcc/dcc-portal/subscription","commits_url":"https://api.github.com/repos/icgc-dcc/dcc-portal/commits{/sha}","git_commits_url":"https://api.github.com/repos/icgc-dcc/dcc-portal/git/commits{/sha}","comments_url":"https://api.github.com/repos/icgc-dcc/dcc-portal/comments{/number}","issue_comment_url":"https://api.github.com/repos/icgc-dcc/dcc-portal/issues/comments{/number}","contents_url":"https://api.github.com/repos/icgc-dcc/dcc-portal/contents/{+path}","compare_url":"https://api.github.com/repos/icgc-dcc/dcc-portal/compare/{base}...{head}","merges_url":"https://api.github.com/repos/icgc-dcc/dcc-portal/merges","archive_url":"https://api.github.com/repos/icgc-dcc/dcc-portal/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/icgc-dcc/dcc-portal/downloads","issues_url":"https://api.github.com/repos/icgc-dcc/dcc-portal/issues{/number}","pulls_url":"https://api.github.com/repos/icgc-dcc/dcc-portal/pulls{/number}","milestones_url":"https://api.github.com/repos/icgc-dcc/dcc-portal/milestones{/number}","notifications_url":"https://api.github.com/repos/icgc-dcc/dcc-portal/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/icgc-dcc/dcc-portal/labels{/name}","releases_url":"https://api.github.com/repos/icgc-dcc/dcc-portal/releases{/id}","deployments_url":"https://api.github.com/repos/icgc-dcc/dcc-portal/deployments","created_at":"2016-06-29T16:44:10Z","updated_at":"2016-07-18T13:55:22Z","pushed_at":"2016-08-11T16:16:10Z","git_url":"git://github.com/icgc-dcc/dcc-portal.git","ssh_url":"git@github.com:icgc-dcc/dcc-portal.git","clone_url":"https://github.com/icgc-dcc/dcc-portal.git","svn_url":"https://github.com/icgc-dcc/dcc-portal","homepage":"https://dcc.icgc.org/","size":11825,"stargazers_count":3,"watchers_count":3,"language":"JavaScript","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":1,"mirror_url":null,"open_issues_count":2,"forks":1,"open_issues":2,"watchers":3,"default_branch":"develop"}},"_links":{"self":{"href":"https://api.github.com/repos/icgc-dcc/dcc-portal/pulls/77"},"html":{"href":"https://github.com/icgc-dcc/dcc-portal/pull/77"},"issue":{"href":"https://api.github.com/repos/icgc-dcc/dcc-portal/issues/77"},"comments":{"href":"https://api.github.com/repos/icgc-dcc/dcc-portal/issues/77/comments"},"review_comments":{"href":"https://api.github.com/repos/icgc-dcc/dcc-portal/pulls/77/comments"},"review_comment":{"href":"https://api.github.com/repos/icgc-dcc/dcc-portal/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/icgc-dcc/dcc-portal/pulls/77/commits"},"statuses":{"href":"https://api.github.com/repos/icgc-dcc/dcc-portal/statuses/1870aa4e56b1fc07caee384116ca9c31a8f967bf"}}}}
{"actor":{"display_login":"btiernay"}}