Você não pode selecionar mais de 25 tópicos
Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.
143 linhas
4.4 KiB
143 linhas
4.4 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.math.BigDecimal;
|
|
import java.util.ArrayList;
|
|
import java.util.List;
|
|
|
|
import com.bstek.ureport.Utils;
|
|
import com.bstek.ureport.build.BindData;
|
|
import com.bstek.ureport.build.Context;
|
|
import com.bstek.ureport.definition.value.Value;
|
|
import com.bstek.ureport.exception.ReportComputeException;
|
|
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年1月20日
|
|
*/
|
|
public class MinAggregate extends Aggregate {
|
|
@Override
|
|
public List<BindData> aggregate(DatasetExpression expr, Cell cell,Context context) {
|
|
String datasetName=expr.getDatasetName();
|
|
String property=expr.getProperty();
|
|
Cell leftCell=DataUtils.fetchLeftCell(cell, context, datasetName);
|
|
Cell topCell=DataUtils.fetchTopCell(cell, context, datasetName);
|
|
List<Object> leftList=null,topList=null;
|
|
if(leftCell!=null){
|
|
leftList=leftCell.getBindData();
|
|
}
|
|
if(topCell!=null){
|
|
topList=topCell.getBindData();
|
|
}
|
|
BigDecimal result=null;
|
|
if(leftList==null && topList==null){
|
|
List<?> data=context.getDatasetData(datasetName);
|
|
result=buildMin(data,property,cell,expr,context);
|
|
}else if(leftList==null){
|
|
result=buildMin(topList,property,cell,expr,context);
|
|
}else if(topList==null){
|
|
result=buildMin(leftList,property,cell,expr,context);
|
|
}else{
|
|
List<Object> list=null;
|
|
Object data=null;
|
|
String prop=null;
|
|
if(leftList.size()>topList.size()){
|
|
list=topList;
|
|
data=leftCell.getData();
|
|
Value value=leftCell.getValue();
|
|
DatasetExpression de=DataUtils.fetchDatasetExpression(value);
|
|
if(de==null){
|
|
throw new ReportComputeException("Unsupport value : "+value);
|
|
}
|
|
prop=de.getProperty();
|
|
}else{
|
|
list=leftList;
|
|
data=topCell.getData();
|
|
Value value=topCell.getValue();
|
|
DatasetExpression de=DataUtils.fetchDatasetExpression(value);
|
|
if(de==null){
|
|
throw new ReportComputeException("Unsupport value : "+value);
|
|
}
|
|
prop=de.getProperty();
|
|
}
|
|
Condition condition=getCondition(cell);
|
|
if(condition==null){
|
|
condition=expr.getCondition();
|
|
}
|
|
for(Object obj:list){
|
|
if(condition!=null && !condition.filter(cell, cell, obj, context)){
|
|
continue;
|
|
}
|
|
Object o=Utils.getProperty(obj, prop);
|
|
if((o!=null && data!=null && (o==data || o.equals(data))) || (o==null && data==null)){
|
|
Object value=Utils.getProperty(obj, property);
|
|
if(value==null || value.toString().equals("")){
|
|
continue;
|
|
}
|
|
BigDecimal b=Utils.toBigDecimal(value);
|
|
if(result==null){
|
|
result=b;
|
|
continue;
|
|
}
|
|
int v=result.compareTo(b);
|
|
if(v==1){
|
|
result=b;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
List<BindData> list=new ArrayList<BindData>();
|
|
if(result!=null){
|
|
list.add(new BindData(result.doubleValue(),null));
|
|
}else{
|
|
list.add(new BindData(0,null));
|
|
}
|
|
return list;
|
|
}
|
|
|
|
private BigDecimal buildMin(List<?> list,String property,Cell cell,DatasetExpression expr,Context context){
|
|
BigDecimal result=null;
|
|
Condition condition=getCondition(cell);
|
|
if(condition==null){
|
|
condition=expr.getCondition();
|
|
}
|
|
for(Object obj:list){
|
|
if(condition!=null && !condition.filter(cell, cell, obj, context)){
|
|
continue;
|
|
}
|
|
Object value=Utils.getProperty(obj, property);
|
|
if(value==null || value.toString().equals("")){
|
|
continue;
|
|
}
|
|
BigDecimal b=Utils.toBigDecimal(value);
|
|
if(result==null){
|
|
result=b;
|
|
continue;
|
|
}
|
|
int v=result.compareTo(b);
|
|
if(v==1){
|
|
result=b;
|
|
}
|
|
}
|
|
if(result==null)result=new BigDecimal(0);
|
|
return result;
|
|
}
|
|
}
|
|
|