mirror of
https://github.com/sismics/docs.git
synced 2024-11-22 14:07:55 +01:00
#176: search by tags and all associated children
This commit is contained in:
parent
09eaf18632
commit
c72f9fbdb1
@ -2,6 +2,7 @@ package com.sismics.docs.core.dao.jpa;
|
|||||||
|
|
||||||
import com.google.common.base.Joiner;
|
import com.google.common.base.Joiner;
|
||||||
import com.google.common.base.Strings;
|
import com.google.common.base.Strings;
|
||||||
|
import com.google.common.collect.Lists;
|
||||||
import com.sismics.docs.core.constant.AuditLogType;
|
import com.sismics.docs.core.constant.AuditLogType;
|
||||||
import com.sismics.docs.core.constant.PermType;
|
import com.sismics.docs.core.constant.PermType;
|
||||||
import com.sismics.docs.core.dao.jpa.criteria.DocumentCriteria;
|
import com.sismics.docs.core.dao.jpa.criteria.DocumentCriteria;
|
||||||
@ -239,11 +240,14 @@ public class DocumentDao {
|
|||||||
}
|
}
|
||||||
if (criteria.getTagIdList() != null && !criteria.getTagIdList().isEmpty()) {
|
if (criteria.getTagIdList() != null && !criteria.getTagIdList().isEmpty()) {
|
||||||
int index = 0;
|
int index = 0;
|
||||||
|
List<String> tagCriteriaList = Lists.newArrayList();
|
||||||
for (String tagId : criteria.getTagIdList()) {
|
for (String tagId : criteria.getTagIdList()) {
|
||||||
sb.append(String.format(" 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));
|
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);
|
parameterMap.put("tagId" + index, tagId);
|
||||||
|
tagCriteriaList.add(String.format("dt%d.DOT_ID_C is not null", index));
|
||||||
index++;
|
index++;
|
||||||
}
|
}
|
||||||
|
criteriaList.add(Joiner.on(" OR ").join(tagCriteriaList));
|
||||||
}
|
}
|
||||||
if (criteria.getShared() != null && criteria.getShared()) {
|
if (criteria.getShared() != null && criteria.getShared()) {
|
||||||
criteriaList.add("(select count(s.SHA_ID_C) from T_SHARE s, T_ACL ac where ac.ACL_SOURCEID_C = d.DOC_ID_C and ac.ACL_TARGETID_C = s.SHA_ID_C and ac.ACL_DELETEDATE_D is null and s.SHA_DELETEDATE_D is null) > 0");
|
criteriaList.add("(select count(s.SHA_ID_C) from T_SHARE s, T_ACL ac where ac.ACL_SOURCEID_C = d.DOC_ID_C and ac.ACL_TARGETID_C = s.SHA_ID_C and ac.ACL_DELETEDATE_D is null and s.SHA_DELETEDATE_D is null) > 0");
|
||||||
|
@ -195,10 +195,6 @@ public class TagDao {
|
|||||||
criteriaList.add("t.TAG_NAME_C = :name");
|
criteriaList.add("t.TAG_NAME_C = :name");
|
||||||
parameterMap.put("name", criteria.getName());
|
parameterMap.put("name", criteria.getName());
|
||||||
}
|
}
|
||||||
if (criteria.getNameLike() != null) {
|
|
||||||
criteriaList.add("t.TAG_NAME_C like :nameLike");
|
|
||||||
parameterMap.put("nameLike", criteria.getNameLike() + "%");
|
|
||||||
}
|
|
||||||
|
|
||||||
criteriaList.add("t.TAG_DELETEDATE_D is null");
|
criteriaList.add("t.TAG_DELETEDATE_D is null");
|
||||||
|
|
||||||
|
@ -68,13 +68,4 @@ public class TagCriteria {
|
|||||||
this.name = name;
|
this.name = name;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getNameLike() {
|
|
||||||
return nameLike;
|
|
||||||
}
|
|
||||||
|
|
||||||
public TagCriteria setNameLike(String nameLike) {
|
|
||||||
this.nameLike = nameLike;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,54 @@
|
|||||||
|
package com.sismics.docs.core.util;
|
||||||
|
|
||||||
|
import com.google.common.collect.Lists;
|
||||||
|
import com.sismics.docs.core.dao.jpa.dto.TagDto;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tag utilities.
|
||||||
|
*
|
||||||
|
* @author bgamard
|
||||||
|
*/
|
||||||
|
public class TagUtil {
|
||||||
|
/**
|
||||||
|
* Recursively find children of a tags.
|
||||||
|
*
|
||||||
|
* @param parentTagDto Parent tag
|
||||||
|
* @param allTagDtoList List of all tags
|
||||||
|
* @return Children tags
|
||||||
|
*/
|
||||||
|
public static List<TagDto> findChildren(TagDto parentTagDto, List<TagDto> allTagDtoList) {
|
||||||
|
List<TagDto> childrenTagDtoList = Lists.newArrayList();
|
||||||
|
|
||||||
|
for (TagDto tagDto : allTagDtoList) {
|
||||||
|
if (parentTagDto.getId().equals(tagDto.getParentId())) {
|
||||||
|
childrenTagDtoList.add(tagDto);
|
||||||
|
childrenTagDtoList.addAll(findChildren(tagDto, allTagDtoList));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return childrenTagDtoList;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Find tags by name (start with).
|
||||||
|
*
|
||||||
|
* @param name Name
|
||||||
|
* @param allTagDtoList List of all tags
|
||||||
|
* @return List of filtered tags
|
||||||
|
*/
|
||||||
|
public static List<TagDto> findByName(String name, List<TagDto> allTagDtoList) {
|
||||||
|
List<TagDto> tagDtoList = Lists.newArrayList();
|
||||||
|
if (name == null || name.isEmpty()) {
|
||||||
|
return tagDtoList;
|
||||||
|
}
|
||||||
|
name = name.toLowerCase();
|
||||||
|
for (TagDto tagDto : allTagDtoList) {
|
||||||
|
if (tagDto.getName().toLowerCase().startsWith(name)) {
|
||||||
|
tagDtoList.add(tagDto);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return tagDtoList;
|
||||||
|
}
|
||||||
|
}
|
@ -17,10 +17,7 @@ import com.sismics.docs.core.event.FileDeletedAsyncEvent;
|
|||||||
import com.sismics.docs.core.model.jpa.Document;
|
import com.sismics.docs.core.model.jpa.Document;
|
||||||
import com.sismics.docs.core.model.jpa.File;
|
import com.sismics.docs.core.model.jpa.File;
|
||||||
import com.sismics.docs.core.model.jpa.User;
|
import com.sismics.docs.core.model.jpa.User;
|
||||||
import com.sismics.docs.core.util.ConfigUtil;
|
import com.sismics.docs.core.util.*;
|
||||||
import com.sismics.docs.core.util.DocumentUtil;
|
|
||||||
import com.sismics.docs.core.util.FileUtil;
|
|
||||||
import com.sismics.docs.core.util.PdfUtil;
|
|
||||||
import com.sismics.docs.core.util.jpa.PaginatedList;
|
import com.sismics.docs.core.util.jpa.PaginatedList;
|
||||||
import com.sismics.docs.core.util.jpa.PaginatedLists;
|
import com.sismics.docs.core.util.jpa.PaginatedLists;
|
||||||
import com.sismics.docs.core.util.jpa.SortCriteria;
|
import com.sismics.docs.core.util.jpa.SortCriteria;
|
||||||
@ -424,6 +421,7 @@ public class DocumentResource extends BaseResource {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TagDao tagDao = new TagDao();
|
TagDao tagDao = new TagDao();
|
||||||
|
List<TagDto> allTagDtoList = tagDao.findByCriteria(new TagCriteria().setTargetIdList(getTargetIdList(null)), null);
|
||||||
UserDao userDao = new UserDao();
|
UserDao userDao = new UserDao();
|
||||||
DateTimeParser[] parsers = {
|
DateTimeParser[] parsers = {
|
||||||
DateTimeFormat.forPattern("yyyy").getParser(),
|
DateTimeFormat.forPattern("yyyy").getParser(),
|
||||||
@ -448,7 +446,7 @@ public class DocumentResource extends BaseResource {
|
|||||||
switch (params[0]) {
|
switch (params[0]) {
|
||||||
case "tag":
|
case "tag":
|
||||||
// New tag criteria
|
// New tag criteria
|
||||||
List<TagDto> tagDtoList = tagDao.findByCriteria(new TagCriteria().setTargetIdList(getTargetIdList(null)).setNameLike(params[1]), null);
|
List<TagDto> tagDtoList = TagUtil.findByName(params[1], allTagDtoList);
|
||||||
if (documentCriteria.getTagIdList() == null) {
|
if (documentCriteria.getTagIdList() == null) {
|
||||||
documentCriteria.setTagIdList(new ArrayList<String>());
|
documentCriteria.setTagIdList(new ArrayList<String>());
|
||||||
}
|
}
|
||||||
@ -458,6 +456,10 @@ public class DocumentResource extends BaseResource {
|
|||||||
}
|
}
|
||||||
for (TagDto tagDto : tagDtoList) {
|
for (TagDto tagDto : tagDtoList) {
|
||||||
documentCriteria.getTagIdList().add(tagDto.getId());
|
documentCriteria.getTagIdList().add(tagDto.getId());
|
||||||
|
List<TagDto> childrenTagDtoList = TagUtil.findChildren(tagDto, allTagDtoList);
|
||||||
|
for (TagDto childrenTagDto : childrenTagDtoList) {
|
||||||
|
documentCriteria.getTagIdList().add(childrenTagDto.getId());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case "after":
|
case "after":
|
||||||
|
@ -1,5 +1,9 @@
|
|||||||
package com.sismics.docs.rest;
|
package com.sismics.docs.rest;
|
||||||
|
|
||||||
|
import com.sismics.util.filter.TokenBasedSecurityFilter;
|
||||||
|
import org.junit.Assert;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
import javax.json.JsonArray;
|
import javax.json.JsonArray;
|
||||||
import javax.json.JsonObject;
|
import javax.json.JsonObject;
|
||||||
import javax.ws.rs.client.Entity;
|
import javax.ws.rs.client.Entity;
|
||||||
@ -7,11 +11,6 @@ import javax.ws.rs.core.Form;
|
|||||||
import javax.ws.rs.core.Response;
|
import javax.ws.rs.core.Response;
|
||||||
import javax.ws.rs.core.Response.Status;
|
import javax.ws.rs.core.Response.Status;
|
||||||
|
|
||||||
import org.junit.Assert;
|
|
||||||
import org.junit.Test;
|
|
||||||
|
|
||||||
import com.sismics.util.filter.TokenBasedSecurityFilter;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Test the tag resource.
|
* Test the tag resource.
|
||||||
*
|
*
|
||||||
@ -66,12 +65,13 @@ public class TestTagResource extends BaseJerseyTest {
|
|||||||
Assert.assertEquals(Status.BAD_REQUEST, Status.fromStatusCode(response.getStatus()));
|
Assert.assertEquals(Status.BAD_REQUEST, Status.fromStatusCode(response.getStatus()));
|
||||||
|
|
||||||
// Create a document
|
// Create a document
|
||||||
target().path("/document").request()
|
json = target().path("/document").request()
|
||||||
.cookie(TokenBasedSecurityFilter.COOKIE_NAME, tag1Token)
|
.cookie(TokenBasedSecurityFilter.COOKIE_NAME, tag1Token)
|
||||||
.put(Entity.form(new Form()
|
.put(Entity.form(new Form()
|
||||||
.param("title", "My super document 1")
|
.param("title", "My super document 1")
|
||||||
.param("tags", tag3Id)
|
.param("tags", tag3Id)
|
||||||
.param("language", "eng")), JsonObject.class);
|
.param("language", "eng")), JsonObject.class);
|
||||||
|
String document1Id = json.getString("id");
|
||||||
|
|
||||||
// Create a document
|
// Create a document
|
||||||
json = target().path("/document").request()
|
json = target().path("/document").request()
|
||||||
@ -82,6 +82,27 @@ public class TestTagResource extends BaseJerseyTest {
|
|||||||
.param("language", "eng")), JsonObject.class);
|
.param("language", "eng")), JsonObject.class);
|
||||||
String document2Id = json.getString("id");
|
String document2Id = json.getString("id");
|
||||||
|
|
||||||
|
// Search document by parent tag
|
||||||
|
json = target().path("/document/list")
|
||||||
|
.queryParam("search", "tag:Tag3")
|
||||||
|
.queryParam("asc", "true")
|
||||||
|
.queryParam("sort_column", "1")
|
||||||
|
.request()
|
||||||
|
.cookie(TokenBasedSecurityFilter.COOKIE_NAME, tag1Token)
|
||||||
|
.get(JsonObject.class);
|
||||||
|
Assert.assertEquals(2, json.getJsonArray("documents").size());
|
||||||
|
Assert.assertEquals(document1Id, json.getJsonArray("documents").getJsonObject(0).getString("id"));
|
||||||
|
Assert.assertEquals(document2Id, json.getJsonArray("documents").getJsonObject(1).getString("id"));
|
||||||
|
|
||||||
|
// Search document by children tag
|
||||||
|
json = target().path("/document/list")
|
||||||
|
.queryParam("search", "tag:Tag4")
|
||||||
|
.request()
|
||||||
|
.cookie(TokenBasedSecurityFilter.COOKIE_NAME, tag1Token)
|
||||||
|
.get(JsonObject.class);
|
||||||
|
Assert.assertEquals(1, json.getJsonArray("documents").size());
|
||||||
|
Assert.assertEquals(document2Id, json.getJsonArray("documents").getJsonObject(0).getString("id"));
|
||||||
|
|
||||||
// Check tags on a document
|
// Check tags on a document
|
||||||
json = target().path("/document/" + document2Id).request()
|
json = target().path("/document/" + document2Id).request()
|
||||||
.cookie(TokenBasedSecurityFilter.COOKIE_NAME, tag1Token)
|
.cookie(TokenBasedSecurityFilter.COOKIE_NAME, tag1Token)
|
||||||
|
Loading…
Reference in New Issue
Block a user