private static boolean hasSingleOccurrenceInPremise(FormulaVariable variable) {
   if (logger.isTraceEnabled())
     logger.trace("Occurrences for variable: " + variable.toLongString());
   int relationalPremiseOccurrences = variable.getPremiseRelationalOccurrences().size();
   int nonRelationalOccurrences = variable.getNonRelationalOccurrences().size();
   return relationalPremiseOccurrences + nonRelationalOccurrences <= 1;
 }
 public static List<AttributeRef> findTargetQueriedAttributesForExtTGD(Dependency dependency) {
   List<AttributeRef> queriedAttributes = new ArrayList<AttributeRef>();
   LunaticUtility.addAllIfNotContained(
       queriedAttributes, findTargetQueriedAttributesInPremise(dependency));
   for (FormulaVariable formulaVariable : dependency.getPremise().getLocalVariables()) {
     if (formulaVariable.getConclusionRelationalOccurrences().isEmpty()) {
       continue;
     }
     AttributeRef firstPremiseOccurrenceInTarget =
         getFirstPremiseOccurrenceInTarget(formulaVariable.getPremiseRelationalOccurrences());
     if (firstPremiseOccurrenceInTarget != null) {
       AttributeRef unaliasedPremiseAttribute =
           ChaseUtility.unAlias(firstPremiseOccurrenceInTarget);
       LunaticUtility.addIfNotContained(queriedAttributes, unaliasedPremiseAttribute);
     }
     for (FormulaVariableOccurrence conclusionOccurrence :
         formulaVariable.getConclusionRelationalOccurrences()) {
       AttributeRef attribute = conclusionOccurrence.getAttributeRef();
       if (attribute.getTableAlias().isSource()) {
         continue;
       }
       AttributeRef unaliasedConclusionAttribute =
           ChaseUtility.unAlias(conclusionOccurrence.getAttributeRef());
       LunaticUtility.addIfNotContained(queriedAttributes, unaliasedConclusionAttribute);
     }
   }
   return queriedAttributes;
 }
 public static List<AttributeRef> getUniversalAttributesInConclusion(
     List<FormulaVariable> universalVariables) {
   List<AttributeRef> result = new ArrayList<AttributeRef>();
   for (FormulaVariable formulaVariable : universalVariables) {
     LunaticUtility.addIfNotContained(
         result, formulaVariable.getConclusionRelationalOccurrences().get(0).getAttributeRef());
   }
   return result;
 }
 public static List<FormulaVariable> findUniversalVariablesInConclusion(Dependency dependency) {
   List<FormulaVariable> result = new ArrayList<FormulaVariable>();
   for (FormulaVariable formulaVariable : dependency.getPremise().getLocalVariables()) {
     if (formulaVariable.getConclusionRelationalOccurrences().size() > 0) {
       result.add(formulaVariable);
     }
   }
   return result;
 }
 private EquivalenceClassForSymmetricEGD createEquivalenceClass(Dependency egd) {
   FormulaVariable v1 =
       ((ComparisonAtom) egd.getConclusion().getAtoms().get(0)).getVariables().get(0);
   AttributeRef variableOccurrence = v1.getPremiseRelationalOccurrences().get(0).getAttributeRef();
   AttributeRef conclusionAttribute =
       EquivalenceClassUtility.correctAttributeForSymmetricEGDs(variableOccurrence, egd);
   List<BackwardAttribute> attributesForBackwardChasing = findAttributesForBackwardChasing(egd);
   return new EquivalenceClassForSymmetricEGD(
       egd, conclusionAttribute, attributesForBackwardChasing);
 }
 public static List<FormulaVariable> getUniversalVariablesInConclusion(Dependency dependency) {
   List<FormulaVariable> result = new ArrayList<FormulaVariable>();
   for (FormulaVariable formulaVariable : dependency.getPremise().getLocalVariables()) {
     List<FormulaVariableOccurrence> variablesOccurrence =
         formulaVariable.getConclusionRelationalOccurrences();
     if (!variablesOccurrence.isEmpty()) {
       LunaticUtility.addIfNotContained(result, formulaVariable);
     }
   }
   return result;
 }
 public static List<AttributeRef> getFirstAttributesOfUniversalVariablesInConclusion(
     Dependency dependency) {
   List<AttributeRef> result = new ArrayList<AttributeRef>();
   List<FormulaVariable> universalVariable =
       DependencyUtility.getUniversalVariablesInConclusion(dependency);
   for (FormulaVariable formulaVariable : universalVariable) {
     AttributeRef firstAttribute =
         DependencyUtility.findFirstOccurrenceInFormula(
             dependency.getPremise(), formulaVariable.getPremiseRelationalOccurrences());
     //            LunaticUtility.addIfNotContained(result, firstAttribute);
     result.add(firstAttribute);
   }
   return result;
 }
 public static List<AttributeRef> findTargetQueriedAttributesInPremise(Dependency dependency) {
   if (logger.isTraceEnabled())
     logger.trace("Searching query attributes for dependency: \n" + dependency);
   List<AttributeRef> queriedAttributes = new ArrayList<AttributeRef>();
   for (FormulaVariable variable : dependency.getPremise().getLocalVariables()) {
     if (logger.isTraceEnabled()) logger.trace("Inspecting variable: " + variable);
     if (hasSingleOccurrenceInPremise(variable)) {
       continue;
     }
     for (FormulaVariableOccurrence occurrence : variable.getPremiseRelationalOccurrences()) {
       if (logger.isTraceEnabled()) logger.trace("Inspecting occurrence: " + occurrence);
       AttributeRef attribute = occurrence.getAttributeRef();
       if (attribute.getTableAlias().isSource()) {
         continue;
       }
       AttributeRef unaliasedAttribute = ChaseUtility.unAlias(attribute);
       LunaticUtility.addIfNotContained(queriedAttributes, unaliasedAttribute);
     }
   }
   if (logger.isTraceEnabled()) logger.trace("Result: " + queriedAttributes);
   return queriedAttributes;
 }
 public static List<AttributeRef> extractRequestedAttributesWithExistential(
     Dependency dependency) {
   List<AttributeRef> result = new ArrayList<AttributeRef>();
   result.addAll(dependency.getQueriedAttributes());
   for (FormulaVariable variable : dependency.getConclusion().getLocalVariables()) {
     if (variable.getConclusionRelationalOccurrences().size() == 1) {
       continue;
     }
     for (FormulaVariableOccurrence occurrence : variable.getConclusionRelationalOccurrences()) {
       if (logger.isTraceEnabled()) logger.trace("Inspecting occurrence: " + occurrence);
       AttributeRef attribute = occurrence.getAttributeRef();
       AttributeRef unaliasedAttribute = ChaseUtility.unAlias(attribute);
       LunaticUtility.addIfNotContained(result, unaliasedAttribute);
     }
   }
   for (AttributeRef attributeRef : dependency.getAdditionalAttributes()) {
     if (!result.contains(attributeRef)) {
       result.add(attributeRef);
     }
   }
   return result;
 }