/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package reportgen.math.reference.cross;
import java.util.Map;
import reportgen.prototype.stream.SQLStream;
import reportgen.utils.ReportException;
import java.util.Set;
import org.jdom.Element;
import reportgen.math.MathExpressionOperand;
import reportgen.prototype.UsedReportableType;
import reportgen.prototype.context.group.ContextGroup;
import reportgen.prototype.context.Context;
import reportgen.ren.executer.QueryExecuterSub;
import reportgen.ren.report.extendedformat.range.cross.CrossReport;
import reportgen.ren.report.extendedformat.range.cross.CrossReportColumn;
import reportgen.utils.Atom;
/**
* Математический элемент - значение из кросс отчета.
* Отличается от значения из подотчета тем, что будет использоваться только
* при расширенном форматировании результатов отчета. при этом будет использоваться
* каждая строка отчета в отдельности. Поэтому вне зависисимости от того,
* сколько строк возвращает кросс-отчет, данные для каждого столбца будут иметь
* скалярный тип.
*
* Будет использоваться в выражении условия выборки по столбцу и строке,
* а также при расчете значения ячейки.
* При этом модель данных используемая при расчете должна содержать не только
* ссылки и значения результатов отчета, но и должна быть контекстно-зависимой
* от текущих столбцов и строк
*
*
* @author axe
*/
public class MathExpressionCrossReportColumnRef extends MathExpressionOperand {
public static final ContextGroup GROUP = new CrossContextGroup();
public static final String TAG = "cross-repref";
private static final String CROSSID = "crossid";
private CrossReportColumn column;
public MathExpressionCrossReportColumnRef(CrossReportColumn column, Context context) {
super(context);
this.column = column;
}
public MathExpressionCrossReportColumnRef(Element element,
Context context) throws ReportException {
super(element, context);
CrossReport crossReport = context.getCrossReport(new Atom(getStringAttribute(element, CROSSID)));
String columnName = element.getText();
int index = crossReport.getSubReport().getColumnIndex(columnName);
column = new CrossReportColumn(crossReport, index);
}
@Override
protected void toXML(Element root) {
root.setAttribute(CROSSID, String.valueOf(column.getReport().getAtom()));
root.addContent(column.getColumnTitle());
}
@Override
public MathExpressionCrossReportColumnRef makeClone() throws ReportException {
return new MathExpressionCrossReportColumnRef(toXML(), getParentContext());
}
@Override
public ContextGroup getContextGroup() {
return GROUP;
}
@Override
protected String getRootTag() {
return TAG;
}
public CrossReportColumn getValue() {
return column;
}
public void setValue(CrossReportColumn column) {
this.column = column;
}
@Override
public Class getCls() throws ReportException {
return column.getCls();
}
@Override
public Object getValue(Map constants) throws ReportException {
return constants.get(column);
}
@Override
public void appendToQuery(SQLStream sql, Map model) throws ReportException {
throw new ReportException("Illegal use of MathExpressionCrossReportColumnRef");
}
@Override
public void buildUsedSet(UsedReportableType cls, Set set) {
if(cls == UsedReportableType.subreport_column) {
set.add(this);
}
}
@Override
public boolean containsMissingVariables() {
return false;
}
@Override
public boolean isContain(Object entity) {
if (column.getReport().equals(entity)) {
return true;
}
return super.isContain(entity);
}
@Override
public void validate() throws ReportException {
QueryExecuterSub rep = column.getReport().getSubReport();
if(rep.isCanBeOmitted() || rep.isOmitted()) {
throw new ReportException("Подотчет '" +
rep.getReportTitle() + "' используемый в качестве кросс-отчета "
+ "не может быть опциональным.");
}
}
@Override
public String toString() {
return column.toString();
}
}