Author: tchemit Date: 2012-01-27 19:06:10 +0100 (Fri, 27 Jan 2012) New Revision: 301 Url: http://forge.codelutin.com/repositories/revision/echobase/301 Log: Evolution #673: Rendre op?\195?\169rationnel les filtres sur l'?\195?\169diteur d'entit?\195?\169 Added: trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/FilterPagerBean.java Modified: trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/DbEditorService.java trunk/echobase-ui/src/main/java/fr/ifremer/echobase/ui/actions/AbstractJSONPaginedAction.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-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 15:50:00 UTC (rev 300) +++ trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/DbEditorService.java 2012-01-27 18:06:10 UTC (rev 301) @@ -24,6 +24,7 @@ package fr.ifremer.echobase.services; import com.google.common.base.Preconditions; +import com.google.common.collect.Lists; import com.google.common.collect.Maps; import fr.ifremer.echobase.EchoBaseTechnicalException; import fr.ifremer.echobase.entities.EchoBaseEntityEnum; @@ -34,6 +35,7 @@ import fr.ifremer.echobase.entities.meta.TableMeta; import fr.ifremer.echobase.services.csv.CsvModelUtil; import fr.ifremer.echobase.services.csv.EntityCsvModel; +import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -88,7 +90,7 @@ //TODO Use an object to filter datas public Map<?, ?>[] getDatas(EchoBaseEntityEnum entityType, - PagerUtil.PagerBean pager, + FilterPagerBean pager, String sidx, Boolean ascendantOrder) { @@ -115,7 +117,7 @@ } public <E extends TopiaEntity> List<E> getEntities(TableMeta tableMeta, - PagerUtil.PagerBean pager, + FilterPagerBean pager, String sidx, Boolean ascendantOrder, String extraWhereQuery) { @@ -128,6 +130,95 @@ // first query to count datas TopiaQuery countQuery = dao.createQuery("e"); countQuery.addSelect("count(*)"); + String filterHql = null; + + Map<String, Object> filterParams = Maps.newHashMap(); + + if (pager != null && pager.canFilter()) { + + // prepare the filter hql code + List<FilterPagerBean.FilterRule> rules = pager.getRules(); + List<String> strFilterRules = Lists.newLinkedList(); + for (FilterPagerBean.FilterRule rule : rules) { + String ruleFilter = null; + + String field = rule.getField(); + FilterPagerBean.Operation op = rule.getOp(); + String data = rule.getData(); + String paramName = field + "_" + System.currentTimeMillis(); + 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; + } + if (ruleFilter != null) { + ruleFilter = "(" + ruleFilter + ")"; + strFilterRules.add(ruleFilter); + } + } + + if (CollectionUtils.isNotEmpty(strFilterRules)) { + FilterPagerBean.OperationGroup groupOp = pager.getGroupOp(); + filterHql = StringUtils.join(strFilterRules, groupOp.name()); + } + } + + if (filterHql != null) { + if (log.isInfoEnabled()) { + log.info("filterHql = " + filterHql); + } + for (Map.Entry<String, Object> e : filterParams.entrySet()) { + String paramName = e.getKey(); + Object paramValue = e.getValue(); + if (log.isInfoEnabled()) { + log.info("filterParam = " + + paramName + "/" + paramValue); + } + countQuery.addParam(paramName, paramValue); + } + countQuery.addWhere(filterHql); + } + int count = dao.countByQuery(countQuery); TopiaQuery query = dao.createQuery("e"); @@ -148,6 +239,15 @@ log.debug("pageCount= " + pager.getPagesNumber()); } + if (filterHql != null) { + for (Map.Entry<String, Object> entry : filterParams.entrySet()) { + String paramName = entry.getKey(); + Object paramValue = entry.getValue(); + query.addParam(paramName, paramValue); + } + query.addWhere(filterHql); + } + if (StringUtils.isNotEmpty(sidx)) { if (ascendantOrder) { query.addOrder(sidx); Added: trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/FilterPagerBean.java =================================================================== --- trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/FilterPagerBean.java (rev 0) +++ trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/FilterPagerBean.java 2012-01-27 18:06:10 UTC (rev 301) @@ -0,0 +1,186 @@ +/* + * #%L + * EchoBase :: Services + * + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2011 - 2012 Ifremer, Codelutin + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * #L% + */ +package fr.ifremer.echobase.services; + +import com.google.common.collect.Lists; +import org.apache.commons.collections.CollectionUtils; +import org.nuiton.util.PagerUtil; + +import java.io.Serializable; +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * Pager bean with filtering datas. + * + * @author tchemit <chemit@codelutin.com> + * @since 0.3 + */ +public class FilterPagerBean extends PagerUtil.PagerBean { + + private static final long serialVersionUID = 1L; + + public enum OperationGroup { + OR, AND + } + + public enum Operation { + /** Equals operator. */ + eq, + /** Not equals operator. */ + ne, + /** Contains operator. */ + cn, + /** Not contains operator. */ + nc, + /** Begins with operator. */ + bw, + /** Not between with operator. */ + bn, + /** Ends with operator. */ + ew, + /** Not End with operator. */ + en, + /** Lesser than operator. */ + lt, + /** Lesser or equals operator. */ + le, + /** Greater than operator. */ + gt, + /** Greater or equals operator. */ + ge, + /** Is null operator. */ + nu, + /** Is not null operator. */ + nn, + /** Is among operator. */ + in, + /** Not is among operator. */ + ni + } + + public static class FilterRule implements Serializable { + + private static final long serialVersionUID = 1L; + + protected final Operation op; + + protected final String field; + + protected final String data; + + public FilterRule(Operation op, + String field, + String data) { + this.op = op; + this.field = field; + this.data = data; + } + + public Operation getOp() { + return op; + } + + public String getField() { + return field; + } + + public String getData() { + return data; + } + } + + public static FilterPagerBeanBuilder newFilterPagerBeanBuilder(String operationGroup) { + OperationGroup operationGroup1 = OperationGroup.valueOf(operationGroup); + FilterPagerBeanBuilder builder = new FilterPagerBeanBuilder(operationGroup1); + return builder; + } + + public FilterPagerBean() { + } + + public boolean canFilter() { + return groupOp!=null && CollectionUtils.isNotEmpty(rules); + } + + protected OperationGroup groupOp; + + private List<FilterRule> rules; + + public OperationGroup getGroupOp() { + return groupOp; + } + + public void setGroupOp(OperationGroup groupOp) { + this.groupOp = groupOp; + } + + public List<FilterRule> getRules() { + return rules; + } + + public void setRules(List<FilterRule> rules) { + this.rules = rules; + } + + public static class FilterPagerBeanBuilder { + + protected final OperationGroup groupOp; + + protected final List<FilterRule> rules; + + public FilterPagerBeanBuilder(OperationGroup groupOp) { + this.groupOp = groupOp; + rules = Lists.newLinkedList(); + } + + public FilterPagerBeanBuilder addOperations(Collection<Map<String, String>> operations) { + for (Map<String, String> operation : operations) { + addRule(operation); + } + return this; + } + + public FilterPagerBeanBuilder addRule(Map<String, String> ruleMap) { + String op = ruleMap.get("op"); + String property = ruleMap.get("field"); + String value = ruleMap.get("data"); + Operation operator = Operation.valueOf(op); + return addRule(new FilterRule(operator, property, value)); + } + + public FilterPagerBeanBuilder addRule(FilterRule rule) { + rules.add(rule); + return this; + } + + public void flush(FilterPagerBean bean) { + bean.setGroupOp(groupOp); + bean.setRules(rules); + } + + + } +} Property changes on: trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/FilterPagerBean.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: svn:eol-style + native Modified: trunk/echobase-ui/src/main/java/fr/ifremer/echobase/ui/actions/AbstractJSONPaginedAction.java =================================================================== --- trunk/echobase-ui/src/main/java/fr/ifremer/echobase/ui/actions/AbstractJSONPaginedAction.java 2012-01-27 15:50:00 UTC (rev 300) +++ trunk/echobase-ui/src/main/java/fr/ifremer/echobase/ui/actions/AbstractJSONPaginedAction.java 2012-01-27 18:06:10 UTC (rev 301) @@ -23,11 +23,14 @@ */ package fr.ifremer.echobase.ui.actions; +import fr.ifremer.echobase.services.FilterPagerBean; import org.apache.commons.lang3.StringUtils; import org.apache.struts2.json.JSONException; import org.apache.struts2.json.JSONUtil; -import org.nuiton.util.PagerUtil; +import java.util.Collection; +import java.util.Map; + /** * Abstract JSON action with pagination support. * @@ -46,7 +49,7 @@ public abstract Integer getRecords(); - protected PagerUtil.PagerBean pager = PagerUtil.newPagerBean(); + protected FilterPagerBean pager = new FilterPagerBean(); // sorting order - asc or desc protected String sord; @@ -108,11 +111,19 @@ return StringUtils.isNotEmpty(sidx); } - protected Object getFilterObject() throws JSONException { - Object filterObject = null; + protected void initFilter() throws JSONException { + if (StringUtils.isNotEmpty(filters)) { - filterObject = JSONUtil.deserialize(filters); + Map<String, Object> filterObject = + (Map<String, Object>) JSONUtil.deserialize(filters); + + String groupOp = (String) filterObject.get("groupOp"); + Collection<Map<String, String>> rules = + (Collection<Map<String, String>>) filterObject.get("rules"); + + FilterPagerBean.newFilterPagerBeanBuilder(groupOp). + addOperations(rules). + flush(pager); } - return filterObject; } } 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 15:50:00 UTC (rev 300) +++ trunk/echobase-ui/src/main/java/fr/ifremer/echobase/ui/actions/dbeditor/GetEntities.java 2012-01-27 18:06:10 UTC (rev 301) @@ -83,15 +83,19 @@ Boolean ascendantOrder = isSortAscendant(); String sortColumn = getSortColumn(); - Object filterObject = getFilterObject(); + initFilter(); + if (log.isDebugEnabled()) { log.debug("filters = " + getFilters()); - log.debug("filterObject = " + filterObject); log.debug("sidx = " + sortColumn); 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 15:50:00 UTC (rev 300) +++ trunk/echobase-ui/src/main/webapp/WEB-INF/jsp/dbeditor/dbeditor.jsp 2012-01-27 18:06:10 UTC (rev 301) @@ -253,8 +253,10 @@ rowList="10,15,20,50,100,250,500" rowNum="10" onSelectRowTopics="datas-rowSelect" onCompleteTopics="datas-clearSelect,datas-CompleteTopics" - navigatorSearchOptions="{multipleGroup:false,showQuery:true,multipleSearch:true,sopt:['eq','ne','cn','nc','bw','bn','ew','en','lt','le','gt','ge','nu','nn','in','ni']}"> + navigatorSearchOptions="{multipleGroup:false,multipleSearch:true,sopt:['eq','ne','cn','nc','lt','gt','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']}"--%> + <sjg:gridColumn name="id" title="id" hidden="true" editable="true"/> <s:iterator value="columnMetas" var="meta" status="status">