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 b673612c..84fdf119 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 @@ -47,8 +47,9 @@ public class DocumentCriteria { /** * Tag IDs. + * The first level list will be AND'ed and the second level list will be OR'ed. */ - private List tagIdList; + private List> tagIdList; /** * Shared status. @@ -110,11 +111,11 @@ public class DocumentCriteria { this.createDateMax = createDateMax; } - public List getTagIdList() { + public List> getTagIdList() { return tagIdList; } - public void setTagIdList(List tagIdList) { + public void setTagIdList(List> tagIdList) { this.tagIdList = tagIdList; } @@ -162,8 +163,7 @@ public class DocumentCriteria { this.updateDateMax = updateDateMax; } - public DocumentCriteria setActiveRoute(Boolean activeRoute) { + public void setActiveRoute(Boolean activeRoute) { this.activeRoute = activeRoute; - return this; } } 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 c753fb62..b81cddf6 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 @@ -245,14 +245,16 @@ public class LuceneIndexingHandler implements IndexingHandler { } if (criteria.getTagIdList() != null && !criteria.getTagIdList().isEmpty()) { int index = 0; - List tagCriteriaList = Lists.newArrayList(); - for (String tagId : criteria.getTagIdList()) { - sb.append(String.format("left join T_DOCUMENT_TAG dt%d on dt%d.DOT_IDDOCUMENT_C = d.DOC_ID_C and dt%d.DOT_IDTAG_C = :tagId%d and dt%d.DOT_DELETEDATE_D is null ", index, index, index, index, index)); - parameterMap.put("tagId" + index, tagId); - tagCriteriaList.add(String.format("dt%d.DOT_ID_C is not null", index)); - index++; + for (List tagIdList : criteria.getTagIdList()) { + List tagCriteriaList = Lists.newArrayList(); + for (String tagId : tagIdList) { + sb.append(String.format("left join T_DOCUMENT_TAG dt%d on dt%d.DOT_IDDOCUMENT_C = d.DOC_ID_C and dt%d.DOT_IDTAG_C = :tagId%d and dt%d.DOT_DELETEDATE_D is null ", index, index, index, index, index)); + parameterMap.put("tagId" + index, tagId); + tagCriteriaList.add(String.format("dt%d.DOT_ID_C is not null", index)); + index++; + } + criteriaList.add("(" + Joiner.on(" OR ").join(tagCriteriaList) + ")"); } - criteriaList.add("(" + Joiner.on(" OR ").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 88e8e8f3..aa3da7b3 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 @@ -2,6 +2,7 @@ package com.sismics.docs.rest.resource; import com.google.common.base.Joiner; import com.google.common.base.Strings; +import com.google.common.collect.Lists; import com.sismics.docs.core.constant.AclType; import com.sismics.docs.core.constant.ConfigType; import com.sismics.docs.core.constant.Constants; @@ -452,14 +453,17 @@ public class DocumentResource extends BaseResource { } if (tagDtoList.isEmpty()) { // No tag found, the request must returns nothing - documentCriteria.getTagIdList().add(UUID.randomUUID().toString()); - } - for (TagDto tagDto : tagDtoList) { - documentCriteria.getTagIdList().add(tagDto.getId()); - List childrenTagDtoList = TagUtil.findChildren(tagDto, allTagDtoList); - for (TagDto childrenTagDto : childrenTagDtoList) { - documentCriteria.getTagIdList().add(childrenTagDto.getId()); + documentCriteria.getTagIdList().add(Lists.newArrayList(UUID.randomUUID().toString())); + } else { + List tagIdList = Lists.newArrayList(); + for (TagDto tagDto : tagDtoList) { + tagIdList.add(tagDto.getId()); + List childrenTagDtoList = TagUtil.findChildren(tagDto, allTagDtoList); + for (TagDto childrenTagDto : childrenTagDtoList) { + tagIdList.add(childrenTagDto.getId()); + } } + documentCriteria.getTagIdList().add(tagIdList); } break; case "after": 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 9fcf8eea..b0295129 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 @@ -188,7 +188,7 @@ 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)); - // TODO waiting for #227 Assert.assertEquals(1, searchDocuments("tag:super tag:hr", document1Token)); + Assert.assertEquals(1, 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));