/**
   * Test method for {@link org.identityconnectors.dbcommon.DatabaseFilterTranslator}.
   *
   * @throws Exception
   */
  @Test
  public void testCompositeFilters() throws Exception {
    Filter lf = greaterThan(build("count", 4));
    Filter rf = lessThan(build("count", 20));
    List<SQLParam> expected = new ArrayList<SQLParam>();
    expected.add(new SQLParam("count", 4, Types.INTEGER));
    expected.add(new SQLParam("count", 20, Types.INTEGER));

    // test and
    Filter f = FilterBuilder.and(lf, rf);
    DatabaseFilterTranslator tr = getDatabaseFilterTranslator();
    List<FilterWhereBuilder> blist = tr.translate(f);
    assertEquals(1, blist.size());
    FilterWhereBuilder b = blist.get(0);
    assertEquals("count > ? AND count < ?", b.getWhereClause());
    // test or
    assertEquals(expected.size(), b.getParams().size());
    f = FilterBuilder.or(lf, rf);
    DatabaseFilterTranslator tr2 = getDatabaseFilterTranslator();
    blist = tr2.translate(f);
    assertEquals(1, blist.size());
    b = blist.get(0);
    assertEquals("count > ? OR count < ?", b.getWhereClause());
    assertEquals(expected.size(), b.getParams().size());
    // test xor
    // assertEquals(expected, actual);
  }
  /**
   * Test method for {@link org.identityconnectors.dbcommon.DatabaseFilterTranslator}.
   *
   * @throws Exception
   */
  @Test
  public void testCompositeFilterChainAndOrAndOrAnd() throws Exception {
    Filter f1 = equalTo(build("a", 1));
    Filter f2 = equalTo(build("b", 1));
    Filter f3 = equalTo(build("c", 1));
    Filter f4 = equalTo(build("d", 1));
    Filter f5 = equalTo(build("e", 1));
    Filter f6 = equalTo(build("f", 1));
    List<SQLParam> expected = new ArrayList<SQLParam>();
    expected.add(new SQLParam("a", 1));
    expected.add(new SQLParam("b", 1));
    expected.add(new SQLParam("c", 1));
    expected.add(new SQLParam("d", 1));
    expected.add(new SQLParam("e", 1));
    expected.add(new SQLParam("f", 1));

    // test and
    Filter f12 = FilterBuilder.or(f1, f2);
    Filter f34 = FilterBuilder.and(f3, f4);
    Filter f56 = FilterBuilder.or(f5, f6);
    Filter f1234 = FilterBuilder.and(f12, f34);
    Filter f = FilterBuilder.or(f1234, f56);
    DatabaseFilterTranslator tr = getDatabaseFilterTranslator();
    List<FilterWhereBuilder> blist = tr.translate(f);
    assertEquals(1, blist.size());
    final FilterWhereBuilder b = blist.get(0);
    assertEquals(
        "( ( a = ? OR b = ? ) AND ( c = ? AND d = ? ) ) OR ( e = ? OR f = ? )", b.getWhereClause());
    assertEquals(expected, b.getParams());
  }
  /**
   * Test method for {@link org.identityconnectors.dbcommon.DatabaseFilterTranslator}.
   *
   * @throws Exception
   */
  @Test
  public void testNotfilter() throws Exception {
    Filter gt = greaterThan(build("count", 4));
    Filter f = FilterBuilder.not(gt);

    DatabaseFilterTranslator tr = getDatabaseFilterTranslator();
    List<FilterWhereBuilder> blist = tr.translate(f);
    assertEquals(1, blist.size());
    final FilterWhereBuilder b = blist.get(0);
    assertEquals("count <= ?", b.getWhereClause());
    List<SQLParam> expected = new ArrayList<SQLParam>();
    expected.add(new SQLParam("count", 4, Types.INTEGER));
    assertEquals(expected.size(), b.getParams().size());
  }
  /**
   * Test method for {@link org.identityconnectors.dbcommon.DatabaseFilterTranslator}.
   *
   * @throws Exception
   */
  @Test
  public void testCompositeFilterChainNotOr() throws Exception {
    Filter lf = greaterThan(build("count", 4));
    Filter rf = lessThan(build("count", 20));
    List<SQLParam> expected = new ArrayList<SQLParam>();
    expected.add(new SQLParam("count", 4, Types.INTEGER));
    expected.add(new SQLParam("count", 20, Types.INTEGER));

    // test and
    Filter f = FilterBuilder.or(lf, rf);
    Filter not = FilterBuilder.not(f);
    DatabaseFilterTranslator tr = getDatabaseFilterTranslator();
    List<FilterWhereBuilder> blist = tr.translate(not);
    assertEquals(1, blist.size());
    final FilterWhereBuilder b = blist.get(0);
    assertEquals("count <= ? AND count >= ?", b.getWhereClause());
    assertEquals(expected.size(), b.getParams().size());
  }
 /**
  * Test method for {@link org.identityconnectors.dbcommon.DatabaseFilterTranslator}.
  *
  * @throws Exception
  */
 @Test
 public void testCompositeFilterChainOrAnd() throws Exception {
   Filter f1 = greaterThan(build("count", 4));
   Filter f2 = lessThan(build("count", 20));
   Filter f3 = equalTo(build("count", 10));
   List<SQLParam> expected = new ArrayList<SQLParam>();
   expected.add(new SQLParam("count", 4, Types.INTEGER));
   expected.add(new SQLParam("count", 20, Types.INTEGER));
   expected.add(new SQLParam("count", 10, Types.INTEGER));
   // test and
   Filter f12 = FilterBuilder.or(f1, f2);
   Filter f = FilterBuilder.and(f12, f3);
   DatabaseFilterTranslator tr = getDatabaseFilterTranslator();
   List<FilterWhereBuilder> blist = tr.translate(f);
   assertEquals(1, blist.size());
   final FilterWhereBuilder b = blist.get(0);
   assertEquals("( count > ? OR count < ? ) AND count = ?", b.getWhereClause());
   assertEquals(expected.size(), b.getParams().size());
 }
  /**
   * Test method for {@link org.identityconnectors.dbcommon.DatabaseFilterTranslator}.
   *
   * @throws Exception
   */
  @Test
  public void testUnaryFilters() throws Exception {
    Attribute attr = build("count", 2);
    Filter filters[] =
        new Filter[] {
          equalTo(attr),
          greaterThan(attr),
          greaterThanOrEqualTo(attr),
          lessThan(attr),
          lessThanOrEqualTo(attr)
        };
    String ops[] = new String[] {"=", ">", ">=", "<", "<="};
    List<SQLParam> expected = new ArrayList<SQLParam>();
    expected.add(new SQLParam("count", 2, Types.INTEGER));

    for (int i = 0; i < filters.length; i++) {
      DatabaseFilterTranslator tr = getDatabaseFilterTranslator();
      List<FilterWhereBuilder> blist = tr.translate(filters[i]);
      assertEquals(1, blist.size());
      final FilterWhereBuilder b = blist.get(0);
      assertEquals("count " + ops[i] + " ?", b.getWhereClause());
      assertEquals(expected.size(), b.getParams().size());
    }
  }