@Override
  public void meet(ValueConstant node) throws RuntimeException {
    String val = node.getValue().stringValue();

    switch (optypes.peek()) {
      case STRING:
      case URI:
        builder.append("'").append(val).append("'");
        break;
      case INT:
        builder.append(Integer.parseInt(val));
        break;
      case DECIMAL:
      case DOUBLE:
        builder.append(Double.parseDouble(val));
        break;
      case BOOL:
        builder.append(Boolean.parseBoolean(val));
        break;
      case DATE:
        builder.append("'").append(sqlDateFormat.format(DateUtils.parseDate(val))).append("'");
        break;

        // in this case we should return a node ID and also need to make sure it actually exists
      case TERM:
      case NODE:
        KiWiNode n = parent.getConverter().convert(node.getValue());
        builder.append(n.getId());
        break;

      default:
        throw new IllegalArgumentException("unsupported value type: " + optypes.peek());
    }
  }
  @Override
  public void meet(LangMatches lm) throws RuntimeException {
    ValueConstant pattern = (ValueConstant) lm.getRightArg();

    if (pattern.getValue().stringValue().equals("*")) {
      lm.getLeftArg().visit(this);
      builder.append(" LIKE '%'");
    } else if (pattern.getValue().stringValue().equals("")) {
      lm.getLeftArg().visit(this);
      builder.append(" IS NULL");
    } else {
      builder.append("(");
      lm.getLeftArg().visit(this);
      builder.append(" = '");
      builder.append(pattern.getValue().stringValue().toLowerCase());
      builder.append("' OR ");
      lm.getLeftArg().visit(this);
      builder.append(" LIKE '");
      builder.append(pattern.getValue().stringValue().toLowerCase());
      builder.append("-%' )");
    }
  }