Author: tchemit Date: 2012-01-27 23:17:32 +0100 (Fri, 27 Jan 2012) New Revision: 302 Url: http://forge.codelutin.com/repositories/revision/echobase/302 Log: Evolution #673: Rendre op?\195?\169rationnel les filtres sur l'?\195?\169diteur d'entit?\195?\169 Modified: trunk/echobase-entities/src/main/java/fr/ifremer/echobase/entities/meta/ColumnMeta.java trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/DbEditorService.java trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/FilterPagerBean.java trunk/echobase-ui/src/main/java/fr/ifremer/echobase/ui/actions/dbeditor/GetEntities.java trunk/echobase-ui/src/main/webapp/WEB-INF/jsp/dbeditor/dbeditor.jsp Modified: trunk/echobase-entities/src/main/java/fr/ifremer/echobase/entities/meta/ColumnMeta.java =================================================================== --- trunk/echobase-entities/src/main/java/fr/ifremer/echobase/entities/meta/ColumnMeta.java 2012-01-27 18:06:10 UTC (rev 301) +++ trunk/echobase-entities/src/main/java/fr/ifremer/echobase/entities/meta/ColumnMeta.java 2012-01-27 22:17:32 UTC (rev 302) @@ -24,6 +24,7 @@ package fr.ifremer.echobase.entities.meta; import org.nuiton.topia.persistence.TopiaEntity; +import org.nuiton.util.ObjectUtil; import java.io.Serializable; import java.util.Date; @@ -75,13 +76,17 @@ } public boolean isDate() { - return Date.class.equals(type); + return Date.class.isAssignableFrom(type); } public boolean isBoolean() { return boolean.class.equals(type); } + public boolean isNumber() { + return !isBoolean() && (type.isPrimitive() || Number.class.isAssignableFrom(type)); + } + protected ColumnMeta(String name, Class<?> type) { this.name = name; this.type = type; Modified: trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/DbEditorService.java =================================================================== --- trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/DbEditorService.java 2012-01-27 18:06:10 UTC (rev 301) +++ trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/DbEditorService.java 2012-01-27 22:17:32 UTC (rev 302) @@ -37,6 +37,7 @@ import fr.ifremer.echobase.services.csv.EntityCsvModel; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.math.NumberUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.nuiton.topia.TopiaException; @@ -50,6 +51,8 @@ import org.nuiton.util.csv.ExportableColumn; import org.nuiton.util.csv.ImportExportModel; import org.nuiton.util.csv.ImportableColumn; +import org.nuiton.util.decorator.JXPathDecorator; +import sun.reflect.generics.reflectiveObjects.NotImplementedException; import java.util.Collection; import java.util.List; @@ -136,65 +139,76 @@ if (pager != null && pager.canFilter()) { + DecoratorService decoratorService = getDecoratorService(); + // prepare the filter hql code List<FilterPagerBean.FilterRule> rules = pager.getRules(); List<String> strFilterRules = Lists.newLinkedList(); + long timestamp = System.currentTimeMillis(); + int index = 0; for (FilterPagerBean.FilterRule rule : rules) { String ruleFilter = null; String field = rule.getField(); + + ColumnMeta columnMeta = tableMeta.getColumns(field); + Preconditions.checkNotNull( + columnMeta, "no property named " + columnMeta); + FilterPagerBean.Operation op = rule.getOp(); String data = rule.getData(); - String paramName = field + "_" + System.currentTimeMillis(); + String paramName = field + "_" + timestamp + (index++); String propertyName = "e." + field; - switch (op) { - case eq: - ruleFilter = propertyName + " = :" + paramName; - filterParams.put(paramName, data); - break; - case ne: - ruleFilter = propertyName + " != :" + paramName; - filterParams.put(paramName, data); - break; - case cn: - ruleFilter = propertyName + " like :" + paramName; - filterParams.put(paramName, data); - break; - case nc: - ruleFilter = propertyName + " not like :" + paramName; - filterParams.put(paramName, data); - break; - case bw: - break; - case bn: - break; - case ew: - break; - case en: - break; - case lt: - break; - case le: - break; - case gt: - break; - case ge: - break; - case nu: - ruleFilter = propertyName + " is null"; - break; - case nn: - ruleFilter = propertyName + " is not null"; - break; - case in: - break; - case ni: - break; + Object realData = data; + if (columnMeta.isFK()) { + + // must do a select in using the decoration pattern + + JXPathDecorator<?> decorator = + (JXPathDecorator<?>) decoratorService.getDecorator(getLocale(), + columnMeta.getType(), + null); + + if (decorator.getNbToken() == 1) { + + // simple case one token + String token = "f." + decorator.getProperty(0); + + String subQuery = op.toHql(paramName, + token, + data, + filterParams); + + ruleFilter = propertyName + " in ( Select f From " + columnMeta.getType().getName() + " f where " + subQuery + ")"; + } else { + + throw new NotImplementedException(); + } + + + } else { + + if (columnMeta.isNumber()) { + if (columnMeta.getType()==int.class || + columnMeta.getType()==Integer.class) { + realData = Integer.valueOf(data); + } else { + + realData = Double.valueOf(data); + } + } else if (columnMeta.isDate()) { + propertyName = "str(" + propertyName + ")"; + } + ruleFilter = op.toHql(paramName, + propertyName, + realData, + filterParams); + } - if (ruleFilter != null) { - ruleFilter = "(" + ruleFilter + ")"; - strFilterRules.add(ruleFilter); - } + + + strFilterRules.add("(" + ruleFilter + ")"); + } if (CollectionUtils.isNotEmpty(strFilterRules)) { @@ -217,6 +231,11 @@ countQuery.addParam(paramName, paramValue); } countQuery.addWhere(filterHql); + + String fullQuery = countQuery.fullQuery(); + if (log.isInfoEnabled()) { + log.info("fullquery = " + fullQuery); + } } int count = dao.countByQuery(countQuery); Modified: trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/FilterPagerBean.java =================================================================== --- trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/FilterPagerBean.java 2012-01-27 18:06:10 UTC (rev 301) +++ trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/FilterPagerBean.java 2012-01-27 22:17:32 UTC (rev 302) @@ -26,6 +26,7 @@ import com.google.common.collect.Lists; import org.apache.commons.collections.CollectionUtils; import org.nuiton.util.PagerUtil; +import sun.reflect.generics.reflectiveObjects.NotImplementedException; import java.io.Serializable; import java.util.Collection; @@ -48,37 +49,145 @@ public enum Operation { /** Equals operator. */ - eq, + eq { + @Override + public String toHql(String paramName, String propertyName, Object data, Map<String, Object> filterParams) { + String ruleFilter = propertyName + " = :" + paramName; + filterParams.put(paramName, data); + return ruleFilter; + } + }, /** Not equals operator. */ - ne, + ne { + @Override + public String toHql(String paramName, String propertyName, Object data, Map<String, Object> filterParams) { + String ruleFilter = propertyName + " != :" + paramName; + filterParams.put(paramName, data); + return ruleFilter; + } + }, /** Contains operator. */ - cn, + cn { + @Override + public String toHql(String paramName, String propertyName, Object data, Map<String, Object> filterParams) { + String ruleFilter = propertyName + " like :" + paramName; + filterParams.put(paramName, "%" + data + "%"); + return ruleFilter; + } + }, /** Not contains operator. */ - nc, + nc { + @Override + public String toHql(String paramName, String propertyName, Object data, Map<String, Object> filterParams) { + String ruleFilter = propertyName + " not like :" + paramName; + filterParams.put(paramName, "%" + data + "%"); + return ruleFilter; + } + }, /** Begins with operator. */ - bw, + bw { + @Override + public String toHql(String paramName, String propertyName, Object data, Map<String, Object> filterParams) { + String ruleFilter = propertyName + " like :" + paramName; + filterParams.put(paramName, data + "%"); + return ruleFilter; + } + }, /** Not between with operator. */ - bn, + bn { + @Override + public String toHql(String paramName, String propertyName, Object data, Map<String, Object> filterParams) { + String ruleFilter = propertyName + " not like :" + paramName; + filterParams.put(paramName, data + "%"); + return ruleFilter; + } + }, /** Ends with operator. */ - ew, + ew { + @Override + public String toHql(String paramName, String propertyName, Object data, Map<String, Object> filterParams) { + String ruleFilter = propertyName + " like :" + paramName; + filterParams.put(paramName, "%" + data); + return ruleFilter; + } + }, /** Not End with operator. */ - en, + en { + @Override + public String toHql(String paramName, String propertyName, Object data, Map<String, Object> filterParams) { + String ruleFilter = propertyName + " not like :" + paramName; + filterParams.put(paramName, "%" + data); + return ruleFilter; + } + }, /** Lesser than operator. */ - lt, + lt { + @Override + public String toHql(String paramName, String propertyName, Object data, Map<String, Object> filterParams) { + String ruleFilter = propertyName + " < :" + paramName; + filterParams.put(paramName, data); + return ruleFilter; + } + }, /** Lesser or equals operator. */ - le, + le { + @Override + public String toHql(String paramName, String propertyName, Object data, Map<String, Object> filterParams) { + String ruleFilter = propertyName + " <= :" + paramName; + filterParams.put(paramName, data); + return ruleFilter; + } + }, /** Greater than operator. */ - gt, + gt { + @Override + public String toHql(String paramName, String propertyName, Object data, Map<String, Object> filterParams) { + String ruleFilter = propertyName + " > :" + paramName; + filterParams.put(paramName, data); + return ruleFilter; + } + }, /** Greater or equals operator. */ - ge, + ge { + @Override + public String toHql(String paramName, String propertyName, Object data, Map<String, Object> filterParams) { + String ruleFilter = propertyName + " >= :" + paramName; + filterParams.put(paramName, data); + return ruleFilter; + } + }, /** Is null operator. */ - nu, + nu { + @Override + public String toHql(String paramName, String propertyName, Object data, Map<String, Object> filterParams) { + String ruleFilter = propertyName + " is null"; + return ruleFilter; + } + }, /** Is not null operator. */ - nn, + nn { + @Override + public String toHql(String paramName, String propertyName, Object data, Map<String, Object> filterParams) { + String ruleFilter = propertyName + " is not null"; + return ruleFilter; + } + }, /** Is among operator. */ - in, + in { + @Override + public String toHql(String paramName, String propertyName, Object data, Map<String, Object> filterParams) { + throw new NotImplementedException(); + } + }, /** Not is among operator. */ - ni + ni { + @Override + public String toHql(String paramName, String propertyName, Object data, Map<String, Object> filterParams) { + throw new NotImplementedException(); + } + }; + + public abstract String toHql(String paramName, String propertyName, Object data, Map<String, Object> filterParams); } public static class FilterRule implements Serializable { @@ -122,7 +231,7 @@ } public boolean canFilter() { - return groupOp!=null && CollectionUtils.isNotEmpty(rules); + return groupOp != null && CollectionUtils.isNotEmpty(rules); } protected OperationGroup groupOp; Modified: trunk/echobase-ui/src/main/java/fr/ifremer/echobase/ui/actions/dbeditor/GetEntities.java =================================================================== --- trunk/echobase-ui/src/main/java/fr/ifremer/echobase/ui/actions/dbeditor/GetEntities.java 2012-01-27 18:06:10 UTC (rev 301) +++ trunk/echobase-ui/src/main/java/fr/ifremer/echobase/ui/actions/dbeditor/GetEntities.java 2012-01-27 22:17:32 UTC (rev 302) @@ -92,10 +92,6 @@ log.debug("sord = " + ascendantOrder); } - if (log.isInfoEnabled()) { - log.info("filter " + getFilters()); - } - DbEditorService service = newService(DbEditorService.class); datas = service.getDatas( Modified: trunk/echobase-ui/src/main/webapp/WEB-INF/jsp/dbeditor/dbeditor.jsp =================================================================== --- trunk/echobase-ui/src/main/webapp/WEB-INF/jsp/dbeditor/dbeditor.jsp 2012-01-27 18:06:10 UTC (rev 301) +++ trunk/echobase-ui/src/main/webapp/WEB-INF/jsp/dbeditor/dbeditor.jsp 2012-01-27 22:17:32 UTC (rev 302) @@ -253,7 +253,7 @@ rowList="10,15,20,50,100,250,500" rowNum="10" onSelectRowTopics="datas-rowSelect" onCompleteTopics="datas-clearSelect,datas-CompleteTopics" - navigatorSearchOptions="{multipleGroup:false,multipleSearch:true,sopt:['eq','ne','cn','nc','lt','gt','nu','nn']}"> + navigatorSearchOptions="{multipleGroup:false,multipleSearch:true,sopt:['eq','ne','cn','nc','bw','bn','ew','en','lt','le','gt','ge','nu','nn']}"> <%--navigatorSearchOptions="{multipleGroup:false,showQuery:true,multipleSearch:true,sopt:['eq','ne','cn','nc','bw','bn','ew','en','lt','le','gt','ge','nu','nn','in','ni']}"--%> @@ -265,20 +265,32 @@ <sjg:gridColumn name="%{#meta.name}" title="%{#meta.name}" formatter='formatEntityLabel' + searchoptions="{sopt:['eq','ne','cn','nc','bw','bn','ew','en','nu','nn']}" sortable="true"/> </s:if> <s:elseif test="#meta.name == 'id'"> <sjg:gridColumn name="ID" title="id" - sortable="true" editable="true"/> + sortable="true"/> </s:elseif> + <s:elseif test="#meta.date || #meta.number"> + <sjg:gridColumn name="%{#meta.name}" + title="%{#meta.name}" + searchoptions="{sopt:['eq','ne','cn','nc','bw','bn','ew','en','lt','le','gt','ge','nu','nn']}" + sortable="true"/> + </s:elseif> + <%--s:elseif test="#meta.number"> + <sjg:gridColumn name="%{#meta.name}" + title="%{#meta.name}" + searchoptions="{sopt:['eq','ne','cn','nc','bw','bn','ew','en','lt','le','gt','ge','nu','nn']}" + sortable="true"/> + </s:elseif--%> <s:else> <sjg:gridColumn name="%{#meta.name}" title="%{#meta.name}" - sortable="true" editable="true"/> + searchoptions="{sopt:['eq','ne','cn','nc','bw','bn','ew','en','nu','nn']}" + sortable="true"/> </s:else> - - </s:iterator> </sjg:grid>