@Test
 public void testMatch() throws Exception {
   SQLQuery query =
       SQLQueryParser.parse(
           "SELECT ecm:uuid, cmp:addresses/*1/street FROM D WHERE " //
               + "cmp:addresses/*1/city = 'Paris'");
   SelectClause selectClause = query.getSelectClause();
   Expression expression = query.getWhereClause().predicate;
   OrderByClause orderByClause = query.getOrderByClause();
   DBSExpressionEvaluator evaluator =
       new DBSExpressionEvaluator(null, selectClause, expression, orderByClause, null, false);
   evaluator.parse();
   assertTrue(evaluator.hasWildcardProjection());
   State state =
       state( //
           "ecm:id",
           "id1", //
           "cmp:addresses",
           list( //
               state("city", "Paris", "street", "Champs Elysees"), //
               state("city", "Paris", "street", "Boulevard Peripherique")));
   List<Map<String, Serializable>> projections = evaluator.matches(state);
   assertEquals(
       list( //
           map("ecm:uuid", "id1", "cmp:addresses/*1/street", "Champs Elysees"), //
           map("ecm:uuid", "id1", "cmp:addresses/*1/street", "Boulevard Peripherique")), //
       projections);
 }
 @Test
 public void testWildcardCrossProduct() throws Exception {
   SQLQuery query =
       SQLQueryParser.parse(
           "SELECT cmp:addresses/*1/city, cmp:addresses/*2/city FROM D WHERE " //
               + "ecm:uuid <> 'nothing'");
   SelectClause selectClause = query.getSelectClause();
   Expression expression = query.getWhereClause().predicate;
   OrderByClause orderByClause = query.getOrderByClause();
   DBSExpressionEvaluator evaluator =
       new DBSExpressionEvaluator(null, selectClause, expression, orderByClause, null, false);
   evaluator.parse();
   assertTrue(evaluator.hasWildcardProjection());
   State state =
       state( //
           "ecm:id",
           "id1", //
           "cmp:addresses",
           list( //
               state("city", "Paris"), //
               state("city", "London")));
   List<Map<String, Serializable>> projections = evaluator.matches(state);
   assertEquals(
       list( //
           map("cmp:addresses/*1/city", "Paris", "cmp:addresses/*2/city", "Paris"), //
           map("cmp:addresses/*1/city", "Paris", "cmp:addresses/*2/city", "London"), //
           map("cmp:addresses/*1/city", "London", "cmp:addresses/*2/city", "Paris"), //
           map("cmp:addresses/*1/city", "London", "cmp:addresses/*2/city", "London")), //
       projections);
 }