/**
   * Tests the ordering capability of DataCollection. Checks forward, reverse, and multiple field
   * ordering.
   */
  public void testSetOrder() {
    DataCollection collection = getDefaultCollection();
    final String ORDER_FIELD = "id";
    collection.setOrder(ORDER_FIELD);
    assertTrue("Should be several items in this query set!", collection.next());
    BigDecimal priorValue = (BigDecimal) collection.get(ORDER_FIELD);

    while (collection.next()) {
      final BigDecimal currentValue = (BigDecimal) collection.get(ORDER_FIELD);
      assertTrue("Query was retrieved out of order.", priorValue.compareTo(currentValue) < 0);

      priorValue = currentValue;
    }
    collection.close();

    collection = getDefaultCollection();
    collection.setOrder("id desc");
    assertTrue("Should be several items in this query set!", collection.next());
    priorValue = (BigDecimal) collection.get(ORDER_FIELD);

    while (collection.next()) {
      final BigDecimal currentValue = (BigDecimal) collection.get(ORDER_FIELD);
      assertTrue("Query was retrieved out of order.", priorValue.compareTo(currentValue) > 0);

      priorValue = currentValue;
    }

    collection.close();

    collection = getOrderCollection();
    collection.setOrder("buyer desc, seller asc");
    assertTrue("Should be several items in this query set!", collection.next());

    String priorBuyer = (String) collection.get("buyer");
    String priorSeller = (String) collection.get("seller");

    while (collection.next()) {
      final String currentBuyer = (String) collection.get("buyer");
      final String currentSeller = (String) collection.get("seller");
      assertTrue("Buyer order wrong!", priorBuyer.compareTo(currentBuyer) >= 0);
      if (priorBuyer.equals(currentBuyer)) {
        assertTrue(
            "Seller order wrong! " + priorSeller + " " + currentSeller,
            priorSeller.compareTo(currentSeller) <= 0);
      }

      priorBuyer = currentBuyer;
      priorSeller = currentSeller;
    }
  }
  public void testDeepLink() {
    Session ssn = SessionManager.getSession();

    DataObject[] users = new DataObject[4];

    DataObject group = getSession().create(getModelName() + ".Group");
    group.set("id", BigInteger.valueOf(users.length));
    group.set("email", "*****@*****.**");
    group.set("name", "SIPB");
    group.save();
    DataAssociation members = (DataAssociation) group.get("members");

    for (int i = 0; i < users.length; i++) {
      users[i] = ssn.create(getModelName() + ".User");
      users[i].set("id", BigInteger.valueOf(i));
      users[i].set("email", "*****@*****.**");
      users[i].set("firstName", "foo");
      users[i].set("lastNames", "bar");
      users[i].save();
      members.add(users[i]);
    }
    group.save();

    DataObject[] images = new DataObject[users.length / 2];
    for (int i = 0; i < images.length; i++) {
      images[i] = ssn.create(getModelName() + ".Image");
      images[i].set("id", BigInteger.valueOf(i));
      byte[] bytes = "This is the image.".getBytes();
      images[i].set("bytes", bytes);
      images[i].save();
    }

    // create link between user i and image i/2 with caption i
    for (int i = 0; i < users.length; i++) {
      // set image
      DataAssociation imageUsers = (DataAssociation) images[i / 2].get("users");
      DataObject link = imageUsers.add(users[i]);
      link.set("caption", String.valueOf(i));
      link.save();
    }

    DataCollection dc = ssn.retrieve(getModelName() + ".Group");
    dc.addEqualsFilter("members.image.link.caption", "0");
    assertEquals(1, dc.size());

    dc = ssn.retrieve(getModelName() + ".User");
    dc.addPath("image.link.caption");
    assertEquals(users.length, dc.size());
    while (dc.next()) {
      assertEquals(dc.get("id").toString(), dc.get("image.link.caption"));
    }

    dc = ssn.retrieve(getModelName() + ".User");
    dc.addPath("image.id");
    assertEquals(users.length, dc.size());
    while (dc.next()) {
      int id = ((BigInteger) dc.get("id")).intValue();
      assertEquals(BigInteger.valueOf(id / 2), dc.get("image.id"));
    }

    DataCollection dcUp = ssn.retrieve(getModelName() + ".User");
    DataCollection dcDown = ssn.retrieve(getModelName() + ".User");
    dcUp.addOrder("image.link.caption asc");
    dcDown.addOrder("image.link.caption desc");
    dcUp.next();
    dcDown.next();
    assertEquals(BigInteger.valueOf(0), dcUp.get("id"));
    assertEquals(BigInteger.valueOf(users.length - 1), dcDown.get("id"));
    dcUp.close();
    dcDown.close();

    dcUp = ssn.retrieve(getModelName() + ".Image");
    dcDown = ssn.retrieve(getModelName() + ".Image");
    dcUp.addOrder("users.link.caption asc");
    dcDown.addOrder("users.link.caption desc");
    dcUp.next();
    dcDown.next();
    assertEquals(BigInteger.valueOf(0), dcUp.get("id"));
    assertEquals(BigInteger.valueOf(images.length - 1), dcDown.get("id"));
    dcUp.close();
    dcDown.close();

    dc = ssn.retrieve(getModelName() + ".Group");
    dc.addFilter("members.image.id = 0");
    assertEquals(2, dc.size());

    dc = ssn.retrieve(getModelName() + ".Image");
    dc.addFilter("users.id = 0 and users.link.caption = '1'");
    assertEquals(0, dc.size());

    dc = ssn.retrieve(getModelName() + ".Group");
    dc.addPath("members.id");
    dc.addFilter("members.image.id = 0 and members.image.link.caption = '1'");
    assertTrue(dc.next());
    assertEquals(BigInteger.valueOf(1), dc.get("members.id"));
    assertFalse(dc.next());
  }