Example #1
0
  static void equate(Generator gen, Expression expr, QFrame left, QFrame right) {
    Expression lexpr = left.getExpression();
    Expression rexpr = right.getExpression();

    List lvals = left.getValues();
    List rvals = right.getValues();

    List lnull = gen.getNull(lexpr);
    List rnull = gen.getNull(rexpr);

    if (lvals.size() != rvals.size()) {
      if (lvals.size() == 1 && lnull.containsAll(lvals)) {
        lvals = repeat(lvals.get(0), rvals.size());
      } else if (rvals.size() == 1 && rnull.containsAll(rvals)) {
        rvals = repeat(rvals.get(0), lvals.size());
      } else {
        throw new IllegalStateException(
            "cardinality mismatch\nlvals: "
                + lvals
                + "\nrvals: "
                + rvals
                + "\nleft: "
                + lexpr
                + "\nright: "
                + rexpr);
      }
    }

    List lnonnull = gen.getNonNull(lexpr);
    List rnonnull = gen.getNonNull(rexpr);

    for (int i = 0; i < lvals.size(); i++) {
      QValue lval = (QValue) lvals.get(i);
      QValue rval = (QValue) rvals.get(i);
      gen.addEquality(expr, lval, rval);
      if (lnull.contains(lval)) {
        gen.addNull(expr, rval);
      }
      if (lnonnull.contains(lval)) {
        gen.addNonNull(expr, rval);
      }
      if (rnull.contains(rval)) {
        gen.addNull(expr, lval);
      }
      if (rnonnull.contains(rval)) {
        gen.addNonNull(expr, lval);
      }
    }

    gen.addSufficient(expr);
  }