package frame.object.dao; import frame.object.meta.EntityMeta; import frame.object.meta.Field; import frame.util.ContentBuilder; import frame.util.Util; import frame.variant.IVariantsConsumer; import frame.variant.IVariantsProvider; import frame.variant.VariantLink; import frame.variant.ValueType; import frame.variant.translator.ITranslator; import java.util.*; public class Filter implements IVariantsConsumer, IVariantsProvider { private EntityMeta entityMeta; private Map<String, FilterItem> items; private String rawFilter; private boolean raw = false; private boolean empty; public Filter() { items = new HashMap<String, FilterItem>(); } public Filter(String filter) { rawFilter = filter; raw = true; } public void addAll(EntityMeta entityMeta, Set<String> excludeNames, IVariantsProvider...valueProviders) throws Exception { this.entityMeta = entityMeta; for (int i = 0; i < valueProviders.length; i++) { IVariantsProvider provider = valueProviders[i]; VariantLink.moveOnConsumer(provider, this, excludeNames); } } public void add(String fieldName, String value) { this.addItem(fieldName, "=", value); } public void addItem(String fieldName, String operator, String value) { FilterItem item = new FilterItem(fieldName, operator, value); items.put(fieldName, item); } @Override public List<String> getVariantNameList() { List<String> result = new ArrayList<String>(); result.add("orderby"); return result; } @Override public boolean containsVariant(String name) { return "filter".equalsIgnoreCase(name); } @Override public Object getVariantValue(String name) { return toString(); } @Override public void setVariant(String name, Object value) throws Exception { if (value == null) { return; } if (entityMeta == null) { throw new Exception("filter entityMeta is null"); } if(!entityMeta.contains(name)) { return; } Field field = entityMeta.getField(name); if (field == null) { return; } ITranslator translator = field.getTranslator(); ValueType type = field.getValueType(); if (ValueType.String == type) { String stringValue = value.toString(); String segmentValue = null; //1. like if (stringValue.startsWith("(like)")) { if (stringValue.endsWith("(like)")) { //1.1 all like segmentValue = "'%" + stringValue.substring(7, stringValue.length() - 6) + "%'"; addItem(name, "like", segmentValue); } else { //1.2 left like segmentValue = "'%" + stringValue.substring(7) + "'"; addItem(name, "like", segmentValue); } } else if (stringValue.endsWith("(like)")) { //1.3 right like segmentValue = "'" + stringValue.substring(0, stringValue.length() - 6) + "%'"; addItem(name, "like", segmentValue); } else { //1.3 no like segmentValue = "'" + stringValue + "'"; addItem(name, "=", segmentValue); } } else { String segmentValue = translator.toSqlString(value); addItem(name, "=", segmentValue); } } @Override public void setVariants(IVariantsProvider... providers) throws Exception { if (providers == null || providers.length == 0) { return; } Set<String> keySet = items.keySet(); for (String key: keySet) { for (IVariantsProvider provider: providers) { if (provider.containsVariant(key)) { FilterItem item = items.get(key); Object value = provider.getVariantValue(key); if (!Util.isEmptyStr(value)) { item.setValue(String.valueOf(value)); } } } } } @Override public boolean isVariantNull(String name) { return empty; } public FilterItem getItemByName(String name) { if (items == null) { return null; } return items.get(name); } public FilterItem removeItemByName(String name) { if (items == null) { return null; } return items.remove(name); } public boolean isRaw() { return raw; } public String getRawFilter() { return rawFilter; } @Override public String toString() { if (raw) { return rawFilter; } if (items.isEmpty()) { return null; } ContentBuilder result = new ContentBuilder(" and "); Set<String> keySet = items.keySet(); for (String key : keySet) { FilterItem filterItem = items.get(key); result.append(filterItem.toSQLString()); } if (result.isEmpty()) { result.append(" 1 = 1 "); } return "(" + result + ")"; } }