/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package reportgen.math.reference.subreport;
import reportgen.prototype.utils.RowCount;
import java.util.ArrayList;
import java.util.Collection;
import reportgen.prototype.stream.SQLStream;
import reportgen.utils.ReportException;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import org.jdom.Element;
import reportgen.prototype.context.group.ContextGroup;
import reportgen.prototype.context.Context;
import reportgen.ren.executer.QueryExecuterSub;
import reportgen.ren.executer.SubReportColumn;
import reportgen.math.MathExpressionOperand;
import reportgen.prototype.UsedReportableType;
import reportgen.utils.Atom;
/**
*
* @author axe
*/
public class MathExpressionSubReportColumnRef extends MathExpressionOperand {
public static final ContextGroup GROUP = new SubreportContextGroup();
public static final String TAG = "subrepref";
private static final String QUERYID = "reportid";
private SubReportColumn column;
public MathExpressionSubReportColumnRef(SubReportColumn column, Context context) {
super(context);
this.column = column;
}
public MathExpressionSubReportColumnRef(Element element, Context context) throws ReportException {
super(element, context);
QueryExecuterSub query = context.getSubreport(new Atom(getStringAttribute(element, QUERYID)));
int index = query.getColumnIndex(element.getText());
column = new SubReportColumn(query, index);
}
@Override
protected void toXML(Element root) {
root.setAttribute(QUERYID, String.valueOf(column.getReport().getAtom()));
root.addContent(column.getColumnTitle());
}
@Override
public MathExpressionSubReportColumnRef makeClone() throws ReportException {
return new MathExpressionSubReportColumnRef(toXML(), getParentContext());
}
@Override
public ContextGroup getContextGroup() {
return GROUP;
}
@Override
protected String getRootTag() {
return TAG;
}
public SubReportColumn getValue() {
return column;
}
public void setValue(SubReportColumn column) {
this.column = column;
}
@Override
public Class getCls() throws ReportException {
return column.getCls();
}
@Override
public String toString() {
return column.toString();
}
@Override
public void appendToQuery(SQLStream sql, Map model) throws ReportException {
Object value = getValue(null);
RowCount rowCount = column.getReport().getActiveRows();
if (!rowCount.isSingle()) {
Collection set = null;
if(value instanceof Collection) {
set = (Collection) value;
} else {
set = new ArrayList();
set.add(value);
}
Iterator it = set.iterator();
if (!it.hasNext()) {
throw new ReportException("Ошибка при выполнении подотчета '"
+ column.getReport().getReportTitle() + "' - подотчет вернул 0 строк");
}
sql.append("(");
while (it.hasNext()) {
sql.appendParam(it.next());
if (it.hasNext()) {
sql.append(",");
}
}
sql.append(")");
} else {
sql.appendParam(value);
}
}
@Override
public Object getValue(Map constants) throws ReportException {
return column.getReport().getColValue(column.getCol());
}
@Override
public void buildUsedSet(UsedReportableType cls, Set set) {
if(cls == UsedReportableType.subreport_column) {
set.add(this);
}
}
@Override
public boolean containsMissingVariables() {
//if omitted while cannot be, then permit error happend later
return column.getReport().isCanBeOmitted()
&& column.getReport().isOmitted();
}
@Override
public boolean isContain(Object entity) {
if (column.getReport() == entity) {
return true;
}
return super.isContain(entity);
}
}