Newer
Older
RDLCanvas / src / main / java / org / ntlab / rdlcanvas / generaterdl / MetaTableGenerateRDL.java
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)));
        }
    }
}