package org.ntlab.rdlcanvas.generaterdl;
import org.ntlab.rdlcanvas.models.*;
import java.util.ArrayList;
import java.util.List;
public class MetaTableGenerateRDL extends BaseMetaGenerateRDL{
public MetaTableGenerateRDL(RDLSpec spec){
addMetaTableResourceDeclaration(spec);
addMetaTableFormula(spec);
}
private void addMetaTableResourceDeclaration(RDLSpec spec){
// ex table(1)::structure
addResourceDeclaration(spec, "table", 1, StructuralType.structure, null);
addResourceDeclaration(spec, "tableId", 1, StructuralType.id, RDLSpecLang.typeString);
addResourceDeclaration(spec, "keyName", 1, RDLSpecLang.typeString);
addResourceDeclaration(spec, "curKey", 1, RDLSpecLang.typeString);
addResourceDeclaration(spec, "columnName", 2, RDLSpecLang.typeString);
addResourceDeclaration(spec, "columnNo", 2, StructuralType.id, RDLSpecLang.typeInt);
addResourceDeclaration(spec, "columnValue", 2, RDLSpecLang.typeString);
addResourceDeclaration(spec, "key", 2, StructuralType.id, RDLSpecLang.typeString);
}
private void addMetaTableFormula(RDLSpec spec){
// ex table:tableId
addElementPairDependencyFormula(spec, "table", false, "tableId", false);
addElementPairDependencyFormula(spec, "table", false, "tableId", true);
addElementPairDependencyFormula(spec, "keyName", false, "table", false);
addNestedDependencyFormula(spec, "columnName", false, "columnNo", false, "table", false);
addNestedDependencyFormula(spec, "columnValue", false, "columnNo", false, "key", false, "table", false);
}
// [depending:depended01, depended02]:outsideDepended
public void addNestedDependencyFormula(RDLSpec spec, String depending, boolean dependingPrimed, String depended01, boolean depended01Primed, String depended02, boolean depended02Primed, String outsideDepended, boolean outsideDependedPrimed) {
List<RDLSpecEvaluatableTerm> dependedInsideList = new ArrayList<>();
List<RDLSpecEvaluatableTerm> dependedOutsideList = new ArrayList<>();
if(depended01Primed){
dependedInsideList.add(spec.getRDLSpecResourceDeclaration(depended01).getPrimedResource());
}else{
dependedInsideList.add(spec.getRDLSpecResourceDeclaration(depended01).getResource());
}
if(depended02Primed){
dependedInsideList.add(spec.getRDLSpecResourceDeclaration(depended02).getPrimedResource());
}else{
dependedInsideList.add(spec.getRDLSpecResourceDeclaration(depended02).getResource());
}
if(outsideDependedPrimed){
dependedOutsideList.add(spec.getRDLSpecResourceDeclaration(outsideDepended).getPrimedResource());
}else{
dependedOutsideList.add(spec.getRDLSpecResourceDeclaration(outsideDepended).getResource());
}
if(dependingPrimed){
spec.addRDLSpecStatement(new RDLSpecDependencyFormula(new RDLSpecDependency(new RDLSpecDependency(spec.getRDLSpecResourceDeclaration(depending).getPrimedResource(), dependedInsideList) ,dependedOutsideList)));
}else{
spec.addRDLSpecStatement(new RDLSpecDependencyFormula(new RDLSpecDependency(new RDLSpecDependency(spec.getRDLSpecResourceDeclaration(depending).getResource(), dependedInsideList) ,dependedOutsideList)));
}
}
}