From 8b1c41ae1ea0ee18ef4cd5017d943148ad902423 Mon Sep 17 00:00:00 2001 From: Benjamin Gamard Date: Fri, 3 May 2019 15:35:47 +0200 Subject: [PATCH] Closes #305: exclude tags from search --- .../docs/core/dao/criteria/DocumentCriteria.java | 15 +++++++++++++++ .../core/util/indexing/LuceneIndexingHandler.java | 13 +++++++++++++ .../docs/rest/resource/DocumentResource.java | 10 +++++++++- .../src/app/docs/controller/document/Document.js | 4 ++-- .../sismics/docs/rest/TestDocumentResource.java | 2 ++ 5 files changed, 41 insertions(+), 3 deletions(-) diff --git a/docs-core/src/main/java/com/sismics/docs/core/dao/criteria/DocumentCriteria.java b/docs-core/src/main/java/com/sismics/docs/core/dao/criteria/DocumentCriteria.java index 84fdf119..4e8ace08 100644 --- a/docs-core/src/main/java/com/sismics/docs/core/dao/criteria/DocumentCriteria.java +++ b/docs-core/src/main/java/com/sismics/docs/core/dao/criteria/DocumentCriteria.java @@ -51,6 +51,12 @@ public class DocumentCriteria { */ private List> tagIdList; + /** + * Tag IDs to excluded. + * The first and second level list will be excluded. + */ + private List> excludedTagIdList; + /** * Shared status. */ @@ -119,6 +125,15 @@ public class DocumentCriteria { this.tagIdList = tagIdList; } + public List> getExcludedTagIdList() { + return excludedTagIdList; + } + + public DocumentCriteria setExcludedTagIdList(List> excludedTagIdList) { + this.excludedTagIdList = excludedTagIdList; + return this; + } + public Boolean getShared() { return shared; } diff --git a/docs-core/src/main/java/com/sismics/docs/core/util/indexing/LuceneIndexingHandler.java b/docs-core/src/main/java/com/sismics/docs/core/util/indexing/LuceneIndexingHandler.java index 178a9f96..5a190c58 100644 --- a/docs-core/src/main/java/com/sismics/docs/core/util/indexing/LuceneIndexingHandler.java +++ b/docs-core/src/main/java/com/sismics/docs/core/util/indexing/LuceneIndexingHandler.java @@ -309,6 +309,19 @@ public class LuceneIndexingHandler implements IndexingHandler { criteriaList.add("(" + Joiner.on(" OR ").join(tagCriteriaList) + ")"); } } + if (criteria.getExcludedTagIdList() != null && !criteria.getExcludedTagIdList().isEmpty()) { + int index = 0; + for (List tagIdList : criteria.getExcludedTagIdList()) { + List tagCriteriaList = Lists.newArrayList(); + for (String tagId : tagIdList) { + sb.append(String.format("left join T_DOCUMENT_TAG dtex%d on dtex%d.DOT_IDDOCUMENT_C = d.DOC_ID_C and dtex%d.DOT_IDTAG_C = :tagIdEx%d and dtex%d.DOT_DELETEDATE_D is null ", index, index, index, index, index)); + parameterMap.put("tagIdEx" + index, tagId); + tagCriteriaList.add(String.format("dtex%d.DOT_ID_C is null", index)); + index++; + } + criteriaList.add("(" + Joiner.on(" AND ").join(tagCriteriaList) + ")"); + } + } if (criteria.getShared() != null && criteria.getShared()) { criteriaList.add("s.count > 0"); } diff --git a/docs-web/src/main/java/com/sismics/docs/rest/resource/DocumentResource.java b/docs-web/src/main/java/com/sismics/docs/rest/resource/DocumentResource.java index 5d8f483f..c5454a31 100644 --- a/docs-web/src/main/java/com/sismics/docs/rest/resource/DocumentResource.java +++ b/docs-web/src/main/java/com/sismics/docs/rest/resource/DocumentResource.java @@ -459,11 +459,15 @@ public class DocumentResource extends BaseResource { switch (params[0]) { case "tag": + case "!tag": // New tag criteria List tagDtoList = TagUtil.findByName(params[1], allTagDtoList); if (documentCriteria.getTagIdList() == null) { documentCriteria.setTagIdList(new ArrayList<>()); } + if (documentCriteria.getExcludedTagIdList() == null) { + documentCriteria.setExcludedTagIdList(new ArrayList<>()); + } if (tagDtoList.isEmpty()) { // No tag found, the request must returns nothing documentCriteria.getTagIdList().add(Lists.newArrayList(UUID.randomUUID().toString())); @@ -476,7 +480,11 @@ public class DocumentResource extends BaseResource { tagIdList.add(childrenTagDto.getId()); } } - documentCriteria.getTagIdList().add(tagIdList); + if (params[0].startsWith("!")) { + documentCriteria.getExcludedTagIdList().add(tagIdList); + } else { + documentCriteria.getTagIdList().add(tagIdList); + } } break; case "after": diff --git a/docs-web/src/main/webapp/src/app/docs/controller/document/Document.js b/docs-web/src/main/webapp/src/app/docs/controller/document/Document.js index e3365405..650b836f 100644 --- a/docs-web/src/main/webapp/src/app/docs/controller/document/Document.js +++ b/docs-web/src/main/webapp/src/app/docs/controller/document/Document.js @@ -319,9 +319,9 @@ angular.module('docs').controller('Document', function ($scope, $rootScope, $tim */ $scope.extractNavigatedTag = function () { // Find the current tag in the search query - var tagFound = /tag:([^ ]*)/.exec($scope.search); + var tagFound = /(^| )tag:([^ ]*)/.exec($scope.search); if (tagFound) { - tagFound = tagFound[1]; + tagFound = tagFound[2]; // We search only for exact match $scope.navigatedTag = _.findWhere($scope.tags, { name: tagFound }); } else { diff --git a/docs-web/src/test/java/com/sismics/docs/rest/TestDocumentResource.java b/docs-web/src/test/java/com/sismics/docs/rest/TestDocumentResource.java index 4b426beb..d500bc83 100644 --- a/docs-web/src/test/java/com/sismics/docs/rest/TestDocumentResource.java +++ b/docs-web/src/test/java/com/sismics/docs/rest/TestDocumentResource.java @@ -209,7 +209,9 @@ public class TestDocumentResource extends BaseJerseyTest { Assert.assertEquals(2, searchDocuments("uat:" + DateTimeFormat.forPattern("yyyy-MM-dd").print(new Date().getTime()), document1Token)); Assert.assertEquals(2, searchDocuments("uafter:2010 ubefore:2040-08", document1Token)); Assert.assertEquals(1, searchDocuments("tag:super", document1Token)); + Assert.assertEquals(1, searchDocuments("!tag:super", document1Token)); Assert.assertEquals(1, searchDocuments("tag:super tag:hr", document1Token)); + Assert.assertEquals(0, searchDocuments("tag:super !tag:hr", document1Token)); Assert.assertEquals(1, searchDocuments("shared:yes", document1Token)); Assert.assertEquals(2, searchDocuments("lang:eng", document1Token)); Assert.assertEquals(1, searchDocuments("after:2010 before:2040-08 tag:super shared:yes lang:eng title description full:uranium", document1Token));