コード例 #1
0
 private String generateEqualityString(
     List<Expression> equalities, List<List<FormulaVariable>> variables, boolean with) {
   StringBuilder localResult = new StringBuilder();
   StringBuilder prefix = new StringBuilder();
   if (useSaveFormat) {
     if (with) {
       prefix.append("\n").append(generateIndent()).append("with ");
     } else {
       prefix.append(",\n").append(generateIndent());
     }
   } else {
     prefix.append(",\n").append(generateIndent());
   }
   for (int i = 0; i < equalities.size(); i++) {
     Expression expression = equalities.get(i).clone();
     if (utility.setVariableDescriptions(expression, variables)) {
       if (useSaveFormat) {
         String expressionString = expression.toSaveString();
         if (with) {
           expressionString = expressionString.replaceAll("==", "=");
         }
         localResult.append(expressionString);
       } else {
         localResult.append(expression.toString());
       }
       if (i != equalities.size() - 1) {
         localResult.append(", ");
       }
     }
   }
   if (!localResult.toString().isEmpty()) {
     localResult.insert(0, prefix.toString());
   }
   return localResult.toString();
 }
コード例 #2
0
 public void visitComplexConjunctiveQuery(ComplexConjunctiveQuery complexQuery) {
   stack.add(0, complexQuery);
   //        List<FormulaVariable> universalVariables =
   // variableFinder.getUniversalVariables(variableMaps, stack);
   //        variables.add(0, universalVariables);
   result.append(
       generateConjunctionString(
           complexQuery.getGenerators(),
           variables,
           mappingTask.getSourceProxy().getIntermediateSchema()));
   result.append(generateBuiltinsForSelections(complexQuery));
   List<Expression> equalities = variableFinder.getEqualities(variableMaps, stack);
   if (!equalities.isEmpty()) {
     result.append(generateEqualityString(equalities, variables, false));
   }
   // intersection
   if (complexQuery.hasIntersection()) {
     if (useSaveFormat) {
       result.append(", \n");
     } else {
       result
           .append("\n")
           .append(generateIndent())
           .append(utility.SECONDARY_INDENT)
           .append("and ");
     }
     SimpleConjunctiveQuery intersectionQuery = complexQuery.getConjunctionForIntersection();
     stack.add(0, intersectionQuery);
     List<FormulaVariable> existentialVariables =
         variableFinder.getExistentialVariables(variableMaps, stack);
     variables.add(0, existentialVariables);
     if (!existentialVariables.isEmpty() && !useSaveFormat) {
       result.append("exist ");
       result.append(utility.printVariables(existentialVariables));
     }
     if (!useSaveFormat) {
       result.append(" (// base view ").append(intersectionQuery.getId()).append("\n");
     }
     result.append(
         generateConjunctionString(
             intersectionQuery.getGenerators(),
             variables,
             mappingTask.getSourceProxy().getIntermediateSchema()));
     List<Expression> intersectionEqualities = variableFinder.getEqualities(variableMaps, stack);
     if (!intersectionEqualities.isEmpty()) {
       result.append(generateEqualityString(intersectionEqualities, variables, false));
     }
     variables.remove(0);
     stack.remove(0);
     if (!useSaveFormat) {
       result.append("\n").append(generateIndent()).append(utility.SECONDARY_INDENT).append(")");
     }
   }
   //        variables.remove(0);
   stack.remove(0);
 }
コード例 #3
0
 ////////////////////////////////   PREMISE   ////////////////////////////////////////////////
 private String premiseString(FORule rule, MappingTask mappingTask, String indent) {
   StringBuilder result = new StringBuilder();
   List<List<FormulaVariable>> variables = new ArrayList<List<FormulaVariable>>();
   List<FormulaVariable> universalVariables = rule.getUniversalFormulaVariables(mappingTask);
   variables.add(0, universalVariables);
   if (!useSaveFormat) {
     result.append(indent).append("for each ");
     result.append(utility.printVariables(universalVariables));
     result.append("\n");
   }
   result.append(runVisitor(rule, mappingTask, indent));
   variables.remove(0);
   return result.toString();
 }
コード例 #4
0
 private String generateConjunctionString(
     List<SetAlias> setVariables, List<List<FormulaVariable>> variables, INode schema) {
   StringBuilder localResult = new StringBuilder();
   List<SetAlias> sortedAliases = new ArrayList<SetAlias>(setVariables);
   Collections.sort(sortedAliases);
   for (int i = 0; i < sortedAliases.size(); i++) {
     SetAlias sourceVariable = sortedAliases.get(i);
     localResult.append(generateIndent());
     if (!useSaveFormat) {
       localResult.append(
           utility.printAtomName(sourceVariable, mappingTask.getSourceProxy().isNested()));
     } else {
       localResult.append(
           utility.printAtomNameForSaveFormat(
               sourceVariable, mappingTask.getSourceProxy().isNested()));
     }
     List<VariablePathExpression> attributePaths = sourceVariable.getFirstLevelAttributes(schema);
     for (int j = 0; j < attributePaths.size(); j++) {
       VariablePathExpression attributePath = attributePaths.get(j);
       FormulaVariable attributeVariable = findVariableForPath(attributePath, variables);
       localResult.append(attributePath.getLastStep()).append(": ");
       if (useSaveFormat) {
         localResult.append("$");
       }
       localResult.append(attributeVariable.toShortString());
       if (j != attributePaths.size() - 1) {
         localResult.append(", ");
       }
     }
     localResult.append(")");
     if (i != sortedAliases.size() - 1) {
       localResult.append(", \n");
     }
   }
   return localResult.toString();
 }
コード例 #5
0
 private String generateBuiltinsForSelections(ComplexConjunctiveQuery query) {
   StringBuilder localResult = new StringBuilder();
   if (query.getAllSelections().size() > 0) {
     localResult.append(", ");
   }
   for (int i = 0; i < query.getAllSelections().size(); i++) {
     VariableSelectionCondition selection = query.getAllSelections().get(i);
     Expression expression = selection.getCondition().clone();
     utility.setVariableDescriptions(expression, variables);
     if (useSaveFormat) {
       String expressionString = expression.toSaveString();
       localResult.append(expressionString);
     } else {
       localResult.append(expression.toString());
     }
     if (i != query.getAllSelections().size() - 1) {
       localResult.append(", ");
     }
   }
   return localResult.toString();
 }
コード例 #6
0
 public void visitNegatedComplexQuery(NegatedComplexQuery negatedQuery) {
   stack.add(0, negatedQuery);
   List<FormulaVariable> existentialVariables =
       variableFinder.getExistentialVariables(variableMaps, stack);
   variables.add(0, existentialVariables);
   result
       .append("\n")
       .append(generateIndent())
       .append(utility.SECONDARY_INDENT)
       .append("and not ");
   if (useSaveFormat) {
     result.append("exists ");
   } else {
     if (!existentialVariables.isEmpty()) {
       result.append("exist ");
       result.append(utility.printVariables(existentialVariables));
     }
   }
   ComplexQueryWithNegations childQuery = negatedQuery.getComplexQuery();
   result.append(" (");
   if (!useSaveFormat) {
     result
         .append("//")
         .append(negatedQuery.getProvenance())
         .append(" - ")
         .append(childQuery.getId());
   }
   result.append("\n");
   childQuery.accept(this);
   List<Expression> equalities = variableFinder.getEqualities(variableMaps, stack);
   if (!equalities.isEmpty()) {
     result.append(generateEqualityString(equalities, variables, true));
   }
   result.append("\n").append(generateIndent()).append(utility.SECONDARY_INDENT).append(")");
   variables.remove(0);
   stack.remove(0);
 }
コード例 #7
0
  ////////////////////////////////   CONCLUSION   ////////////////////////////////////////////////
  public String conclusionString(FORule tgd, MappingTask mappingTask, String indent) {
    // giannisk
    // find target paths that have a constant value correspondence
    List<VariablePathExpression> constantTargetPaths = new ArrayList<VariablePathExpression>();
    HashMap<VariablePathExpression, ISourceValue> constantValueMap =
        new HashMap<VariablePathExpression, ISourceValue>();
    for (VariableCorrespondence varCor : tgd.getCoveredCorrespondences()) {
      if (varCor.isConstant()) {
        constantTargetPaths.add(varCor.getTargetPath());
        constantValueMap.put(varCor.getTargetPath(), varCor.getSourceValue());
      }
    }

    StringBuilder result = new StringBuilder();
    List<FormulaVariable> universalVariables = tgd.getUniversalFormulaVariables(mappingTask);
    List<FormulaVariable> existentialVariables = tgd.getExistentialFormulaVariables(mappingTask);
    if (!useSaveFormat
        && (!existentialVariables.isEmpty() || mappingTask.getTargetProxy().isNested())) {
      result.append("exist ");
      if (mappingTask.getTargetProxy().isNested()) {
        utility.printOIDVariables(tgd.getTargetView());
      }
      if (!existentialVariables.isEmpty()) {
        result.append(utility.printVariables(existentialVariables));
      }
    }
    result.append("\n");
    for (int i = 0; i < tgd.getTargetView().getGenerators().size(); i++) {
      SetAlias targetVariable = tgd.getTargetView().getGenerators().get(i);
      result.append(indent).append(utility.INDENT);
      if (!useSaveFormat) {
        result.append(
            utility.printAtomName(targetVariable, mappingTask.getTargetProxy().isNested()));
      } else {
        result.append(
            utility.printAtomNameForSaveFormat(
                targetVariable, mappingTask.getTargetProxy().isNested()));
      }
      List<VariablePathExpression> attributePaths =
          targetVariable.getFirstLevelAttributes(
              mappingTask.getTargetProxy().getIntermediateSchema());
      for (int j = 0; j < attributePaths.size(); j++) {
        VariablePathExpression attributePath = attributePaths.get(j);
        result.append(attributePath.getLastStep()).append(": ");
        FormulaVariable attributeVariable =
            findUniversalVariableForTargetPath(attributePath, universalVariables);
        Expression transformation = null;
        if (!constantTargetPaths.contains(attributePath)) {
          if (attributeVariable == null) {
            attributeVariable =
                findExistentialVariable(
                    attributePath, tgd.getExistentialFormulaVariables(mappingTask));
          }
          transformation = attributeVariable.getTransformationFunction(attributePath);
        }
        if (transformation == null) {
          if (!constantTargetPaths.contains(attributePath)) {
            if (useSaveFormat) {
              result.append("$");
            }
            result.append(attributeVariable.toShortString());
          } else { // constant
            result.append(constantValueMap.get(attributePath));
          }
        } else { // function
          List<List<FormulaVariable>> variables = new ArrayList<List<FormulaVariable>>();
          variables.add(tgd.getUniversalFormulaVariables(mappingTask));
          utility.setVariableDescriptions(transformation, variables);
          result.append(transformation);
        }
        if (j != attributePaths.size() - 1) {
          result.append(", ");
        }
      }
      result.append(")");
      if (i != tgd.getTargetView().getGenerators().size() - 1) {
        result.append(", \n");
      }
    }
    return result.toString();
  }