@Test
  public void testSmarterLookupEnumsDifferentOrder() {
    final SuggestionCompletionEngine sce = new SuggestionCompletionEngine();
    sce.setDataEnumLists(new HashMap<String, String[]>());
    sce.putDataEnumList("Fact.type", new String[] {"sex", "colour"});
    sce.putDataEnumList(
        "Fact.value[e1, e2]",
        new String[] {"select something from database where x=@{e1} and y=@{e2}"});
    sce.putDataEnumList(
        "Fact.value[f1, f2]",
        new String[] {"select something from database where x=@{f1} and y=@{f2}"});

    FactPattern fp = new FactPattern("Fact");
    String[] drops = sce.getEnums(fp.getFactType(), fp.constraintList, "type").fixedList;
    assertEquals(2, drops.length);
    assertEquals("sex", drops[0]);
    assertEquals("colour", drops[1]);

    Map<String, Object> lookupFields = sce.loadDataEnumLookupFields();
    assertEquals(1, lookupFields.size());
    String[] flds = (String[]) lookupFields.get("Fact.value");
    assertEquals(2, flds.length);
    assertEquals("f1", flds[0]);
    assertEquals("f2", flds[1]);

    FactPattern pat = new FactPattern("Fact");
    SingleFieldConstraint sfc = new SingleFieldConstraint("f1");
    sfc.setValue("f1val");
    pat.addConstraint(sfc);
    sfc = new SingleFieldConstraint("f2");
    sfc.setValue("f2val");
    pat.addConstraint(sfc);

    DropDownData dd = sce.getEnums(pat.getFactType(), pat.constraintList, "value");
    assertNull(dd.fixedList);
    assertNotNull(dd.queryExpression);
    assertNotNull(dd.valuePairs);

    assertEquals(2, dd.valuePairs.length);
    assertEquals("select something from database where x=@{f1} and y=@{f2}", dd.queryExpression);
    assertEquals("f1=f1val", dd.valuePairs[0]);
    assertEquals("f2=f2val", dd.valuePairs[1]);

    // and now for the RHS
    ActionFieldValue[] vals = new ActionFieldValue[2];
    vals[0] = new ActionFieldValue("f1", "f1val", "blah");
    vals[1] = new ActionFieldValue("f2", "f2val", "blah");
    dd = sce.getEnums("Fact", "value", vals);
    assertNull(dd.fixedList);
    assertNotNull(dd.queryExpression);
    assertNotNull(dd.valuePairs);
    assertEquals(2, dd.valuePairs.length);
    assertEquals("select something from database where x=@{f1} and y=@{f2}", dd.queryExpression);
    assertEquals("f1=f1val", dd.valuePairs[0]);
    assertEquals("f2=f2val", dd.valuePairs[1]);
  }