package org.ntlab.rdlcanvas.generaterdl;
import org.ntlab.rdlcanvas.models.*;
import org.ntlab.rdlcanvas.parser.ArrayValue;
import org.ntlab.rdlcanvas.parser.StringValue;
import org.ntlab.rdlcanvas.parser.Value;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
public class TableGenerateRDL extends BaseGenerateRDL{
public TableGenerateRDL(Value value, RDLSpec spec){
//System.out.println(value.toString());
addTableRDL(value, spec);
}
public void addTableRDL(Value value, RDLSpec spec){
Map<StringValue, Value> tableMap = ((org.ntlab.rdlcanvas.parser.JsonValue)value).getJson();
for(StringValue key1 : tableMap.keySet()){
String tableNameString = key1.getStringValue();
Value meta = tableMap.get(key1);
Map<StringValue, Value> metaMap = ((org.ntlab.rdlcanvas.parser.JsonValue)meta).getJson();
for(StringValue key2 : metaMap.keySet()){
String metaIdString = key2.getStringValue();
Value data = metaMap.get(key2);
if(metaIdString.equals("keyName")){
addDependencyEquationFormula(spec, metaIdString, "tableId", false, tableNameString, data);
}else if(metaIdString.equals("columnName")){
if(data instanceof ArrayValue){
List<Value> dataList = ((ArrayValue) data).getValues();
int index = 0; //columnNo用のindex
for(Value v:dataList){
if(v instanceof StringValue){
addNestedDependencyEquationFormula(spec, metaIdString, "columnNo", false, Integer.toString(index), "tableId", false, tableNameString, v);
}
index ++;
}
}
}
}
}
}
//[depending : dependedId -> arguments] = value , ex [keyName : tableId -> "顧客"] = "顧客ID"
public void addDependencyEquationFormula(RDLSpec spec, String depending, String dependedId, boolean dependedIdPrime, String argument, Value corrValue){
ArrayList<RDLSpecEvaluatableTerm> dependedList = new ArrayList<>();
ArrayList<RDLSpecEvaluatableTerm> argumentList = new ArrayList<>();
if(dependedIdPrime){
dependedList.add(spec.getRDLSpecResourceDeclaration(dependedId).getPrimedResource());
}else{
dependedList.add(spec.getRDLSpecResourceDeclaration(dependedId).getResource());
}
argumentList.add(spec.getConstant(argument, spec.getRDLSpecResourceDeclaration(dependedId).getResource().getValueType()));
spec.addRDLSpecStatement(new RDLSpecEquationFormula(new RDLSpecDependencyTerm(spec.getRDLSpecResourceDeclaration(depending).getResource(), dependedList, argumentList), spec.getConstant(corrValue.toString(), checkValueType(corrValue))));
}
//[depending: insideDependedId -> insideArguments] : outsideDependedId -> outsideArguments] = corrValue
public void addNestedDependencyEquationFormula(RDLSpec spec, String depending, String insideDependedId, boolean insideDependedIdPrime, String insideArgument, String outsideDependedId, boolean outsideDependedIdPrime, String outsideArgument, Value corrValue){
RDLSpecDependencyTerm nestedDependencyTerm = createNestedDependencyTerm(spec, depending, insideDependedId, insideDependedIdPrime, insideArgument, outsideDependedId, outsideDependedIdPrime, outsideArgument);
spec.addRDLSpecStatement(new RDLSpecEquationFormula(nestedDependencyTerm, spec.getConstant(corrValue.toString(), checkValueType(corrValue))));
}
}