You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

108 lines
3.5 KiB

/*******************************************************************************
* Copyright 2017 Bstek
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy
* of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
******************************************************************************/
package com.bstek.ureport.build.aggregate;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.bstek.ureport.build.BindData;
import com.bstek.ureport.build.Context;
import com.bstek.ureport.definition.Order;
import com.bstek.ureport.definition.value.GroupItem;
import com.bstek.ureport.expression.model.Condition;
import com.bstek.ureport.expression.model.expr.dataset.DatasetExpression;
import com.bstek.ureport.model.Cell;
import com.bstek.ureport.utils.DataUtils;
/**
* @author Jacky.gao
* @since 2017年3月29日
*/
public class CustomGroupAggregate extends Aggregate {
@Override
public List<BindData> aggregate(DatasetExpression expr, Cell cell,Context context) {
List<?> objList=DataUtils.fetchData(cell, context, expr.getDatasetName());
List<BindData> list = doAggregate(expr, cell, context, objList);
return list;
}
protected List<BindData> doAggregate(DatasetExpression expr, Cell cell,Context context, List<?> objList) {
List<BindData> list=new ArrayList<BindData>();
List<GroupItem> groupItems=expr.getGroupItems();
if(objList.size()==0){
list.add(new BindData(""));
return list;
}else if(objList.size()==1){
Object o=objList.get(0);
boolean conditionResult=doCondition(expr.getCondition(),cell,o,context);
if(!conditionResult){
list.add(new BindData(""));
return list;
}
String itemName=groupData(groupItems, cell, context, o);
if(itemName==null){
list.add(new BindData(""));
return list;
}
List<Object> rowList=new ArrayList<Object>();
rowList.add(o);
list.add(new BindData(itemName,rowList));
return list;
}
Map<Object,List<Object>> map=new HashMap<Object,List<Object>>();
for(Object o:objList){
boolean conditionResult=doCondition(expr.getCondition(),cell,o,context);
if(!conditionResult){
continue;
}
String itemName=groupData(groupItems, cell, context, o);
if(itemName==null){
continue;
}
List<Object> rowList=null;
if(map.containsKey(itemName)){
rowList=map.get(itemName);
}else{
rowList=new ArrayList<Object>();
map.put(itemName, rowList);
list.add(new BindData(itemName,rowList));
}
rowList.add(o);
}
if(list.size()==0){
List<Object> rowList=new ArrayList<Object>();
rowList.add(new HashMap<String,Object>());
list.add(new BindData("",rowList));
}
if(list.size()>1){
Order order=expr.getOrder();
orderBindDataList(list, order);
}
return list;
}
private String groupData(List<GroupItem> groupItems, Cell cell,Context context,Object o){
for(GroupItem item:groupItems){
Condition condition=item.getCondition();
boolean doCondition=doCondition(condition, cell, o, context);
if(doCondition){
return item.getName();
}
}
return null;
}
}