mirror of
https://github.com/ctripcorp/zeus.git
synced 2024-09-20 15:46:01 +08:00
add tag & prop commands
This commit is contained in:
parent
379af75de3
commit
b23ef0dde9
|
@ -1,5 +1,7 @@
|
||||||
package com.ctrip.zeus.service.query;
|
package com.ctrip.zeus.service.query;
|
||||||
|
|
||||||
|
import com.ctrip.zeus.tag.PropertyService;
|
||||||
|
import com.ctrip.zeus.tag.TagService;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
|
@ -15,6 +17,10 @@ public class CriteriaQueryFactory {
|
||||||
private CriteriaQuery slbCriteriaQuery;
|
private CriteriaQuery slbCriteriaQuery;
|
||||||
@Resource
|
@Resource
|
||||||
private CriteriaQuery virtualServerCriteriaQuery;
|
private CriteriaQuery virtualServerCriteriaQuery;
|
||||||
|
@Resource
|
||||||
|
private TagService tagService;
|
||||||
|
@Resource
|
||||||
|
private PropertyService propertyService;
|
||||||
|
|
||||||
public CriteriaQuery getCriteriaQuery(String type) {
|
public CriteriaQuery getCriteriaQuery(String type) {
|
||||||
switch (type) {
|
switch (type) {
|
||||||
|
@ -28,4 +34,12 @@ public class CriteriaQueryFactory {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public TagService getTagService() {
|
||||||
|
return tagService;
|
||||||
|
}
|
||||||
|
|
||||||
|
public PropertyService getPropertyService() {
|
||||||
|
return propertyService;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,10 +3,7 @@ package com.ctrip.zeus.service.query;
|
||||||
import com.ctrip.zeus.exceptions.ValidationException;
|
import com.ctrip.zeus.exceptions.ValidationException;
|
||||||
import com.ctrip.zeus.service.model.IdVersion;
|
import com.ctrip.zeus.service.model.IdVersion;
|
||||||
import com.ctrip.zeus.service.model.SelectionMode;
|
import com.ctrip.zeus.service.model.SelectionMode;
|
||||||
import com.ctrip.zeus.service.query.command.GroupQueryCommand;
|
import com.ctrip.zeus.service.query.command.*;
|
||||||
import com.ctrip.zeus.service.query.command.QueryCommand;
|
|
||||||
import com.ctrip.zeus.service.query.command.SlbQueryCommand;
|
|
||||||
import com.ctrip.zeus.service.query.command.VsQueryCommand;
|
|
||||||
import com.google.common.base.Joiner;
|
import com.google.common.base.Joiner;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
@ -22,8 +19,10 @@ public class QueryEngine {
|
||||||
private final GroupQueryCommand groupQueryCommand = new GroupQueryCommand();
|
private final GroupQueryCommand groupQueryCommand = new GroupQueryCommand();
|
||||||
private final VsQueryCommand vsQueryCommand = new VsQueryCommand();
|
private final VsQueryCommand vsQueryCommand = new VsQueryCommand();
|
||||||
private final SlbQueryCommand slbQueryCommand = new SlbQueryCommand();
|
private final SlbQueryCommand slbQueryCommand = new SlbQueryCommand();
|
||||||
|
private final TagQueryCommand tagCommand = new TagQueryCommand();
|
||||||
|
private final PropQueryCommand propertyCommand = new PropQueryCommand();
|
||||||
|
|
||||||
private final QueryCommand[] sequenceController = new QueryCommand[3];
|
private final QueryCommand[] sequenceController = new QueryCommand[5];
|
||||||
|
|
||||||
public QueryEngine(Queue<String[]> params, String resource, SelectionMode mode) {
|
public QueryEngine(Queue<String[]> params, String resource, SelectionMode mode) {
|
||||||
this.params = params;
|
this.params = params;
|
||||||
|
@ -46,6 +45,8 @@ public class QueryEngine {
|
||||||
sequenceController[2] = vsQueryCommand;
|
sequenceController[2] = vsQueryCommand;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
sequenceController[3] = tagCommand;
|
||||||
|
sequenceController[4] = propertyCommand;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void init(boolean skipable) throws ValidationException {
|
public void init(boolean skipable) throws ValidationException {
|
||||||
|
@ -68,6 +69,28 @@ public class QueryEngine {
|
||||||
}
|
}
|
||||||
|
|
||||||
public IdVersion[] run(CriteriaQueryFactory criteriaQueryFactory) throws Exception {
|
public IdVersion[] run(CriteriaQueryFactory criteriaQueryFactory) throws Exception {
|
||||||
|
// filter by tags and props
|
||||||
|
Set<Long> pre = criteriaQueryFactory.getTagService().queryByCommand(tagCommand, resource);
|
||||||
|
Set<Long> propItems = criteriaQueryFactory.getPropertyService().queryByCommand(propertyCommand, resource);
|
||||||
|
if (pre == null) {
|
||||||
|
pre = propItems;
|
||||||
|
} else {
|
||||||
|
if (propItems != null) pre.retainAll(propItems);
|
||||||
|
}
|
||||||
|
|
||||||
|
QueryCommand c = sequenceController[0];
|
||||||
|
|
||||||
|
if (pre != null) {
|
||||||
|
Set<Long> orig = new HashSet<>();
|
||||||
|
// 0 is the index of id
|
||||||
|
for (String s : c.getValue(0)) {
|
||||||
|
orig.add(Long.parseLong(s));
|
||||||
|
}
|
||||||
|
pre.retainAll(orig);
|
||||||
|
c.addAtIndex(0, Joiner.on(",").join(pre));
|
||||||
|
}
|
||||||
|
|
||||||
|
// filter by criteria queries
|
||||||
String[] traverseSequence = new String[]{sequenceController[1].getType(),
|
String[] traverseSequence = new String[]{sequenceController[1].getType(),
|
||||||
sequenceController[2].getType(), sequenceController[0].getType()};
|
sequenceController[2].getType(), sequenceController[0].getType()};
|
||||||
IdVersion[] result = traverseQuery(traverseSequence, 0, criteriaQueryFactory);
|
IdVersion[] result = traverseQuery(traverseSequence, 0, criteriaQueryFactory);
|
||||||
|
|
|
@ -0,0 +1,76 @@
|
||||||
|
package com.ctrip.zeus.service.query.command;
|
||||||
|
|
||||||
|
import com.ctrip.zeus.tag.entity.Property;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by zhoumy on 2016/7/19.
|
||||||
|
*/
|
||||||
|
public class PropQueryCommand implements QueryCommand {
|
||||||
|
public final int union_prop = 0;
|
||||||
|
public final int join_prop = 1;
|
||||||
|
|
||||||
|
private final String type;
|
||||||
|
|
||||||
|
private String[] values = new String[2];
|
||||||
|
|
||||||
|
public PropQueryCommand() {
|
||||||
|
this.type = "prop";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean add(String queryName, String queryValue) {
|
||||||
|
int idx;
|
||||||
|
switch (queryName) {
|
||||||
|
case "anyProp":
|
||||||
|
case "unionProp":
|
||||||
|
idx = union_prop;
|
||||||
|
break;
|
||||||
|
case "props":
|
||||||
|
case "joinPro":
|
||||||
|
idx = join_prop;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return addAtIndex(idx, queryValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean addAtIndex(int idx, String queryValue) {
|
||||||
|
if (idx < values.length) {
|
||||||
|
values[idx] = queryValue;
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean hasValue(int idx) {
|
||||||
|
return values[idx] != null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String[] getValue(int idx) {
|
||||||
|
String value = values[idx];
|
||||||
|
return value == null ? null : value.split(",");
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Property> getProperties(int idx) {
|
||||||
|
List<Property> properties = new ArrayList<>();
|
||||||
|
for (String s : getValue(idx)) {
|
||||||
|
int ps = s.trim().indexOf(':');
|
||||||
|
if (ps == -1) continue;
|
||||||
|
properties.add(new Property().setName(s.substring(0, ps)).setValue(s.substring(ps + 1)));
|
||||||
|
}
|
||||||
|
return properties;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getType() {
|
||||||
|
return type;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,61 @@
|
||||||
|
package com.ctrip.zeus.service.query.command;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by zhoumy on 2016/7/19.
|
||||||
|
*/
|
||||||
|
public class TagQueryCommand implements QueryCommand {
|
||||||
|
public final int union_tag = 0;
|
||||||
|
public final int join_tag = 1;
|
||||||
|
|
||||||
|
private final String type;
|
||||||
|
|
||||||
|
private String[] values = new String[2];
|
||||||
|
|
||||||
|
public TagQueryCommand() {
|
||||||
|
type = "tag";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean add(String queryName, String queryValue) {
|
||||||
|
int idx;
|
||||||
|
switch (queryName) {
|
||||||
|
case "anyTag":
|
||||||
|
case "unionTag":
|
||||||
|
idx = union_tag;
|
||||||
|
break;
|
||||||
|
case "tags":
|
||||||
|
case "joinTag":
|
||||||
|
idx = join_tag;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return addAtIndex(idx, queryValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean addAtIndex(int idx, String queryValue) {
|
||||||
|
if (idx < values.length) {
|
||||||
|
values[idx] = queryValue;
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean hasValue(int idx) {
|
||||||
|
return values[idx] != null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String[] getValue(int idx) {
|
||||||
|
String value = values[idx];
|
||||||
|
return value == null ? null : value.split(",");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getType() {
|
||||||
|
return type;
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,19 +1,27 @@
|
||||||
package com.ctrip.zeus.tag;
|
package com.ctrip.zeus.tag;
|
||||||
|
|
||||||
|
import com.ctrip.zeus.service.query.command.QueryCommand;
|
||||||
import com.ctrip.zeus.tag.entity.Property;
|
import com.ctrip.zeus.tag.entity.Property;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Created by zhoumy on 2015/7/21.
|
* Created by zhoumy on 2015/7/21.
|
||||||
*/
|
*/
|
||||||
public interface PropertyService {
|
public interface PropertyService {
|
||||||
|
|
||||||
|
Set<Long> queryByCommand(QueryCommand command, String type) throws Exception;
|
||||||
|
|
||||||
List<Property> getAllProperties() throws Exception;
|
List<Property> getAllProperties() throws Exception;
|
||||||
|
|
||||||
List<Property> getProperties(String type, Long itemId) throws Exception;
|
List<Property> getProperties(String type, Long itemId) throws Exception;
|
||||||
|
|
||||||
Property getProperty(String pname, Long itemId, String type) throws Exception;
|
Property getProperty(String pname, Long itemId, String type) throws Exception;
|
||||||
|
|
||||||
|
Set<Long> unionQuery(List<Property> properties, String type) throws Exception;
|
||||||
|
|
||||||
|
Set<Long> joinQuery(List<Property> properties, String type) throws Exception;
|
||||||
|
|
||||||
List<Long> queryTargets(String pname, String pvalue, String type) throws Exception;
|
List<Long> queryTargets(String pname, String pvalue, String type) throws Exception;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,13 +1,20 @@
|
||||||
package com.ctrip.zeus.tag;
|
package com.ctrip.zeus.tag;
|
||||||
|
|
||||||
|
import com.ctrip.zeus.service.query.command.QueryCommand;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Created by zhoumy on 2015/7/20.
|
* Created by zhoumy on 2015/7/20.
|
||||||
*/
|
*/
|
||||||
public interface TagService {
|
public interface TagService {
|
||||||
|
|
||||||
List<Long> query(List<String> tagNames, String type) throws Exception;
|
Set<Long> queryByCommand(QueryCommand command, String type) throws Exception;
|
||||||
|
|
||||||
|
Set<Long> unionQuery(List<String> tagNames, String type) throws Exception;
|
||||||
|
|
||||||
|
Set<Long> joinQuery(List<String> tagNames, String type) throws Exception;
|
||||||
|
|
||||||
List<Long> query(String tagName, String type) throws Exception;
|
List<Long> query(String tagName, String type) throws Exception;
|
||||||
|
|
||||||
|
|
|
@ -1,15 +1,14 @@
|
||||||
package com.ctrip.zeus.tag.impl;
|
package com.ctrip.zeus.tag.impl;
|
||||||
|
|
||||||
import com.ctrip.zeus.dal.core.*;
|
import com.ctrip.zeus.dal.core.*;
|
||||||
|
import com.ctrip.zeus.service.query.command.PropQueryCommand;
|
||||||
|
import com.ctrip.zeus.service.query.command.QueryCommand;
|
||||||
import com.ctrip.zeus.tag.PropertyService;
|
import com.ctrip.zeus.tag.PropertyService;
|
||||||
import com.ctrip.zeus.tag.entity.Property;
|
import com.ctrip.zeus.tag.entity.Property;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
import java.util.ArrayList;
|
import java.util.*;
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Created by zhoumy on 2015/7/21.
|
* Created by zhoumy on 2015/7/21.
|
||||||
|
@ -23,6 +22,23 @@ public class PropertyServiceImpl implements PropertyService {
|
||||||
@Resource
|
@Resource
|
||||||
private PropertyItemDao propertyItemDao;
|
private PropertyItemDao propertyItemDao;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Set<Long> queryByCommand(QueryCommand command, String type) throws Exception {
|
||||||
|
Set<Long> result = null;
|
||||||
|
PropQueryCommand propQuery = (PropQueryCommand) command;
|
||||||
|
if (command.hasValue(propQuery.union_prop)) {
|
||||||
|
result = unionQuery(propQuery.getProperties(propQuery.union_prop), type);
|
||||||
|
}
|
||||||
|
if (command.hasValue(propQuery.join_prop)) {
|
||||||
|
if (result == null) {
|
||||||
|
result = joinQuery(propQuery.getProperties(propQuery.join_prop), type);
|
||||||
|
} else {
|
||||||
|
result.retainAll(joinQuery(propQuery.getProperties(propQuery.join_prop), type));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Property getProperty(String pname, Long itemId, String type) throws Exception {
|
public Property getProperty(String pname, Long itemId, String type) throws Exception {
|
||||||
PropertyKeyDo kd = propertyKeyDao.findByName(pname, PropertyKeyEntity.READSET_FULL);
|
PropertyKeyDo kd = propertyKeyDao.findByName(pname, PropertyKeyEntity.READSET_FULL);
|
||||||
|
@ -40,6 +56,81 @@ public class PropertyServiceImpl implements PropertyService {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Set<Long> unionQuery(List<Property> properties, String type) throws Exception {
|
||||||
|
Map<String, Long> pnames = new HashMap<>();
|
||||||
|
Map<String, Long> pids = new HashMap<>();
|
||||||
|
Long obj = 0L;
|
||||||
|
for (Property p : properties) {
|
||||||
|
pnames.put(p.getName(), obj);
|
||||||
|
pids.put(p.getName() + ":" + p.getValue(), obj);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (PropertyKeyDo e : propertyKeyDao.findByNames(pnames.keySet().toArray(new String[0]), PropertyKeyEntity.READSET_FULL)) {
|
||||||
|
pnames.put(e.getName(), e.getId());
|
||||||
|
}
|
||||||
|
for (PropertyDo e : propertyDao.findAllByIds(pnames.values().toArray(new Long[0]), PropertyEntity.READSET_FULL)) {
|
||||||
|
String k = pnames.get(e.getPropertyKeyId()) + ":" + e.getPropertyValue();
|
||||||
|
if (pids.containsKey(k)) {
|
||||||
|
pids.put(k, e.getId());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Set<Long> result = new HashSet<>();
|
||||||
|
for (PropertyItemDo e : propertyItemDao.findAllByProperties(pids.values().toArray(new Long[0]), PropertyItemEntity.READSET_FULL)) {
|
||||||
|
if (e.getType().equals(type)) {
|
||||||
|
result.add(e.getItemId());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Set<Long> joinQuery(List<Property> properties, String type) throws Exception {
|
||||||
|
Map<String, Long> pnames = new HashMap<>();
|
||||||
|
Map<String, Long> pids = new HashMap<>();
|
||||||
|
Long obj = 0L;
|
||||||
|
for (Property p : properties) {
|
||||||
|
pnames.put(p.getName(), obj);
|
||||||
|
pids.put(p.getName() + ":" + p.getValue(), obj);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (PropertyKeyDo e : propertyKeyDao.findByNames(pnames.keySet().toArray(new String[0]), PropertyKeyEntity.READSET_FULL)) {
|
||||||
|
pnames.put(e.getName(), e.getId());
|
||||||
|
}
|
||||||
|
for (Long l : pnames.values()) {
|
||||||
|
if (l == obj) return new HashSet<>();
|
||||||
|
}
|
||||||
|
|
||||||
|
for (PropertyDo e : propertyDao.findAllByIds(pnames.values().toArray(new Long[0]), PropertyEntity.READSET_FULL)) {
|
||||||
|
String k = pnames.get(e.getPropertyKeyId()) + ":" + e.getPropertyValue();
|
||||||
|
if (pids.containsKey(k)) {
|
||||||
|
pids.put(k, e.getId());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (Long l : pids.values()) {
|
||||||
|
if (l == obj) return new HashSet<>();
|
||||||
|
}
|
||||||
|
|
||||||
|
int joinedValue = pids.size();
|
||||||
|
Map<Long, Counter> marker = new HashMap<>();
|
||||||
|
for (PropertyItemDo e : propertyItemDao.findAllByProperties(pids.values().toArray(new Long[0]), PropertyItemEntity.READSET_FULL)) {
|
||||||
|
if (e.getType().equals(type)) {
|
||||||
|
Counter m = marker.get(e.getPropertyId());
|
||||||
|
if (m == null) {
|
||||||
|
marker.put(e.getItemId(), new Counter());
|
||||||
|
} else {
|
||||||
|
m.incr();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Set<Long> result = new HashSet<>();
|
||||||
|
for (Map.Entry<Long, Counter> e : marker.entrySet()) {
|
||||||
|
if (e.getValue().get() == joinedValue) result.add(e.getKey());
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<Long> queryTargets(String pname, String pvalue, String type) throws Exception {
|
public List<Long> queryTargets(String pname, String pvalue, String type) throws Exception {
|
||||||
List<Long> result = new ArrayList<>();
|
List<Long> result = new ArrayList<>();
|
||||||
|
@ -97,4 +188,16 @@ public class PropertyServiceImpl implements PropertyService {
|
||||||
}
|
}
|
||||||
return new ArrayList<>(result.values());
|
return new ArrayList<>(result.values());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private class Counter {
|
||||||
|
int count = 1;
|
||||||
|
|
||||||
|
public void incr() {
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int get() {
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,12 +1,13 @@
|
||||||
package com.ctrip.zeus.tag.impl;
|
package com.ctrip.zeus.tag.impl;
|
||||||
|
|
||||||
import com.ctrip.zeus.dal.core.*;
|
import com.ctrip.zeus.dal.core.*;
|
||||||
|
import com.ctrip.zeus.service.query.command.QueryCommand;
|
||||||
|
import com.ctrip.zeus.service.query.command.TagQueryCommand;
|
||||||
import com.ctrip.zeus.tag.TagService;
|
import com.ctrip.zeus.tag.TagService;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
import java.util.ArrayList;
|
import java.util.*;
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Created by zhoumy on 2015/7/20.
|
* Created by zhoumy on 2015/7/20.
|
||||||
|
@ -19,22 +20,76 @@ public class TagServiceImpl implements TagService {
|
||||||
private TagItemDao tagItemDao;
|
private TagItemDao tagItemDao;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<Long> query(List<String> tagNames, String type) throws Exception {
|
public Set<Long> queryByCommand(QueryCommand command, String type) throws Exception {
|
||||||
|
Set<Long> result = null;
|
||||||
|
TagQueryCommand tagQuery = (TagQueryCommand) command;
|
||||||
|
if (command.hasValue(tagQuery.union_tag)) {
|
||||||
|
List<String> tn = new ArrayList<>();
|
||||||
|
for (String s : tagQuery.getValue(tagQuery.union_tag)) {
|
||||||
|
tn.add(s.trim());
|
||||||
|
}
|
||||||
|
result = unionQuery(tn, type);
|
||||||
|
}
|
||||||
|
if (command.hasValue(tagQuery.join_tag)) {
|
||||||
|
List<String> tn = new ArrayList<>();
|
||||||
|
for (String s : tagQuery.getValue(tagQuery.join_tag)) {
|
||||||
|
tn.add(s.trim());
|
||||||
|
}
|
||||||
|
if (result == null) {
|
||||||
|
result = joinQuery(tn, type);
|
||||||
|
} else {
|
||||||
|
result.retainAll(joinQuery(tn, type));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Set<Long> unionQuery(List<String> tagNames, String type) throws Exception {
|
||||||
List<TagDo> tags = tagDao.findAllByNames(tagNames.toArray(new String[tagNames.size()]), TagEntity.READSET_FULL);
|
List<TagDo> tags = tagDao.findAllByNames(tagNames.toArray(new String[tagNames.size()]), TagEntity.READSET_FULL);
|
||||||
if (tags.size() == 0) return new ArrayList<>();
|
if (tags.size() == 0) return new HashSet<>();
|
||||||
|
|
||||||
Long[] tagIds = new Long[tags.size()];
|
Long[] tagIds = new Long[tags.size()];
|
||||||
for (int i = 0; i < tagIds.length; i++) {
|
for (int i = 0; i < tagIds.length; i++) {
|
||||||
tagIds[i] = tags.get(i).getId();
|
tagIds[i] = tags.get(i).getId();
|
||||||
}
|
}
|
||||||
|
|
||||||
List<Long> result = new ArrayList<>();
|
Set<Long> result = new HashSet<>();
|
||||||
for (TagItemDo d : tagItemDao.findByTagsAndType(tagIds, type, TagItemEntity.READSET_FULL)) {
|
for (TagItemDo d : tagItemDao.findByTagsAndType(tagIds, type, TagItemEntity.READSET_FULL)) {
|
||||||
result.add(d.getItemId());
|
result.add(d.getItemId());
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Set<Long> joinQuery(List<String> tagNames, String type) throws Exception {
|
||||||
|
List<TagDo> tags = tagDao.findAllByNames(tagNames.toArray(new String[tagNames.size()]), TagEntity.READSET_FULL);
|
||||||
|
if (tags.size() == 0) return new HashSet<>();
|
||||||
|
|
||||||
|
Long[] tagIds = new Long[tags.size()];
|
||||||
|
for (int i = 0; i < tagIds.length; i++) {
|
||||||
|
tagIds[i] = tags.get(i).getId();
|
||||||
|
}
|
||||||
|
if (tagIds.length < tagNames.size()) return new HashSet<>();
|
||||||
|
|
||||||
|
int joinedValue = tagIds.length;
|
||||||
|
Map<Long, Counter> marker = new HashMap<>();
|
||||||
|
for (TagItemDo d : tagItemDao.findByTagsAndType(tagIds, type, TagItemEntity.READSET_FULL)) {
|
||||||
|
Counter m = marker.get(d.getItemId());
|
||||||
|
if (m == null) {
|
||||||
|
marker.put(d.getItemId(), new Counter());
|
||||||
|
} else {
|
||||||
|
m.incr();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Set<Long> result = new HashSet<>();
|
||||||
|
for (Map.Entry<Long, Counter> e : marker.entrySet()) {
|
||||||
|
if (e.getValue().get() == joinedValue) result.add(e.getKey());
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<Long> query(String tagName, String type) throws Exception {
|
public List<Long> query(String tagName, String type) throws Exception {
|
||||||
TagDo d = tagDao.findByName(tagName, TagEntity.READSET_FULL);
|
TagDo d = tagDao.findByName(tagName, TagEntity.READSET_FULL);
|
||||||
|
@ -64,4 +119,16 @@ public class TagServiceImpl implements TagService {
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private class Counter {
|
||||||
|
int count = 1;
|
||||||
|
|
||||||
|
public void incr() {
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int get() {
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -209,6 +209,7 @@
|
||||||
</entity>
|
</entity>
|
||||||
<entity name="property-key" table="property_key" alias="pk" do-class="PropertyKeyDo">
|
<entity name="property-key" table="property_key" alias="pk" do-class="PropertyKeyDo">
|
||||||
<var name="ids" value-type="Long[]"/>
|
<var name="ids" value-type="Long[]"/>
|
||||||
|
<var name="names" value-type="String[]"/>
|
||||||
<query-defs>
|
<query-defs>
|
||||||
<query name="find-all-by-ids" type="SELECT" multiple="true">
|
<query name="find-all-by-ids" type="SELECT" multiple="true">
|
||||||
<param name="ids"/>
|
<param name="ids"/>
|
||||||
|
@ -238,6 +239,16 @@
|
||||||
]]>
|
]]>
|
||||||
</statement>
|
</statement>
|
||||||
</query>
|
</query>
|
||||||
|
<query name="find-by-names" type="SELECT" multiple="true">
|
||||||
|
<param name="names"/>
|
||||||
|
<statement>
|
||||||
|
<![CDATA[
|
||||||
|
SELECT <FIELDS/>
|
||||||
|
FROM <TABLE/>
|
||||||
|
WHERE <FIELD name='name'/> in <IN>${names}</IN>
|
||||||
|
]]>
|
||||||
|
</statement>
|
||||||
|
</query>
|
||||||
<query name="update" type="UPDATE">
|
<query name="update" type="UPDATE">
|
||||||
<param name="id"/>
|
<param name="id"/>
|
||||||
<statement>
|
<statement>
|
||||||
|
|
Loading…
Reference in a new issue