Package siena.base.test

Source Code of siena.base.test.BaseAsyncTest

package siena.base.test;

import static siena.Json.map;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;

import junit.framework.TestCase;
import siena.Query;
import siena.SienaException;
import siena.base.test.model.Address;
import siena.base.test.model.AutoInc;
import siena.base.test.model.Contact;
import siena.base.test.model.DataTypes;
import siena.base.test.model.DataTypes.EnumLong;
import siena.base.test.model.EmbeddedContainerModel;
import siena.base.test.model.Discovery;
import siena.base.test.model.Discovery4Join;
import siena.base.test.model.Discovery4Join2;
import siena.base.test.model.Discovery4Search;
import siena.base.test.model.DiscoveryNoColumn;
import siena.base.test.model.DiscoveryNoColumnMultipleKeys;
import siena.base.test.model.DiscoveryPrivate;
import siena.base.test.model.EmbeddedModel;
import siena.base.test.model.MultipleKeys;
import siena.base.test.model.PersonLongAutoID;
import siena.base.test.model.PersonLongManualID;
import siena.base.test.model.PersonStringAutoIncID;
import siena.base.test.model.PersonStringID;
import siena.base.test.model.PersonUUID;
import siena.base.test.model.PolymorphicModel;
import siena.core.async.PersistenceManagerAsync;
import siena.core.async.QueryAsync;
import siena.core.async.SienaFuture;

public abstract class BaseAsyncTest extends TestCase {
  protected PersistenceManagerAsync pm;

  private static PersonUUID UUID_TESLA = new PersonUUID("Nikola", "Tesla", "Smiljam", 1);
  private static PersonUUID UUID_CURIE = new PersonUUID("Marie", "Curie", "Warsaw", 2);
  private static PersonUUID UUID_EINSTEIN = new PersonUUID("Albert", "Einstein", "Ulm", 3);
 
  private static PersonLongAutoID LongAutoID_TESLA = new PersonLongAutoID("Nikola", "Tesla", "Smiljam", 1);
  protected static PersonLongAutoID LongAutoID_CURIE = new PersonLongAutoID("Marie", "Curie", "Warsaw", 2);
  private static PersonLongAutoID LongAutoID_EINSTEIN = new PersonLongAutoID("Albert", "Einstein", "Ulm", 3);

  private static PersonLongManualID LongManualID_TESLA = new PersonLongManualID(1L, "Nikola", "Tesla", "Smiljam", 1);
  private static PersonLongManualID LongManualID_CURIE = new PersonLongManualID(2L, "Marie", "Curie", "Warsaw", 2);
  private static PersonLongManualID LongManualID_EINSTEIN = new PersonLongManualID(3L, "Albert", "Einstein", "Ulm", 3);
 
  private static PersonStringID StringID_TESLA = new PersonStringID("TESLA", "Nikola", "Tesla", "Smiljam", 1);
  private static PersonStringID StringID_CURIE = new PersonStringID("CURIE", "Marie", "Curie", "Warsaw", 2);
  private static PersonStringID StringID_EINSTEIN = new PersonStringID("EINSTEIN", "Albert", "Einstein", "Ulm", 3);

  public abstract PersistenceManagerAsync createPersistenceManager(List<Class<?>> classes) throws Exception;
 
  public abstract boolean supportsAutoincrement();
 
  public abstract boolean supportsMultipleKeys();
 
  public abstract boolean mustFilterToOrder();
 
  @Override
  protected void setUp() throws Exception {
    super.setUp();
    List<Class<?>> classes = new ArrayList<Class<?>>();
    classes.add(PersonUUID.class);
    classes.add(PersonLongAutoID.class);
    classes.add(PersonLongManualID.class);
    classes.add(PersonStringID.class);
    if(supportsAutoincrement())
      classes.add(AutoInc.class);
    if(supportsMultipleKeys())
      classes.add(MultipleKeys.class);
    classes.add(Discovery.class);
    classes.add(Discovery4Join.class);
    classes.add(Discovery4Join2.class);
    classes.add(DiscoveryPrivate.class);
    classes.add(Discovery4Search.class);
    classes.add(DataTypes.class);
    pm = createPersistenceManager(classes);
   
    for (Class<?> clazz : classes) {
      pm.createQuery(clazz).delete().get();     
    }
   
    pm.insert(UUID_TESLA, UUID_CURIE, UUID_EINSTEIN).get();
    pm.insert(LongAutoID_TESLA, LongAutoID_CURIE, LongAutoID_EINSTEIN).get();
    pm.insert(LongManualID_TESLA, LongManualID_CURIE, LongManualID_EINSTEIN).get();
    pm.insert(StringID_TESLA, StringID_CURIE, StringID_EINSTEIN).get();

  }
 
  protected List<PersonUUID> getOrderedPersonUUIDs() {
    ArrayList<PersonUUID> l = new ArrayList<PersonUUID>() {
      private static final long serialVersionUID = 1L;
    {
      add(UUID_TESLA);
      add(UUID_CURIE);
      add(UUID_EINSTEIN);
    }};

    Collections.sort(l, new Comparator<PersonUUID>(){
      public int compare(PersonUUID p1,PersonUUID p2){
                return p1.id.compareTo(p2.id);
      }
    });
   
    return l;
  }
 
  private PersonUUID getPersonUUID(String id) {
    PersonUUID p = new PersonUUID();
    p.id = id;
    pm.get(p).get();
    return p;
  }

  private PersonLongAutoID getPersonLongAutoID(Long id) {
    PersonLongAutoID p = new PersonLongAutoID();
    p.id = id;
    pm.get(p).get();
    return p;
  }
 
  private PersonLongManualID getPersonLongManualID(Long id) {
    PersonLongManualID p = new PersonLongManualID();
    p.id = id;
    pm.get(p).get();
    return p;
  }

  private PersonStringID getPersonStringID(String id) {
    PersonStringID p = new PersonStringID();
    p.id = id;
    pm.get(p).get();
    return p;
  }

 
  protected QueryAsync<PersonUUID> queryPersonUUIDOrderBy(String order, Object value, boolean desc) {
    QueryAsync<PersonUUID> query = pm.createQuery(PersonUUID.class);
    if(mustFilterToOrder()) {
      query = query.filter(order+">", value);
    }
    return query.order(desc ? "-"+order : order);
  }

  protected QueryAsync<PersonLongAutoID> queryPersonLongAutoIDOrderBy(String order, Object value, boolean desc) {
    QueryAsync<PersonLongAutoID> query = pm.createQuery(PersonLongAutoID.class);
    if(mustFilterToOrder()) {
      query = query.filter(order+">", value);
    }
    return query.order(desc ? "-"+order : order);
  }
 
  protected QueryAsync<PersonLongManualID> queryPersonLongManualIDOrderBy(String order, Object value, boolean desc) {
    QueryAsync<PersonLongManualID> query = pm.createQuery(PersonLongManualID.class);
    if(mustFilterToOrder()) {
      query = query.filter(order+">", value);
    }
    return query.order(desc ? "-"+order : order);
  }
 
  public QueryAsync<PersonStringID> queryPersonStringIDOrderBy(String order, Object value, boolean desc) {
    QueryAsync<PersonStringID> query = pm.createQuery(PersonStringID.class);
    if(mustFilterToOrder()) {
      query = query.filter(order+">", value);
    }
    return query.order(desc ? "-"+order : order);
  }
 
  public void testCount() {
    assertEquals(3, pm.createQuery(PersonUUID.class).count().get().intValue());
  }
 
  public void testFetch() {
    SienaFuture<List<PersonUUID>> future = queryPersonUUIDOrderBy("n", 0, false).fetch();

    List<PersonUUID> people = future.get();
    assertNotNull(people);
    assertEquals(3, people.size());

    assertEquals(UUID_TESLA, people.get(0));
    assertEquals(UUID_CURIE, people.get(1));
    assertEquals(UUID_EINSTEIN, people.get(2));
  }
 
  public void testFetchKeys() {
    SienaFuture<List<PersonUUID>> future = queryPersonUUIDOrderBy("n", 0, false).fetchKeys();

    List<PersonUUID> people = future.get();
    assertNotNull(people);
    assertEquals(3, people.size());

    assertEquals(UUID_TESLA.id, people.get(0).id);
    assertEquals(UUID_CURIE.id, people.get(1).id);
    assertEquals(UUID_EINSTEIN.id, people.get(2).id);
   
    assertTrue(people.get(0).isOnlyIdFilled());
    assertTrue(people.get(1).isOnlyIdFilled());
    assertTrue(people.get(2).isOnlyIdFilled());

  }
 
  public void testFetchOrder() {
    SienaFuture<List<PersonUUID>> future = queryPersonUUIDOrderBy("firstName", "", false).fetch();

    List<PersonUUID> people = future.get();
    assertNotNull(people);
    assertEquals(3, people.size());

    assertEquals(UUID_EINSTEIN, people.get(0));
    assertEquals(UUID_CURIE, people.get(1));
    assertEquals(UUID_TESLA, people.get(2));
  }
 
  public void testFetchOrderKeys() {
    SienaFuture<List<PersonUUID>> future = queryPersonUUIDOrderBy("firstName", "", false).fetchKeys();

    List<PersonUUID> people = future.get();
    assertNotNull(people);
    assertEquals(3, people.size());

    assertEquals(UUID_EINSTEIN.id, people.get(0).id);
    assertEquals(UUID_CURIE.id, people.get(1).id);
    assertEquals(UUID_TESLA.id, people.get(2).id);
  }

  public void testFetchOrderDesc() {
    SienaFuture<List<PersonUUID>> future = queryPersonUUIDOrderBy("lastName", "", true).fetch();

    List<PersonUUID> people = future.get();
    assertNotNull(people);
    assertEquals(3, people.size());

    assertEquals(UUID_TESLA, people.get(0));
    assertEquals(UUID_EINSTEIN, people.get(1));
    assertEquals(UUID_CURIE, people.get(2));
  }

  public void testFetchOrderDescKeys() {
    SienaFuture<List<PersonUUID>> future = queryPersonUUIDOrderBy("lastName", "", true).fetchKeys();

    List<PersonUUID> people = future.get();
    assertNotNull(people);
    assertEquals(3, people.size());

    assertEquals(UUID_TESLA.id, people.get(0).id);
    assertEquals(UUID_EINSTEIN.id, people.get(1).id);
    assertEquals(UUID_CURIE.id, people.get(2).id);
  }
 
  public void testFetchOrderOnLongAutoId() {
    SienaFuture<List<PersonLongAutoID>> future = queryPersonLongAutoIDOrderBy("id", "", false).fetchKeys();

    List<PersonLongAutoID> people = future.get();
    assertNotNull(people);
    assertEquals(3, people.size());

    assertEquals(LongAutoID_TESLA.id, people.get(0).id);
    assertEquals(LongAutoID_CURIE.id, people.get(1).id);
    assertEquals(LongAutoID_EINSTEIN.id, people.get(2).id);
  }
 
  public void testFetchOrderOnLongManualId() {
    SienaFuture<List<PersonLongManualID>> future = queryPersonLongManualIDOrderBy("id", "", false).fetchKeys();

    List<PersonLongManualID> people = future.get();
    assertNotNull(people);
    assertEquals(3, people.size());

    assertEquals(LongManualID_TESLA.id, people.get(0).id);
    assertEquals(LongManualID_CURIE.id, people.get(1).id);
    assertEquals(LongManualID_EINSTEIN.id, people.get(2).id);
  }
 
  public void testFetchOrderOnStringId() {
    SienaFuture<List<PersonStringID>> future = queryPersonStringIDOrderBy("id", "", false).fetchKeys();

    List<PersonStringID> people = future.get();
    assertNotNull(people);
    assertEquals(3, people.size());

    assertEquals(StringID_CURIE.id, people.get(0).id);
    assertEquals(StringID_EINSTEIN.id, people.get(1).id);
    assertEquals(StringID_TESLA.id, people.get(2).id);
  }
   
  public void testFetchOrderOnUUID() {
    List<PersonUUID> l = getOrderedPersonUUIDs();
    SienaFuture<List<PersonUUID>> future = queryPersonUUIDOrderBy("id", "", false).fetchKeys();

    List<PersonUUID> people = future.get();
    assertNotNull(people);
    assertEquals(3, people.size());

    assertEquals(l.get(0).id, people.get(0).id);
    assertEquals(l.get(1).id, people.get(1).id);
    assertEquals(l.get(2).id, people.get(2).id);
  }
 
  public void testFetchOrderOnLongAutoIdDesc() {
    SienaFuture<List<PersonLongAutoID>> future = queryPersonLongAutoIDOrderBy("id", "", true).fetchKeys();

    List<PersonLongAutoID> people = future.get();
    assertNotNull(people);
    assertEquals(3, people.size());

    assertEquals(LongAutoID_EINSTEIN.id, people.get(0).id);
    assertEquals(LongAutoID_CURIE.id, people.get(1).id);
    assertEquals(LongAutoID_TESLA.id, people.get(2).id);
  }
   
  public void testFetchOrderOnLongManualIdDesc() {
    SienaFuture<List<PersonLongManualID>> future = queryPersonLongManualIDOrderBy("id", "", true).fetchKeys();

    List<PersonLongManualID> people = future.get();
    assertNotNull(people);
    assertEquals(3, people.size());

    assertEquals(LongManualID_EINSTEIN.id, people.get(0).id);
    assertEquals(LongManualID_CURIE.id, people.get(1).id);
    assertEquals(LongManualID_TESLA.id, people.get(2).id);
  }
 
  public void testFetchOrderOnStringIdDesc() {
    SienaFuture<List<PersonStringID>> future = queryPersonStringIDOrderBy("id", "", true).fetchKeys();

    List<PersonStringID> people = future.get();
    assertNotNull(people);
    assertEquals(3, people.size());

    assertEquals(StringID_TESLA.id, people.get(0).id);
    assertEquals(StringID_EINSTEIN.id, people.get(1).id);
    assertEquals(StringID_CURIE.id, people.get(2).id);
  }
 
  public void testFetchOrderOnUUIDDesc() {
    List<PersonUUID> l = getOrderedPersonUUIDs();
    SienaFuture<List<PersonUUID>> future = queryPersonUUIDOrderBy("id", "", true).fetchKeys();

    List<PersonUUID> people = future.get();
    assertNotNull(people);
    assertEquals(3, people.size());

    assertEquals(l.get(2).id, people.get(0).id);
    assertEquals(l.get(1).id, people.get(1).id);
    assertEquals(l.get(0).id, people.get(2).id);
  }
 
  public void testFilterOperatorEqualString() {
    SienaFuture<PersonUUID> future = pm.createQuery(PersonUUID.class).filter("firstName", "Albert").get();   
    PersonUUID person = future.get();
    assertNotNull(person);
    assertEquals(UUID_EINSTEIN, person);
  }
 
  public void testFilterOperatorEqualInt() {
    SienaFuture<PersonUUID> future = pm.createQuery(PersonUUID.class).filter("n", 3).get();
    PersonUUID person = future.get();
    assertNotNull(person);
    assertEquals(UUID_EINSTEIN, person);
  }
 
  public void testFilterOperatorEqualUUID() {
    List<PersonUUID> l = getOrderedPersonUUIDs()
    SienaFuture<PersonUUID> future = pm.createQuery(PersonUUID.class).filter("id", l.get(0).id).get();
    PersonUUID person = future.get();
    assertNotNull(person);
    assertEquals(l.get(0), person);
  }
 
  public void testFilterOperatorEqualLongAutoID() {
    SienaFuture<PersonLongAutoID> future = pm.createQuery(PersonLongAutoID.class).filter("id", LongAutoID_EINSTEIN.id).get();
    PersonLongAutoID person = future.get();
    assertNotNull(person);
    assertEquals(LongAutoID_EINSTEIN, person);
  }
   
  public void testFilterOperatorEqualLongManualID() {
    SienaFuture<PersonLongManualID> future = pm.createQuery(PersonLongManualID.class).filter("id", 3L).get();
    PersonLongManualID person = future.get();
    assertNotNull(person);
    assertEquals(LongManualID_EINSTEIN, person);
  }
 
  public void testFilterOperatorEqualStringID() {
    SienaFuture<PersonStringID> future = pm.createQuery(PersonStringID.class).filter("id", "EINSTEIN").get();
    PersonStringID person = future.get();
    assertNotNull(person);
    assertEquals(StringID_EINSTEIN, person);
  }
 
  public void testFilterOperatorNotEqualString() {
    SienaFuture<List<PersonStringID>> future = pm.createQuery(PersonStringID.class).filter("firstName!=", "Albert").order("firstName").fetch();

    List<PersonStringID> people = future.get();
    assertNotNull(people);
    assertEquals(2, people.size());

    assertEquals(StringID_CURIE, people.get(0));
    assertEquals(StringID_TESLA, people.get(1));
  }
 
  public void testFilterOperatorNotEqualInt() {
    SienaFuture<List<PersonUUID>> future = pm.createQuery(PersonUUID.class).filter("n!=", 3).order("n").fetch();

    List<PersonUUID> people = future.get();
    assertNotNull(people);
    assertEquals(2, people.size());

    assertEquals(UUID_TESLA, people.get(0));
    assertEquals(UUID_CURIE, people.get(1));
  }

  public void testFilterOperatorNotEqualUUID() {
    List<PersonUUID> l = getOrderedPersonUUIDs();
    SienaFuture<List<PersonUUID>> future = pm.createQuery(PersonUUID.class).filter("id!=", l.get(0).id).order("id").fetch();

    List<PersonUUID> people = future.get();
    assertNotNull(people);
    assertEquals(2, people.size());

    assertEquals(l.get(1), people.get(0));
    assertEquals(l.get(2), people.get(1));
  }
 
  public void testFilterOperatorNotEqualLongAutoID() {
    SienaFuture<List<PersonLongAutoID>> future = pm.createQuery(PersonLongAutoID.class).filter("id!=", LongAutoID_EINSTEIN.id).order("id").fetch();

    List<PersonLongAutoID> people = future.get();
    assertNotNull(people);
    assertEquals(2, people.size());

    assertEquals(LongAutoID_TESLA, people.get(0));
    assertEquals(LongAutoID_CURIE, people.get(1));
  }

  public void testFilterOperatorNotEqualLongManualID() {
    SienaFuture<List<PersonLongManualID>> future = pm.createQuery(PersonLongManualID.class).filter("id!=", 3L).order("id").fetch();

    List<PersonLongManualID> people = future.get();
    assertNotNull(people);
    assertEquals(2, people.size());

    assertEquals(LongManualID_TESLA, people.get(0));
    assertEquals(LongManualID_CURIE, people.get(1));
  }
 
  public void testFilterOperatorNotEqualStringID() {
    SienaFuture<List<PersonStringID>> future = pm.createQuery(PersonStringID.class).filter("id!=", StringID_EINSTEIN.id).order("id").fetch();

    List<PersonStringID> people = future.get();
    assertNotNull(people);
    assertEquals(2, people.size());

    assertEquals(StringID_CURIE, people.get(0));
    assertEquals(StringID_TESLA, people.get(1));
  }
 
  public void testFilterOperatorIn() {
    @SuppressWarnings("serial")
    SienaFuture<List<PersonUUID>> future =
      pm.createQuery(PersonUUID.class)
        .filter("n IN", new ArrayList<Integer>(){{
          add(2);
          add(3);
        }})
        .order("n")
        .fetch();

    List<PersonUUID> people = future.get();
    assertNotNull(people);
    assertEquals(2, people.size());

    assertEquals(UUID_CURIE, people.get(0));
    assertEquals(UUID_EINSTEIN, people.get(1));
  }
 
  public void testFilterOperatorInOrder() {
    @SuppressWarnings("serial")
    SienaFuture<List<PersonUUID>> future =
      pm.createQuery(PersonUUID.class)
        .filter("n IN", new ArrayList<Integer>(){{
          add(3);
          add(2);
        }})
        .order("n")
        .fetch();

    List<PersonUUID> people = future.get();
    assertNotNull(people);
    assertEquals(2, people.size());

    assertEquals(UUID_CURIE, people.get(0));
    assertEquals(UUID_EINSTEIN, people.get(1));
  }
 
  public void testFilterOperatorInForUUID() {
    List<PersonUUID> l = getOrderedPersonUUIDs();
   
    SienaFuture<List<PersonUUID>> future =
      pm.createQuery(PersonUUID.class)
        .filter("id IN", Arrays.asList( l.get(0).id, l.get(1).id))
        .fetch();

    List<PersonUUID> people = future.get();
    assertNotNull(people);
    assertEquals(2, people.size());

    assertEquals(l.get(0), people.get(0));
    assertEquals(l.get(1), people.get(1));
  }
 
  public void testFilterOperatorInForLongAutoID() {
    @SuppressWarnings("serial")
    SienaFuture<List<PersonLongAutoID>> future =
      pm.createQuery(PersonLongAutoID.class)
        .filter("id IN", new ArrayList<Long>(){{
          add(LongAutoID_TESLA.id);
          add(LongAutoID_CURIE.id);
        }})
        .fetch();

    List<PersonLongAutoID> people = future.get();
    assertNotNull(people);
    assertEquals(2, people.size());

    assertEquals(LongAutoID_TESLA, people.get(0));
    assertEquals(LongAutoID_CURIE, people.get(1));
  }

  public void testFilterOperatorInForLongManualID() {
    @SuppressWarnings("serial")
    SienaFuture<List<PersonLongManualID>> future =
      pm.createQuery(PersonLongManualID.class)
        .filter("id IN", new ArrayList<Long>(){{
          add(LongManualID_TESLA.id);
          add(LongManualID_CURIE.id);
        }})
        .fetch();

    List<PersonLongManualID> people = future.get();
    assertNotNull(people);
    assertEquals(2, people.size());

    assertEquals(LongManualID_TESLA, people.get(0));
    assertEquals(LongManualID_CURIE, people.get(1));
  }
 
  public void testFilterOperatorInForStringID() {
    @SuppressWarnings("serial")
    SienaFuture<List<PersonStringID>> future =
      pm.createQuery(PersonStringID.class)
        .filter("id IN", new ArrayList<String>(){{
          add(StringID_TESLA.id);
          add(StringID_CURIE.id);
        }})
        .order("id")
        .fetch();

    List<PersonStringID> people = future.get();
    assertNotNull(people);
    assertEquals(2, people.size());

    assertEquals(StringID_CURIE, people.get(0));
    assertEquals(StringID_TESLA, people.get(1));
  }
 
  public void testFilterOperatorLessThan() {
    SienaFuture<List<PersonUUID>> future = pm.createQuery(PersonUUID.class).filter("n<", 3).order("n").fetch();

    List<PersonUUID> people = future.get();
    assertNotNull(people);
    assertEquals(2, people.size());

    assertEquals(UUID_TESLA, people.get(0));
    assertEquals(UUID_CURIE, people.get(1));
  }
 
  public void testFilterOperatorLessThanForUUID() {
    List<PersonUUID> l = getOrderedPersonUUIDs();

    SienaFuture<List<PersonUUID>> future = pm.createQuery(PersonUUID.class).filter("id<", l.get(2).id).order("id").fetch();

    List<PersonUUID> people = future.get();
    assertNotNull(people);
    assertEquals(2, people.size());
   
    assertEquals(l.get(0), people.get(0));
    assertEquals(l.get(1), people.get(1));
  }
 
  public void testFilterOperatorLessThanForLongAutoID() {
    SienaFuture<List<PersonLongAutoID>> future = pm.createQuery(PersonLongAutoID.class).filter("id<", LongAutoID_EINSTEIN.id).order("id").fetch();

    List<PersonLongAutoID> people = future.get();
    assertNotNull(people);
    assertEquals(2, people.size());

    assertEquals(LongAutoID_TESLA, people.get(0));
    assertEquals(LongAutoID_CURIE, people.get(1));
  }
 
  public void testFilterOperatorLessThanForLongManualID() {
    SienaFuture<List<PersonLongManualID>> future = pm.createQuery(PersonLongManualID.class).filter("id<", 3L).order("id").fetch();

    List<PersonLongManualID> people = future.get();
    assertNotNull(people);
    assertEquals(2, people.size());

    assertEquals(LongManualID_TESLA, people.get(0));
    assertEquals(LongManualID_CURIE, people.get(1));
  }
 
  public void testFilterOperatorLessThanForStringID() {
    SienaFuture<List<PersonStringID>> future = pm.createQuery(PersonStringID.class).filter("id<", StringID_TESLA.id).order("id").fetch();

    List<PersonStringID> people = future.get();
    assertNotNull(people);
    assertEquals(2, people.size());

    assertEquals(StringID_CURIE, people.get(0));
    assertEquals(StringID_EINSTEIN, people.get(1));
  }
 
  public void testFilterOperatorLessThanOrEqual() {
    SienaFuture<List<PersonUUID>> future = pm.createQuery(PersonUUID.class).filter("n<=", 3).order("n").fetch();

    List<PersonUUID> people = future.get();
    assertNotNull(people);
    assertEquals(3, people.size());

    assertEquals(UUID_TESLA, people.get(0));
    assertEquals(UUID_CURIE, people.get(1));
    assertEquals(UUID_EINSTEIN, people.get(2));   
  }
 
  public void testFilterOperatorLessThanOrEqualForUUID() {
    List<PersonUUID> l = getOrderedPersonUUIDs();

    SienaFuture<List<PersonUUID>> future = pm.createQuery(PersonUUID.class).filter("id<=", l.get(2).id).order("id").fetch();

    List<PersonUUID> people = future.get();
    assertNotNull(people);
    assertEquals(3, people.size());

   
    assertEquals(l.get(0), people.get(0));
    assertEquals(l.get(1), people.get(1));
    assertEquals(l.get(2), people.get(2));
  }
 
  public void testFilterOperatorLessThanOrEqualForLongAutoID() {
    SienaFuture<List<PersonLongAutoID>> future = pm.createQuery(PersonLongAutoID.class).filter("id<=", LongAutoID_EINSTEIN.id).order("id").fetch();

    List<PersonLongAutoID> people = future.get();
    assertNotNull(people);
    assertEquals(3, people.size());

    assertEquals(LongAutoID_TESLA, people.get(0));
    assertEquals(LongAutoID_CURIE, people.get(1));
    assertEquals(LongAutoID_EINSTEIN, people.get(2));
  }
 
  public void testFilterOperatorLessThanOrEqualForLongManualID() {
    SienaFuture<List<PersonLongManualID>> future = pm.createQuery(PersonLongManualID.class).filter("id<=", LongManualID_EINSTEIN.id).order("id").fetch();

    List<PersonLongManualID> people = future.get();
    assertNotNull(people);
    assertEquals(3, people.size());

    assertEquals(LongManualID_TESLA, people.get(0));
    assertEquals(LongManualID_CURIE, people.get(1));
    assertEquals(LongManualID_EINSTEIN, people.get(2));
  }
 
  public void testFilterOperatorLessThanOrEqualForStringID() {
    SienaFuture<List<PersonStringID>> future = pm.createQuery(PersonStringID.class).filter("id<=", StringID_TESLA.id).order("id").fetch();

    List<PersonStringID> people = future.get();
    assertNotNull(people);
    assertEquals(3, people.size());

    assertEquals(StringID_CURIE, people.get(0));
    assertEquals(StringID_EINSTEIN, people.get(1));
    assertEquals(StringID_TESLA, people.get(2));
  }
 
 
  public void testFilterOperatorMoreThan() {
    SienaFuture<List<PersonUUID>> future = pm.createQuery(PersonUUID.class).filter("n>", 1).order("n").fetch();

    List<PersonUUID> people = future.get();
    assertNotNull(people);
    assertEquals(2, people.size());

    assertEquals(UUID_CURIE, people.get(0));
    assertEquals(UUID_EINSTEIN, people.get(1));
  }
 
  public void testFilterOperatorMoreThanForUUID() {
    List<PersonUUID> l = getOrderedPersonUUIDs();

    SienaFuture<List<PersonUUID>> future = pm.createQuery(PersonUUID.class).filter("id>", l.get(0).id).order("id").fetch();

    List<PersonUUID> people = future.get();
    assertNotNull(people);
    assertEquals(2, people.size());
   
    assertEquals(l.get(1), people.get(0));
    assertEquals(l.get(2), people.get(1));
  }
 
  public void testFilterOperatorMoreThanForLongAutoID() {
    SienaFuture<List<PersonLongAutoID>> future = pm.createQuery(PersonLongAutoID.class).filter("id>", LongAutoID_TESLA.id).order("id").fetch();

    List<PersonLongAutoID> people = future.get();
    assertNotNull(people);
    assertEquals(2, people.size());

    assertEquals(LongAutoID_CURIE, people.get(0));
    assertEquals(LongAutoID_EINSTEIN, people.get(1));
  }
 
  public void testFilterOperatorMoreThanForLongManualID() {
    SienaFuture<List<PersonLongManualID>> future = pm.createQuery(PersonLongManualID.class).filter("id>", LongManualID_TESLA.id).order("id").fetch();

    List<PersonLongManualID> people = future.get();
    assertNotNull(people);
    assertEquals(2, people.size());

    assertEquals(LongManualID_CURIE, people.get(0));
    assertEquals(LongManualID_EINSTEIN, people.get(1));
  }
 
  public void testFilterOperatorMoreThanForStringID() {
    SienaFuture<List<PersonStringID>> future = pm.createQuery(PersonStringID.class).filter("id>", StringID_CURIE.id).order("id").fetch();

    List<PersonStringID> people = future.get();
    assertNotNull(people);
    assertEquals(2, people.size());

    assertEquals(StringID_EINSTEIN, people.get(0));
    assertEquals(StringID_TESLA, people.get(1));
  }

 
  public void testFilterOperatorMoreThanOrEqual() {
    SienaFuture<List<PersonUUID>> future = pm.createQuery(PersonUUID.class).filter("n>=", 1).order("n").fetch();

    List<PersonUUID> people = future.get();
    assertNotNull(people);
    assertEquals(3, people.size());

    assertEquals(UUID_TESLA, people.get(0));
    assertEquals(UUID_CURIE, people.get(1));
    assertEquals(UUID_EINSTEIN, people.get(2));
  }

  public void testFilterOperatorMoreThanOrEqualForUUID() {
    List<PersonUUID> l = getOrderedPersonUUIDs();

    SienaFuture<List<PersonUUID>> future = pm.createQuery(PersonUUID.class).filter("id>=", l.get(0).id).order("id").fetch();

    List<PersonUUID> people = future.get();
    assertNotNull(people);
    assertEquals(3, people.size());

   
    assertEquals(l.get(0), people.get(0));
    assertEquals(l.get(1), people.get(1));
    assertEquals(l.get(2), people.get(2));
  }
 
  public void testFilterOperatorMoreThanOrEqualForLongAutoID() {
    SienaFuture<List<PersonLongAutoID>> future = pm.createQuery(PersonLongAutoID.class).filter("id>=", LongAutoID_CURIE.id).order("id").fetch();

    List<PersonLongAutoID> people = future.get();
    assertNotNull(people);
    assertEquals(2, people.size());

    assertEquals(LongAutoID_CURIE, people.get(0));
    assertEquals(LongAutoID_EINSTEIN, people.get(1));
  }
 
  public void testFilterOperatorMoreThanOrEqualForLongManualID() {
    SienaFuture<List<PersonLongManualID>> future = pm.createQuery(PersonLongManualID.class).filter("id>=", LongManualID_CURIE.id).order("id").fetch();

    List<PersonLongManualID> people = future.get();
    assertNotNull(people);
    assertEquals(2, people.size());

    assertEquals(LongManualID_CURIE, people.get(0));
    assertEquals(LongManualID_EINSTEIN, people.get(1));
  }
 
  public void testFilterOperatorMoreThanOrEqualForStringID() {
    SienaFuture<List<PersonStringID>> future = pm.createQuery(PersonStringID.class).filter("id>=", StringID_EINSTEIN.id).order("id").fetch();

    List<PersonStringID> people = future.get();
    assertNotNull(people);
    assertEquals(2, people.size());

    assertEquals(StringID_EINSTEIN, people.get(0));
    assertEquals(StringID_TESLA, people.get(1));
  }
 
  public void testCountFilter() {
    assertEquals(2, pm.createQuery(PersonUUID.class).filter("n<", 3).count().get().intValue());
  }

  public void testCountFilterUUID() {
    List<PersonUUID> l = getOrderedPersonUUIDs();
    assertEquals(2, pm.createQuery(PersonUUID.class).filter("id<", l.get(2).id).count().get().intValue());
  }
 
  public void testCountFilterLongAutoID() {
    assertEquals(2, pm.createQuery(PersonLongAutoID.class).filter("id<", LongAutoID_EINSTEIN.id).count().get().intValue());
  }

  public void testCountFilterLongManualID() {
    assertEquals(2, pm.createQuery(PersonLongManualID.class).filter("id<", LongManualID_EINSTEIN.id).count().get().intValue());
  }
 
  public void testCountFilterStringID() {
    assertEquals(2, pm.createQuery(PersonStringID.class).filter("id<", StringID_TESLA.id).count().get().intValue());
  }
 
  public void testFetchLimit() {
    SienaFuture<List<PersonUUID>> future = queryPersonUUIDOrderBy("n", 0, false).fetch(1);

    List<PersonUUID> people = future.get();
    assertNotNull(people);
    assertEquals(1, people.size());

    assertEquals(UUID_TESLA, people.get(0));
  }

  public void testFetchLimitUUID() {
    List<PersonUUID> l = getOrderedPersonUUIDs();
    SienaFuture<List<PersonUUID>> future = queryPersonUUIDOrderBy("id", l.get(0), false).fetch(1);

    List<PersonUUID> people = future.get();
    assertNotNull(people);
    assertEquals(1, people.size());

    assertEquals(l.get(0), people.get(0));
  }
 
  public void testFetchLimitLongAutoID() {
    SienaFuture<List<PersonLongAutoID>> future = queryPersonLongAutoIDOrderBy("id", 0, false).fetch(1);

    List<PersonLongAutoID> people = future.get();
    assertNotNull(people);
    assertEquals(1, people.size());

    assertEquals(LongAutoID_TESLA, people.get(0));
  }
 
  public void testFetchLimitLongManualID() {
    SienaFuture<List<PersonLongManualID>> future = queryPersonLongManualIDOrderBy("id", 0, false).fetch(1);

    List<PersonLongManualID> people = future.get();
    assertNotNull(people);
    assertEquals(1, people.size());

    assertEquals(LongManualID_TESLA, people.get(0));
  }
 
  public void testFetchLimitStringID() {
    SienaFuture<List<PersonStringID>> future = queryPersonStringIDOrderBy("id", StringID_CURIE, false).fetch(1);

    List<PersonStringID> people = future.get();
    assertNotNull(people);
    assertEquals(1, people.size());

    assertEquals(StringID_CURIE, people.get(0));
  }
 
  public void testFetchLimitReal() {
    Discovery[] discs = new Discovery[10];
    for(int i=0; i<10; i++){
      discs[i] = new Discovery("Disc_"+i, LongAutoID_CURIE);
    }

    pm.insert((Object[])discs).get();

    SienaFuture<List<Discovery>> future = pm.createQuery(Discovery.class).order("name").fetch(3);
    List<Discovery> res = future.get();
    assertNotNull(res);
    assertEquals(3, res.size());
   
    assertEquals(discs[0], res.get(0));
    assertEquals(discs[1], res.get(1));
    assertEquals(discs[2], res.get(2));
  }

  public void testFetchLimitOffsetReal() {
    Discovery[] discs = new Discovery[10];
    for(int i=0; i<10; i++){
      discs[i] = new Discovery("Disc_"+i, LongAutoID_CURIE);
    }

    pm.insert((Object[])discs).get();
   
    SienaFuture<List<Discovery>> future = pm.createQuery(Discovery.class).order("name").fetch(3, 5);
    List<Discovery> res = future.get();
    assertNotNull(res);
    assertEquals(3, res.size());
   
    assertEquals(discs[5], res.get(0));
    assertEquals(discs[6], res.get(1));
    assertEquals(discs[7], res.get(2));
  }
 
  public void testFetchLimitOffset() {
    QueryAsync<PersonUUID> query = queryPersonUUIDOrderBy("n", 0, false);
    SienaFuture<List<PersonUUID>> future = query.fetch(2, 1);

    List<PersonUUID> people = future.get();
    assertNotNull(people);
    assertEquals(2, people.size());

    assertEquals(UUID_CURIE, people.get(0));
    assertEquals(UUID_EINSTEIN, people.get(1));
  }

  public void testInsertUUID() {
    PersonUUID maxwell = new PersonUUID();
    maxwell.firstName = "James Clerk";
    maxwell.lastName = "Maxwell";
    maxwell.city = "Edinburgh";
    maxwell.n = 4;

    pm.insert(maxwell).get();
    assertNotNull(maxwell.id);

    SienaFuture<List<PersonUUID>> future = queryPersonUUIDOrderBy("n", 0, false).fetch();
    List<PersonUUID> people = future.get();
    assertEquals(4, people.size());

    assertEquals(UUID_TESLA, people.get(0));
    assertEquals(UUID_CURIE, people.get(1));
    assertEquals(UUID_EINSTEIN, people.get(2));
    assertEquals(maxwell, people.get(3));
  }

  public void testInsertLongAutoID() {
    PersonLongAutoID maxwell = new PersonLongAutoID();
    maxwell.firstName = "James Clerk";
    maxwell.lastName = "Maxwell";
    maxwell.city = "Edinburgh";
    maxwell.n = 4;

    pm.insert(maxwell).get();
    assertNotNull(maxwell.id);

    SienaFuture<List<PersonLongAutoID>> future = queryPersonLongAutoIDOrderBy("n", 0, false).fetch();
    List<PersonLongAutoID> people = future.get();
    assertEquals(4, people.size());

    assertEquals(LongAutoID_TESLA, people.get(0));
    assertEquals(LongAutoID_CURIE, people.get(1));
    assertEquals(LongAutoID_EINSTEIN, people.get(2));
    assertEquals(maxwell, people.get(3));
  }

  public void testInsertLongManualID() {
    PersonLongManualID maxwell = new PersonLongManualID();
    maxwell.id = 4L;
    maxwell.firstName = "James Clerk";
    maxwell.lastName = "Maxwell";
    maxwell.city = "Edinburgh";
    maxwell.n = 4;

    pm.insert(maxwell).get();
    assertEquals((Long)4L, maxwell.id);

    SienaFuture<List<PersonLongManualID>> future = queryPersonLongManualIDOrderBy("n", 0, false).fetch();
    List<PersonLongManualID> people = future.get();
    assertEquals(4, people.size());

    assertEquals(LongManualID_TESLA, people.get(0));
    assertEquals(LongManualID_CURIE, people.get(1));
    assertEquals(LongManualID_EINSTEIN, people.get(2));
    assertEquals(maxwell, people.get(3));
  }
 
  public void testInsertStringID() {
    PersonStringID maxwell = new PersonStringID();
    maxwell.id = "MAXWELL";
    maxwell.firstName = "James Clerk";
    maxwell.lastName = "Maxwell";
    maxwell.city = "Edinburgh";
    maxwell.n = 4;

    pm.insert(maxwell).get();
    assertEquals(maxwell.id, "MAXWELL");

    SienaFuture<List<PersonStringID>> future = queryPersonStringIDOrderBy("n", 0, false).fetch();
    List<PersonStringID> people = future.get();
    assertEquals(4, people.size());

    assertEquals(StringID_TESLA, people.get(0));
    assertEquals(StringID_CURIE, people.get(1));
    assertEquals(StringID_EINSTEIN, people.get(2));
    assertEquals(maxwell, people.get(3));
  }
 
  public void testGetUUID() {
    PersonUUID curie = getPersonUUID(UUID_CURIE.id);
    assertEquals(UUID_CURIE, curie);
  }

  public void testGetLongAutoID() {
    PersonLongAutoID curie = getPersonLongAutoID(LongAutoID_CURIE.id);
    assertEquals(LongAutoID_CURIE, curie);
  }

  public void testGetLongManualID() {
    PersonLongManualID curie = getPersonLongManualID(LongManualID_CURIE.id);
    assertEquals(LongManualID_CURIE, curie);
  }

  public void testGetStringID() {
    PersonStringID curie = getPersonStringID(StringID_CURIE.id);
    assertEquals(StringID_CURIE, curie);
  }

  public void testUpdateUUID() {
    PersonUUID curie = getPersonUUID(UUID_CURIE.id);
    curie.lastName = "Sklodowska–Curie";
    pm.update(curie).get();
    PersonUUID curie2 = getPersonUUID(UUID_CURIE.id);
    assertEquals(curie2, curie);
  }

  public void testUpdateLongAutoID() {
    PersonLongAutoID curie = getPersonLongAutoID(LongAutoID_CURIE.id);
    curie.lastName = "Sklodowska–Curie";
    pm.update(curie).get();
    PersonLongAutoID curie2 = getPersonLongAutoID(LongAutoID_CURIE.id);
    assertEquals(curie2, curie);
  }
 
  public void testDeleteUUID() {
    PersonUUID curie = getPersonUUID(UUID_CURIE.id);
    pm.delete(curie).get();
   
    SienaFuture<List<PersonUUID>> future = queryPersonUUIDOrderBy("n", 0, false).fetch();
    List<PersonUUID> people = future.get();
    assertNotNull(people);
    assertEquals(2, people.size());

    assertEquals(UUID_TESLA, people.get(0));
    assertEquals(UUID_EINSTEIN, people.get(1));
  }
 
  public void testIterFullUUID() {
    SienaFuture<Iterable<PersonUUID>> future = pm.createQuery(PersonUUID.class).order("n").iter();

    Iterable<PersonUUID> people = future.get();
    assertNotNull(people);

    @SuppressWarnings("serial")
    ArrayList<PersonUUID> l = new ArrayList<PersonUUID>() {{
      add(UUID_TESLA);
      add(UUID_CURIE);
      add(UUID_EINSTEIN);
    }};
   
    int i = 0;
    for (PersonUUID person : people) {
      assertEquals( l.get(i), person);
      i++;
    }
  }
 
  public void testIterFullLongAutoID() {
    SienaFuture<Iterable<PersonLongAutoID>> future = pm.createQuery(PersonLongAutoID.class).order("n").iter();

    Iterable<PersonLongAutoID> people = future.get();
    assertNotNull(people);

    PersonLongAutoID[] array = new PersonLongAutoID[] { LongAutoID_TESLA, LongAutoID_CURIE, LongAutoID_EINSTEIN };

    int i = 0;
    for (PersonLongAutoID person : people) {
      assertEquals(array[i], person);
      i++;
    }
  }

  public void testIterFullLongManualID() {
    SienaFuture<Iterable<PersonLongManualID>> future = pm.createQuery(PersonLongManualID.class).order("n").iter();

    Iterable<PersonLongManualID> people = future.get();
    assertNotNull(people);

    PersonLongManualID[] array = new PersonLongManualID[] { LongManualID_TESLA, LongManualID_CURIE, LongManualID_EINSTEIN };

    int i = 0;
    for (PersonLongManualID person : people) {
      assertEquals(array[i], person);
      i++;
    }
  }
 
  public void testIterFullLongStringID() {
    SienaFuture<Iterable<PersonStringID>> future = pm.createQuery(PersonStringID.class).order("n").iter();

    Iterable<PersonStringID> people = future.get();
    assertNotNull(people);

    PersonStringID[] array = new PersonStringID[] { StringID_TESLA, StringID_CURIE, StringID_EINSTEIN  };

    int i = 0;
    for (PersonStringID person : people) {
      assertEquals(array[i], person);
      i++;
    }
  }
 
  public void testIterLimitUUID() {
    SienaFuture<Iterable<PersonUUID>> future = pm.createQuery(PersonUUID.class).order("n").iter(2);

    Iterable<PersonUUID> people = future.get();
    assertNotNull(people);

    @SuppressWarnings("serial")
    ArrayList<PersonUUID> l = new ArrayList<PersonUUID>() {{
      add(UUID_TESLA);
      add(UUID_CURIE);
    }};
   
    int i = 0;
    for (PersonUUID person : people) {
      assertEquals( l.get(i), person);
      i++;
    }
  }
 
  public void testIterLimitLongAutoID() {
    SienaFuture<Iterable<PersonLongAutoID>> future = pm.createQuery(PersonLongAutoID.class).order("n").iter(2);

    Iterable<PersonLongAutoID> people = future.get();
    assertNotNull(people);

    PersonLongAutoID[] array = new PersonLongAutoID[] { LongAutoID_TESLA, LongAutoID_CURIE };

    int i = 0;
    for (PersonLongAutoID person : people) {
      assertEquals(array[i], person);
      i++;
    }
  }

  public void testIterLimitLongManualID() {
    SienaFuture<Iterable<PersonLongManualID>> future = pm.createQuery(PersonLongManualID.class).order("n").iter(2);

    Iterable<PersonLongManualID> people = future.get();
    assertNotNull(people);

    PersonLongManualID[] array = new PersonLongManualID[] { LongManualID_TESLA, LongManualID_CURIE };

    int i = 0;
    for (PersonLongManualID person : people) {
      assertEquals(array[i], person);
      i++;
    }
  }
 
  public void testIterLimitLongStringID() {
    SienaFuture<Iterable<PersonStringID>> future = pm.createQuery(PersonStringID.class).order("n").iter(2);

    Iterable<PersonStringID> people = future.get();
    assertNotNull(people);

    PersonStringID[] array = new PersonStringID[] { StringID_TESLA, StringID_CURIE };

    int i = 0;
    for (PersonStringID person : people) {
      assertEquals(array[i], person);
      i++;
    }
  }
 
  public void testIterLimitOffsetUUID() {
    SienaFuture<Iterable<PersonUUID>> future = pm.createQuery(PersonUUID.class).order("n").iter(2,1);

    Iterable<PersonUUID> people = future.get();
    assertNotNull(people);

    @SuppressWarnings("serial")
    ArrayList<PersonUUID> l = new ArrayList<PersonUUID>() {{
      add(UUID_CURIE);
      add(UUID_EINSTEIN);
    }};
   
    int i = 0;
    for (PersonUUID person : people) {
      assertEquals( l.get(i), person);
      i++;
    }
  }
 
  public void testIterLimitOffsetLongAutoID() {
    SienaFuture<Iterable<PersonLongAutoID>> future = pm.createQuery(PersonLongAutoID.class).order("n").iter(2, 1);

    Iterable<PersonLongAutoID> people = future.get();
    assertNotNull(people);

    PersonLongAutoID[] array = new PersonLongAutoID[] { LongAutoID_CURIE, LongAutoID_EINSTEIN };

    int i = 0;
    for (PersonLongAutoID person : people) {
      assertEquals(array[i], person);
      i++;
    }
  }

  public void testIterLimitOffsetLongManualID() {
    SienaFuture<Iterable<PersonLongManualID>> future = pm.createQuery(PersonLongManualID.class).order("n").iter(2,1);

    Iterable<PersonLongManualID> people = future.get();
    assertNotNull(people);

    PersonLongManualID[] array = new PersonLongManualID[] { LongManualID_CURIE, LongManualID_EINSTEIN };

    int i = 0;
    for (PersonLongManualID person : people) {
      assertEquals(array[i], person);
      i++;
    }
  }
 
  public void testIterLimitOffsetLongStringID() {
    SienaFuture<Iterable<PersonStringID>> future = pm.createQuery(PersonStringID.class).order("n").iter(2,1);

    Iterable<PersonStringID> people = future.get();
    assertNotNull(people);

    PersonStringID[] array = new PersonStringID[] { StringID_CURIE, StringID_EINSTEIN };

    int i = 0;
    for (PersonStringID person : people) {
      assertEquals(array[i], person);
      i++;
    }
  }
 
  public void testIterFilter() {
    SienaFuture<Iterable<PersonUUID>> future = pm.createQuery(PersonUUID.class).filter("n>", 1).order("n").iter();

    Iterable<PersonUUID> people = future.get();
    assertNotNull(people);

    PersonUUID[] array = new PersonUUID[] { UUID_CURIE, UUID_EINSTEIN };

    int i = 0;
    for (PersonUUID PersonIntKey : people) {
      assertEquals(array[i], PersonIntKey);
      i++;
    }
  }
 
  public void testIterFilterLimit() {
    SienaFuture<Iterable<PersonUUID>> future = pm.createQuery(PersonUUID.class).filter("n>", 1).order("n").iter(1);

    Iterable<PersonUUID> people = future.get();
    assertNotNull(people);

    PersonUUID[] array = new PersonUUID[] { UUID_CURIE };

    int i = 0;
    for (PersonUUID PersonIntKey : people) {
      assertEquals(array[i], PersonIntKey);
      i++;
    }
  }
 
  public void testIterFilterLimitOffset() {
    SienaFuture<Iterable<PersonUUID>> future = pm.createQuery(PersonUUID.class).filter("n>", 1).order("n").iter(2, 1);

    Iterable<PersonUUID> people = future.get();
    assertNotNull(people);

    PersonUUID[] array = new PersonUUID[] { UUID_EINSTEIN };

    int i = 0;
    for (PersonUUID PersonIntKey : people) {
      assertEquals(array[i], PersonIntKey);
      i++;
    }
  }
 
  public void testOrderLongAutoId() {
    SienaFuture<List<PersonLongAutoID>> future = queryPersonLongAutoIDOrderBy("id", "", false).fetch();
   
    List<PersonLongAutoID> people = future.get();
    assertNotNull(people);
    assertEquals(3, people.size());
   
    PersonLongAutoID[] array = new PersonLongAutoID[] { LongAutoID_TESLA, LongAutoID_CURIE, LongAutoID_EINSTEIN };

    int i = 0;
    for (PersonLongAutoID person : people) {
      assertEquals(array[i], person);
      i++;
    }
  }
 
  public void testOrderLongManualId() {
    SienaFuture<List<PersonLongManualID>> future = queryPersonLongManualIDOrderBy("id", "", false).fetch();
   
    List<PersonLongManualID> people = future.get();
    assertNotNull(people);
    assertEquals(3, people.size());
   
    PersonLongManualID[] array = new PersonLongManualID[] { LongManualID_TESLA, LongManualID_CURIE, LongManualID_EINSTEIN };

    int i = 0;
    for (PersonLongManualID person : people) {
      assertEquals(array[i], person);
      i++;
    }
  }
 
  public void testOrderStringId() {
    SienaFuture<List<PersonStringID>> future = queryPersonStringIDOrderBy("id", "", false).fetch();
   
    List<PersonStringID> people = future.get();
    assertNotNull(people);
    assertEquals(3, people.size());
   
    PersonStringID[] array = new PersonStringID[] { StringID_CURIE, StringID_EINSTEIN, StringID_TESLA };

    int i = 0;
    for (PersonStringID person : people) {
      assertEquals(array[i], person);
      i++;
    }
  }
 
  public void testGetObjectNotFound() {
    try {
      getPersonUUID("");
      fail();
    } catch(Exception e) {
      System.out.println("Everything is OK");
    }
   
    assertNull(pm.createQuery(PersonUUID.class).filter("firstName", "John").get().get());
  }
 
  public void testDeleteObjectNotFound() {
    try {
      PersonUUID p = new PersonUUID();
      pm.delete(p);
      fail();
    } catch(Exception e) {
      System.out.println("Everything is OK");
    }
  }
 
  public void testAutoincrement() {
    if(!supportsAutoincrement()) return;

    AutoInc first = new AutoInc();
    first.name = "first";
    pm.insert(first);
    assertTrue(first.id > 0);

    AutoInc second = new AutoInc();
    second.name = "second";
    pm.insert(second);
    assertTrue(second.id > 0);
   
    assertTrue(second.id > first.id);
  }
 
  public void testRelationship() {
    Discovery radioactivity = new Discovery("Radioactivity", LongAutoID_CURIE);
    Discovery relativity = new Discovery("Relativity", LongAutoID_EINSTEIN);
    Discovery teslaCoil = new Discovery("Tesla Coil", LongAutoID_TESLA);
    Discovery foo = new Discovery(null, LongAutoID_TESLA);
   
    pm.insert(radioactivity, relativity, teslaCoil, foo).get();

    SienaFuture<Discovery> relativity2 = pm.createQuery(Discovery.class).filter("discoverer", LongAutoID_EINSTEIN).get();
    SienaFuture<Discovery> foo2 = pm.createQuery(Discovery.class).filter("name", null).get();
    assertTrue(relativity.name.equals(relativity2.get().name));
    assertTrue(foo.id.equals(foo2.get().id));
  }
 
  public void testMultipleKeys() {
    if(!supportsMultipleKeys()) return;
   
    MultipleKeys a = new MultipleKeys();
    a.id1 = "aid1";
    a.id2 = "aid2";
    a.name = "first";
    a.parent = null;
    pm.insert(a);

    MultipleKeys b = new MultipleKeys();
    b.id1 = "bid1";
    b.id2 = "bid2";
    b.name = "second";
    b.parent = null;
    pm.insert(b);
   
    b.parent = a;
    pm.update(b);
  }
 
  public void testDataTypesNull() {
    DataTypes dataTypes = new DataTypes();
    pm.insert(dataTypes).get();
   
    assertEqualsDataTypes(dataTypes, pm.createQuery(DataTypes.class).get().get());
  }
 
  public void testDataTypesNotNull() {
    char[] c = new char[501];
    Arrays.fill(c, 'x');
   
    DataTypes dataTypes = new DataTypes();
    dataTypes.typeByte = 1;
    dataTypes.typeShort = 2;
    dataTypes.typeInt = 3;
    dataTypes.typeLong = 4;
    dataTypes.typeFloat = 5;
    dataTypes.typeDouble = 6;
    dataTypes.typeDate = new Date();
    dataTypes.typeString = "hello";
    dataTypes.typeLargeString = new String(c);
    dataTypes.typeJson = map().put("foo", "bar");
    dataTypes.addresses = new ArrayList<Address>();
    dataTypes.addresses.add(new Address("Castellana", "Madrid"));
    dataTypes.addresses.add(new Address("Diagonal", "Barcelona"));
    dataTypes.contacts = new HashMap<String, Contact>();
    dataTypes.contacts.put("id1", new Contact("Somebody", Arrays.asList("foo", "bar")));
   
    // Blob
    dataTypes.typeBlob = new byte[] {
        (byte)0x01, (byte)0x02, (byte)0x03, (byte)0x04,
        (byte)0x10(byte)0X11, (byte)0xF0, (byte)0xF1,
        (byte)0xF9(byte)0xFF };
   
    dataTypes.typeEnum = EnumLong.ALPHA;
   
    pm.insert(dataTypes).get();
   
    // to test that fields are read back correctly
    pm.createQuery(DataTypes.class).filter("id", dataTypes.id).get();
   
    SienaFuture<DataTypes> same = pm.createQuery(DataTypes.class).get();
    assertEqualsDataTypes(dataTypes, same.get());
  }
 
  private void assertEqualsDataTypes(DataTypes dataTypes, DataTypes same) {
    assertEquals(dataTypes.id, same.id);
    assertEquals(dataTypes.typeByte, same.typeByte);
    assertEquals(dataTypes.typeShort, same.typeShort);
    assertEquals(dataTypes.typeInt, same.typeInt);
    assertEquals(dataTypes.typeLong, same.typeLong);
    assertEquals(dataTypes.typeFloat, same.typeFloat);
    assertEquals(dataTypes.typeDouble, same.typeDouble);
    if(dataTypes.typeDate != null && same.typeDate != null) {
      assertEquals(dataTypes.typeDate.getTime() / 1000, same.typeDate.getTime() / 1000);
    } else {
      assertNull(dataTypes.typeDate);
      assertNull(same.typeDate);
    }
    assertEquals(dataTypes.typeString, same.typeString);
    assertEquals(dataTypes.typeLargeString, same.typeLargeString);
    assertEquals(dataTypes.typeJson, same.typeJson);

    if(dataTypes.addresses != null && same.addresses != null) {
      assertEquals(dataTypes.addresses.size(), same.addresses.size());
      int size = dataTypes.addresses.size();
      for (int i=0; i<size; i++) {
        assertEquals(dataTypes.addresses.get(i), same.addresses.get(i));
      }
    } else {
      assertNull(dataTypes.addresses);
      assertNull(same.addresses);
    }

    if(dataTypes.contacts != null && same.contacts != null) {
      assertEquals(dataTypes.contacts.size(), same.contacts.size());
      for (String key : dataTypes.contacts.keySet()) {
        assertEquals(dataTypes.contacts.get(key).name, same.contacts.get(key).name);
       
        List<String> a = dataTypes.contacts.get(key).tags;
        List<String> b = same.contacts.get(key).tags;
       
        assertEquals(a.size(), b.size());
       
        for (String string : b) {
          assertTrue(a.contains(string));
        }
      }
    } else {
      assertNull(dataTypes.contacts);
      assertNull(same.contacts);
    }
    if(dataTypes.typeBlob != null && same.typeBlob != null) {
      assertTrue(Arrays.equals(dataTypes.typeBlob, same.typeBlob));
    } else {
      assertNull(dataTypes.typeBlob);
      assertNull(same.typeBlob);
    }
   
    if(dataTypes.typeEnum != null && same.typeEnum != null) {
      assertEquals(dataTypes.typeEnum.getCode(), same.typeEnum.getCode());
    } else {
      assertNull(dataTypes.typeEnum);
      assertNull(same.typeEnum);
    }
  }
 
  public void testQueryDelete() {
    Discovery radioactivity = new Discovery("Radioactivity", LongAutoID_CURIE);
    Discovery relativity = new Discovery("Relativity", LongAutoID_EINSTEIN);
    Discovery teslaCoil = new Discovery("Tesla Coil", LongAutoID_TESLA);
   
    pm.insert(radioactivity, relativity, teslaCoil).get();

    int n = pm.createQuery(Discovery.class).delete().get();
    assertEquals(3, n);
   
    List<Discovery> res = pm.createQuery(Discovery.class).fetch().get();
    assertEquals(0, res.size());
  }
 
  public void testQueryDeleteFiltered() {
    Discovery radioactivity = new Discovery("Radioactivity", LongAutoID_CURIE);
    Discovery relativity = new Discovery("Relativity", LongAutoID_EINSTEIN);
    Discovery foo = new Discovery("Foo", LongAutoID_EINSTEIN);
    Discovery teslaCoil = new Discovery("Tesla Coil", LongAutoID_TESLA);
   
    pm.insert(radioactivity, relativity, foo, teslaCoil).get();

    int n = pm.createQuery(Discovery.class).filter("discoverer", LongAutoID_EINSTEIN).delete().get();
    assertEquals(2, n);

    List<Discovery> res = pm.createQuery(Discovery.class).order("name").fetch().get();
    assertEquals(2, res.size());
    assertEquals(radioactivity, res.get(0));
    assertEquals(teslaCoil, res.get(1));
  }
 
  public void testJoin() {
    Discovery radioactivity = new Discovery("Radioactivity", LongAutoID_CURIE);
    Discovery relativity = new Discovery("Relativity", LongAutoID_EINSTEIN);
    Discovery foo = new Discovery("Foo", LongAutoID_EINSTEIN);
    Discovery teslaCoil = new Discovery("Tesla Coil", LongAutoID_TESLA);
   
    pm.insert(radioactivity, relativity, foo, teslaCoil).get();
   
    SienaFuture<List<Discovery>> future = pm.createQuery(Discovery.class).join("discoverer").order("name").fetch();
   
    List<Discovery> res = future.get();
    assertEquals(4, res.size());
    assertEquals(foo, res.get(0));
    assertEquals(radioactivity, res.get(1));
    assertEquals(relativity, res.get(2));
    assertEquals(teslaCoil, res.get(3));
   
    assertEquals(LongAutoID_EINSTEIN, res.get(0).discoverer);
    assertEquals(LongAutoID_CURIE, res.get(1).discoverer);
    assertEquals(LongAutoID_EINSTEIN, res.get(2).discoverer);
    assertEquals(LongAutoID_TESLA, res.get(3).discoverer);
  }
 
  public void testJoinSortFields() {
    Discovery radioactivity = new Discovery("Radioactivity", LongAutoID_CURIE);
    Discovery relativity = new Discovery("Relativity", LongAutoID_EINSTEIN);
    Discovery foo = new Discovery("Foo", LongAutoID_EINSTEIN);
    Discovery teslaCoil = new Discovery("Tesla Coil", LongAutoID_TESLA);
   
    pm.insert(radioactivity, relativity, foo, teslaCoil).get();
   
    SienaFuture<List<Discovery>> future = pm.createQuery(Discovery.class).join("discoverer", "firstName").order("name").fetch();
    List<Discovery> res = future.get();
    assertEquals(4, res.size());
    assertEquals(foo, res.get(0));
    assertEquals(relativity, res.get(1));
    assertEquals(radioactivity, res.get(2));
    assertEquals(teslaCoil, res.get(3));
   
    assertEquals(LongAutoID_EINSTEIN, res.get(0).discoverer);
    assertEquals(LongAutoID_EINSTEIN, res.get(1).discoverer);
    assertEquals(LongAutoID_CURIE, res.get(2).discoverer);
    assertEquals(LongAutoID_TESLA, res.get(3).discoverer);
  }
 
  public void testJoinAnnotation() {
    Discovery4Join radioactivity = new Discovery4Join("Radioactivity", LongAutoID_CURIE, LongAutoID_TESLA);
    Discovery4Join relativity = new Discovery4Join("Relativity", LongAutoID_EINSTEIN, LongAutoID_TESLA);
    Discovery4Join foo = new Discovery4Join("Foo", LongAutoID_EINSTEIN, LongAutoID_EINSTEIN);
    Discovery4Join teslaCoil = new Discovery4Join("Tesla Coil", LongAutoID_TESLA, LongAutoID_CURIE);
   
    pm.insert(radioactivity, relativity, foo, teslaCoil).get();
   
    SienaFuture<List<Discovery4Join>> future = pm.createQuery(Discovery4Join.class).fetch();
    List<Discovery4Join> res = future.get();
    assertEquals(4, res.size());
    assertEquals(radioactivity, res.get(0));
    assertEquals(relativity, res.get(1));
    assertEquals(foo, res.get(2));
    assertEquals(teslaCoil, res.get(3));
   
    assertEquals(LongAutoID_CURIE, res.get(0).discovererJoined);
    assertEquals(LongAutoID_EINSTEIN, res.get(1).discovererJoined);
    assertEquals(LongAutoID_EINSTEIN, res.get(2).discovererJoined);
    assertEquals(LongAutoID_TESLA, res.get(3).discovererJoined);

    assertEquals(LongAutoID_TESLA.id, res.get(0).discovererNotJoined.id);
    assertEquals(LongAutoID_TESLA.id, res.get(1).discovererNotJoined.id);
    assertEquals(LongAutoID_EINSTEIN.id, res.get(2).discovererNotJoined.id);
    assertEquals(LongAutoID_CURIE.id, res.get(3).discovererNotJoined.id);
   
    assertTrue(res.get(0).discovererNotJoined.isOnlyIdFilled());
    assertTrue(res.get(1).discovererNotJoined.isOnlyIdFilled());
    assertTrue(res.get(2).discovererNotJoined.isOnlyIdFilled());
    assertTrue(res.get(3).discovererNotJoined.isOnlyIdFilled());
  }
 
  public void testFetchPrivateFields() {
    DiscoveryPrivate radioactivity = new DiscoveryPrivate(1L, "Radioactivity", LongAutoID_CURIE);
    DiscoveryPrivate relativity = new DiscoveryPrivate(2L, "Relativity", LongAutoID_EINSTEIN);
    DiscoveryPrivate foo = new DiscoveryPrivate(3L, "Foo", LongAutoID_EINSTEIN);
    DiscoveryPrivate teslaCoil = new DiscoveryPrivate(4L, "Tesla Coil", LongAutoID_TESLA);
   
    pm.insert(radioactivity, relativity, foo, teslaCoil).get();

    SienaFuture<List<DiscoveryPrivate>> future = pm.createQuery(DiscoveryPrivate.class).order("name").fetch();
    List<DiscoveryPrivate> res = future.get();
    assertEquals(foo, res.get(0));
    assertEquals(radioactivity, res.get(1));
    assertEquals(relativity, res.get(2));
    assertEquals(teslaCoil, res.get(3));
  }
 
  public void testFetchPaginateStatelessNextPage() {
    Discovery[] discs = new Discovery[10];
    for(int i=0; i<10; i++){
      discs[i] = new Discovery("Disc_"+i, LongAutoID_CURIE);
    }
    pm.insert((Object[])discs).get();

    QueryAsync<Discovery> query = pm.createQuery(Discovery.class).paginate(5).order("name");
    SienaFuture<List<Discovery>> future = query.fetch();
    List<Discovery> res = future.get();
    assertEquals(5, res.size());
    for(int i=0; i<5; i++){
      assertEquals(discs[i], res.get(i));
    }
    future = query.nextPage().fetch();
    res = future.get();
    assertEquals(5, res.size());
    for(int i=0; i<5; i++){
      assertEquals(discs[i+5], res.get(i));
    }
  }
 
  public void testFetchPaginateStatelessNextPageToEnd() {
    Discovery[] discs = new Discovery[10];
    for(int i=0; i<10; i++){
      discs[i] = new Discovery("Disc_"+i, LongAutoID_CURIE);
    }
    pm.insert((Object[])discs).get();

    QueryAsync<Discovery> query = pm.createQuery(Discovery.class).paginate(5).order("name");
    SienaFuture<List<Discovery>> future = query.fetch();
    List<Discovery> res = future.get();
    assertEquals(5, res.size());
    for(int i=0; i<5; i++){
      assertEquals(discs[i], res.get(i));
    }
    future = query.nextPage().fetch();
    res = future.get();
    assertEquals(5, res.size());
    for(int i=0; i<5; i++){
      assertEquals(discs[i+5], res.get(i));
    }
   
    future = query.nextPage().fetch();
    res = future.get();
    assertEquals(0, res.size());

    future = query.nextPage().fetch();
    res = future.get();
    assertEquals(0, res.size());

    future = query.previousPage().fetch();
    res = future.get();
    assertEquals(5, res.size());
    for(int i=0; i<5; i++){
      assertEquals(discs[i+5], res.get(i));
    }
   
    future = query.nextPage().fetch();
    res = future.get();
    assertEquals(0, res.size());
  }
 
  public void testFetchPaginateStatelessNextPageRealAsync() {
    Discovery[] discs = new Discovery[10];
    for(int i=0; i<10; i++){
      discs[i] = new Discovery("Disc_"+i, LongAutoID_CURIE);
    }
    pm.insert((Object[])discs).get();

    QueryAsync<Discovery> query = pm.createQuery(Discovery.class).paginate(5).order("name");
    SienaFuture<List<Discovery>> future1 = query.fetch();
    SienaFuture<List<Discovery>> future2 = query.nextPage().fetch();
   
    List<Discovery> res = future1.get();
    assertEquals(5, res.size());
    for(int i=0; i<5; i++){
      assertEquals(discs[i], res.get(i));
    }
    res = future2.get();
    assertEquals(5, res.size());
    for(int i=0; i<5; i++){
      assertEquals(discs[i+5], res.get(i));
    }
  }
 
  public void testFetchPaginateStatelessPreviousPageFromScratch() {
    Discovery[] discs = new Discovery[10];
    for(int i=0; i<10; i++){
      discs[i] = new Discovery("Disc_"+i, LongAutoID_CURIE);
    }
    pm.insert((Object[])discs).get();

    QueryAsync<Discovery> query = pm.createQuery(Discovery.class).paginate(5).order("name");
    SienaFuture<List<Discovery>> future = query.previousPage().fetch();
    List<Discovery> res = future.get();
    assertEquals(0, res.size());

    future = query.previousPage().fetch();
    res = future.get();
    assertEquals(0, res.size());
   
    future = query.nextPage().fetch();
    res = future.get();
    assertEquals(5, res.size());
    for(int i=0; i<5; i++){
      assertEquals(discs[i], res.get(i));
    }
   
    future = query.previousPage().fetch();
    res = future.get();
    assertEquals(0, res.size());
   
    future = query.previousPage().fetch();
    res = future.get();
    assertEquals(0, res.size());
   
    future = query.nextPage().fetch();
    res = future.get();
    assertEquals(5, res.size());
    for(int i=0; i<5; i++){
      assertEquals(discs[i], res.get(i));
    }
  }
 
  public void testFetchPaginateStatelessPreviousPage() {
    Discovery[] discs = new Discovery[10];
    for(int i=0; i<10; i++){
      discs[i] = new Discovery("Disc_"+i, LongAutoID_CURIE);
    }
    pm.insert((Object[])discs).get();

    QueryAsync<Discovery> query = pm.createQuery(Discovery.class).paginate(5).order("name");
    SienaFuture<List<Discovery>> future = query.nextPage().fetch();
    List<Discovery> res = future.get();
    assertEquals(5, res.size());
    for(int i=0; i<5; i++){
      assertEquals(discs[i+5], res.get(i));
    }
   
    future = query.previousPage().fetch();
    res = future.get();
    assertEquals(5, res.size());
    for(int i=0; i<5; i++){
      assertEquals(discs[i], res.get(i));
    }
  }
 
  public void testFetchPaginateStatelessPreviouPageSeveralTimes() {
    Discovery[] discs = new Discovery[15];
    for(int i=0; i<15; i++){
      discs[i] = new Discovery("Disc_"+i, LongAutoID_CURIE);
    }
    pm.insert((Object[])discs).get();

    QueryAsync<Discovery> query = pm.createQuery(Discovery.class).paginate(5).order("id");
    SienaFuture<List<Discovery>> future = query.fetch();
    List<Discovery> res = future.get();
    assertEquals(5, res.size());
    for(int i=0; i<5; i++){
      assertEquals(discs[i], res.get(i));
    }   
   
    future = query.nextPage().fetch();
    res = future.get();
    assertEquals(5, res.size());
    for(int i=0; i<5; i++){
      assertEquals(discs[i+5], res.get(i));
    }
   
    future = query.nextPage().fetch();
    res = future.get();
    assertEquals(5, res.size());
    for(int i=0; i<5; i++){
      assertEquals(discs[i+10], res.get(i));
    }
   
    future = query.previousPage().fetch();
    res = future.get();
    assertEquals(5, res.size());
    for(int i=0; i<5; i++){
      assertEquals(discs[i+5], res.get(i));
    }
   
    future = query.previousPage().fetch();
    res = future.get();
    assertEquals(5, res.size());
    for(int i=0; i<5; i++){
      assertEquals(discs[i], res.get(i));
    }
  }
 
  public void testFetchPaginateStatefulNextPage() {
    Discovery[] discs = new Discovery[10];
    for(int i=0; i<10; i++){
      discs[i] = new Discovery("Disc_"+i, LongAutoID_CURIE);
    }
    pm.insert((Object[])discs).get();

    QueryAsync<Discovery> query = pm.createQuery(Discovery.class).paginate(5).stateful().order("id");
    SienaFuture<List<Discovery>> future = query.fetch();
    List<Discovery> res = future.get();
    assertEquals(5, res.size());
    for(int i=0; i<5; i++){
      assertEquals(discs[i], res.get(i));
    }
    future = query.nextPage().fetch();
    res = future.get();
    assertEquals(5, res.size());
    for(int i=0; i<5; i++){
      assertEquals(discs[i+5], res.get(i));
    }
   
    future = query.nextPage().fetch();
    res = future.get();
    assertEquals(0, res.size());
  }
 
  public void testFetchPaginateStatefulNextPageToEnd() {
    Discovery[] discs = new Discovery[10];
    for(int i=0; i<10; i++){
      discs[i] = new Discovery("Disc_"+i, LongAutoID_CURIE);
    }
    pm.insert((Object[])discs).get();

    QueryAsync<Discovery> query = pm.createQuery(Discovery.class).paginate(5).order("name").stateful();
    SienaFuture<List<Discovery>> future = query.fetch();
    List<Discovery> res = future.get();
    assertEquals(5, res.size());
    for(int i=0; i<5; i++){
      assertEquals(discs[i], res.get(i));
    }
    future = query.nextPage().fetch();
    res = future.get();
    assertEquals(5, res.size());
    for(int i=0; i<5; i++){
      assertEquals(discs[i+5], res.get(i));
    }
   
    future = query.nextPage().fetch();
    res = future.get();
    assertEquals(0, res.size());

    future = query.nextPage().fetch();
    res = future.get();
    assertEquals(0, res.size());

    future = query.previousPage().fetch();
    res = future.get();
    assertEquals(5, res.size());
    for(int i=0; i<5; i++){
      assertEquals(discs[i+5], res.get(i));
    }
   
    future = query.nextPage().fetch();
    res = future.get();
    assertEquals(0, res.size());
  }
 
  public void testFetchPaginateStatefulNextPageRealAsync() {
    Discovery[] discs = new Discovery[10];
    for(int i=0; i<10; i++){
      discs[i] = new Discovery("Disc_"+i, LongAutoID_CURIE);
    }
    pm.insert((Object[])discs).get();

    QueryAsync<Discovery> query = pm.createQuery(Discovery.class).paginate(5).stateful().order("name");
    SienaFuture<List<Discovery>> future1 = query.fetch();
    SienaFuture<List<Discovery>> future2 = query.nextPage().fetch();
   
    List<Discovery> res = future1.get();
    assertEquals(5, res.size());
    for(int i=0; i<5; i++){
      assertEquals(discs[i], res.get(i));
    }
    res = future2.get();
    assertEquals(5, res.size());
    for(int i=0; i<5; i++){
      assertEquals(discs[i+5], res.get(i));
    }
  }
 
  public void testFetchPaginateStatefulPreviousPageFromScratch() {
    Discovery[] discs = new Discovery[10];
    for(int i=0; i<10; i++){
      discs[i] = new Discovery("Disc_"+i, LongAutoID_CURIE);
    }
    pm.insert((Object[])discs).get();

    QueryAsync<Discovery> query = pm.createQuery(Discovery.class).paginate(5).stateful().order("name");
    SienaFuture<List<Discovery>> future = query.previousPage().fetch();
    List<Discovery> res = future.get();
    assertEquals(0, res.size());

    future = query.previousPage().fetch();
    res = future.get();
    assertEquals(0, res.size());
   
    future = query.nextPage().fetch();
    res = future.get();
    assertEquals(5, res.size());
    for(int i=0; i<5; i++){
      assertEquals(discs[i], res.get(i));
    }
   
    future = query.previousPage().fetch();
    res = future.get();
    assertEquals(0, res.size());
   
    future = query.previousPage().fetch();
    res = future.get();
    assertEquals(0, res.size());
   
    future = query.nextPage().fetch();
    res = future.get();
    assertEquals(5, res.size());
    for(int i=0; i<5; i++){
      assertEquals(discs[i], res.get(i));
    }
  }
 
  public void testFetchPaginateStatefulPreviousPage() {
    Discovery[] discs = new Discovery[10];
    for(int i=0; i<10; i++){
      discs[i] = new Discovery("Disc_"+i, LongAutoID_CURIE);
    }
    pm.insert((Object[])discs).get();

    QueryAsync<Discovery> query = pm.createQuery(Discovery.class).paginate(5).stateful().order("name");
    SienaFuture<List<Discovery>> future = query.fetch();
    List<Discovery> res = future.get();
    assertEquals(5, res.size());
    for(int i=0; i<5; i++){
      assertEquals(discs[i], res.get(i));
    }

    future = query.nextPage().fetch();
    res = future.get();
    assertEquals(5, res.size());
    for(int i=0; i<5; i++){
      assertEquals(discs[i+5], res.get(i));
    }
   
    future = query.previousPage().fetch();
    res = future.get();
    assertEquals(5, res.size());
    for(int i=0; i<5; i++){
      assertEquals(discs[i], res.get(i));
    }
  }
 
  public void testFetchPaginateStatefulPreviouPageSeveralTimes() {
    Discovery[] discs = new Discovery[15];
    for(int i=0; i<15; i++){
      discs[i] = new Discovery("Disc_"+i, LongAutoID_CURIE);
    }
    pm.insert((Object[])discs).get();

    QueryAsync<Discovery> query = pm.createQuery(Discovery.class).paginate(5).stateful().order("id");
    SienaFuture<List<Discovery>> future = query.fetch();
    List<Discovery> res = future.get();
    assertEquals(5, res.size());
    for(int i=0; i<5; i++){
      assertEquals(discs[i], res.get(i));
    }   
   
    future = query.nextPage().fetch();
    res = future.get();
    assertEquals(5, res.size());
    for(int i=0; i<5; i++){
      assertEquals(discs[i+5], res.get(i));
    }
   
    future = query.nextPage().fetch();
    res = future.get();
    assertEquals(5, res.size());
    for(int i=0; i<5; i++){
      assertEquals(discs[i+10], res.get(i));
    }
   
    future = query.previousPage().fetch();
    res = future.get();
    assertEquals(5, res.size());
    for(int i=0; i<5; i++){
      assertEquals(discs[i+5], res.get(i));
    }
   
    future = query.previousPage().fetch();
    res = future.get();
    assertEquals(5, res.size());
    for(int i=0; i<5; i++){
      assertEquals(discs[i], res.get(i));
    }
  }
 
  public void testFetchKeysPaginateStatelessNextPage() {
    Discovery[] discs = new Discovery[10];
    for(int i=0; i<10; i++){
      discs[i] = new Discovery("Disc_"+i, LongAutoID_CURIE);
    }
    pm.insert((Object[])discs).get();

    QueryAsync<Discovery> query = pm.createQuery(Discovery.class).paginate(5).order("name");
    SienaFuture<List<Discovery>> future = query.fetchKeys();
    List<Discovery> res = future.get();
    assertEquals(5, res.size());
    for(int i=0; i<5; i++){
      assertEquals(discs[i].id, res.get(i).id);
      assertTrue(res.get(i).isOnlyIdFilled());
    }
    future = query.nextPage().fetchKeys();
    res = future.get();
    assertEquals(5, res.size());
    for(int i=0; i<5; i++){
      assertEquals(discs[i+5].id, res.get(i).id);
      assertTrue(res.get(i).isOnlyIdFilled());
    }
  }
 
  public void testFetchKeysPaginateStatelessNextPageRealAsync() {
    Discovery[] discs = new Discovery[10];
    for(int i=0; i<10; i++){
      discs[i] = new Discovery("Disc_"+i, LongAutoID_CURIE);
    }
    pm.insert((Object[])discs).get();

    QueryAsync<Discovery> query = pm.createQuery(Discovery.class).paginate(5).order("name");
    SienaFuture<List<Discovery>> future1 = query.fetchKeys();
    SienaFuture<List<Discovery>> future2 = query.nextPage().fetchKeys();
   
    List<Discovery> res = future1.get();
    assertEquals(5, res.size());
    for(int i=0; i<5; i++){
      assertEquals(discs[i].id, res.get(i).id);
      assertTrue(res.get(i).isOnlyIdFilled());
    }
    res = future2.get();
    assertEquals(5, res.size());
    for(int i=0; i<5; i++){
      assertEquals(discs[i+5].id, res.get(i).id);
      assertTrue(res.get(i).isOnlyIdFilled());
    }
  }
 
  public void testFetchKeysPaginateStatelessPreviousPageFromScratch() {
    Discovery[] discs = new Discovery[10];
    for(int i=0; i<10; i++){
      discs[i] = new Discovery("Disc_"+i, LongAutoID_CURIE);
    }
    pm.insert((Object[])discs).get();

    QueryAsync<Discovery> query = pm.createQuery(Discovery.class).paginate(5).order("name");
    SienaFuture<List<Discovery>> future = query.previousPage().fetchKeys();
    List<Discovery> res = future.get();
    assertEquals(0, res.size());

    future = query.previousPage().fetchKeys();
    res = future.get();
    assertEquals(0, res.size());
  }
 
  public void testFetchKeysPaginateStatelessPreviousPage() {
    Discovery[] discs = new Discovery[10];
    for(int i=0; i<10; i++){
      discs[i] = new Discovery("Disc_"+i, LongAutoID_CURIE);
    }
    pm.insert((Object[])discs).get();

    QueryAsync<Discovery> query = pm.createQuery(Discovery.class).paginate(5).order("name");
    SienaFuture<List<Discovery>> future = query.nextPage().fetchKeys();
    List<Discovery> res = future.get();
    assertEquals(5, res.size());
    for(int i=0; i<5; i++){
      assertEquals(discs[i+5].id, res.get(i).id);
      assertTrue(res.get(i).isOnlyIdFilled());
    }
   
    future = query.previousPage().fetchKeys();
    res = future.get();
    assertEquals(5, res.size());
    for(int i=0; i<5; i++){
      assertEquals(discs[i].id, res.get(i).id);
      assertTrue(res.get(i).isOnlyIdFilled());
    }
  }
 
  public void testFetchKeysPaginateStatelessPreviouPageSeveralTimes() {
    Discovery[] discs = new Discovery[15];
    for(int i=0; i<15; i++){
      discs[i] = new Discovery("Disc_"+i, LongAutoID_CURIE);
    }
    pm.insert((Object[])discs).get();

    QueryAsync<Discovery> query = pm.createQuery(Discovery.class).paginate(5).order("id");
    SienaFuture<List<Discovery>> future = query.fetchKeys();
    List<Discovery> res = future.get();
    assertEquals(5, res.size());
    for(int i=0; i<5; i++){
      assertEquals(discs[i].id, res.get(i).id);
      assertTrue(res.get(i).isOnlyIdFilled());
    }   
   
    future = query.nextPage().fetchKeys();
    res = future.get();
    assertEquals(5, res.size());
    for(int i=0; i<5; i++){
      assertEquals(discs[i+5].id, res.get(i).id);
      assertTrue(res.get(i).isOnlyIdFilled());
    }
   
    future = query.nextPage().fetchKeys();
    res = future.get();
    assertEquals(5, res.size());
    for(int i=0; i<5; i++){
      assertEquals(discs[i+10].id, res.get(i).id);
      assertTrue(res.get(i).isOnlyIdFilled());
    }
   
    future = query.previousPage().fetchKeys();
    res = future.get();
    assertEquals(5, res.size());
    for(int i=0; i<5; i++){
      assertEquals(discs[i+5].id, res.get(i).id);
      assertTrue(res.get(i).isOnlyIdFilled());
    }
   
    future = query.previousPage().fetchKeys();
    res = future.get();
    assertEquals(5, res.size());
    for(int i=0; i<5; i++){
      assertEquals(discs[i].id, res.get(i).id);
      assertTrue(res.get(i).isOnlyIdFilled());
    }
  }
 
  public void testFetchKeysPaginateStatefulNextPage() {
    Discovery[] discs = new Discovery[10];
    for(int i=0; i<10; i++){
      discs[i] = new Discovery("Disc_"+i, LongAutoID_CURIE);
    }
    pm.insert((Object[])discs).get();

    QueryAsync<Discovery> query = pm.createQuery(Discovery.class).paginate(5).stateful().order("id");
    SienaFuture<List<Discovery>> future = query.fetchKeys();
    List<Discovery> res = future.get();
    assertEquals(5, res.size());
    for(int i=0; i<5; i++){
      assertEquals(discs[i].id, res.get(i).id);
      assertTrue(res.get(i).isOnlyIdFilled());
    }
    future = query.nextPage().fetchKeys();
    res = future.get();
    assertEquals(5, res.size());
    for(int i=0; i<5; i++){
      assertEquals(discs[i+5].id, res.get(i).id);
      assertTrue(res.get(i).isOnlyIdFilled());
    }
  }
 
  public void testFetchKeysPaginateStatefulNextPageRealAsync() {
    Discovery[] discs = new Discovery[10];
    for(int i=0; i<10; i++){
      discs[i] = new Discovery("Disc_"+i, LongAutoID_CURIE);
    }
    pm.insert((Object[])discs).get();

    QueryAsync<Discovery> query = pm.createQuery(Discovery.class).paginate(5).stateful().order("name");
    SienaFuture<List<Discovery>> future1 = query.fetchKeys();
    SienaFuture<List<Discovery>> future2 = query.nextPage().fetchKeys();
   
    List<Discovery> res = future1.get();
    assertEquals(5, res.size());
    for(int i=0; i<5; i++){
      assertEquals(discs[i].id, res.get(i).id);
      assertTrue(res.get(i).isOnlyIdFilled());
    }
    res = future2.get();
    assertEquals(5, res.size());
    for(int i=0; i<5; i++){
      assertEquals(discs[i+5].id, res.get(i).id);
      assertTrue(res.get(i).isOnlyIdFilled());
    }
  }
 
  public void testFetchKeysPaginateStatefulPreviousPageFromScratch() {
    Discovery[] discs = new Discovery[10];
    for(int i=0; i<10; i++){
      discs[i] = new Discovery("Disc_"+i, LongAutoID_CURIE);
    }
    pm.insert((Object[])discs).get();

    QueryAsync<Discovery> query = pm.createQuery(Discovery.class).paginate(5).stateful().order("name");
    SienaFuture<List<Discovery>> future = query.previousPage().fetchKeys();
    List<Discovery> res = future.get();
    assertEquals(0, res.size());

    future = query.previousPage().fetchKeys();
    res = future.get();
    assertEquals(0, res.size());
  }
 
  public void testFetchKeysPaginateStatefulPreviousPage() {
    Discovery[] discs = new Discovery[10];
    for(int i=0; i<10; i++){
      discs[i] = new Discovery("Disc_"+i, LongAutoID_CURIE);
    }
    pm.insert((Object[])discs).get();

    QueryAsync<Discovery> query = pm.createQuery(Discovery.class).paginate(5).stateful().order("name");
    SienaFuture<List<Discovery>> future = query.fetchKeys();
    List<Discovery> res = future.get();
    assertEquals(5, res.size());
    for(int i=0; i<5; i++){
      assertEquals(discs[i].id, res.get(i).id);
      assertTrue(res.get(i).isOnlyIdFilled());
    }

    future = query.nextPage().fetchKeys();
    res = future.get();
    assertEquals(5, res.size());
    for(int i=0; i<5; i++){
      assertEquals(discs[i+5].id, res.get(i).id);
      assertTrue(res.get(i).isOnlyIdFilled());
    }
   
    future = query.previousPage().fetchKeys();
    res = future.get();
    assertEquals(5, res.size());
    for(int i=0; i<5; i++){
      assertEquals(discs[i].id, res.get(i).id);
      assertTrue(res.get(i).isOnlyIdFilled());
    }
  }
 
  public void testFetchKeysPaginateStatefulPreviouPageSeveralTimes() {
    Discovery[] discs = new Discovery[15];
    for(int i=0; i<15; i++){
      discs[i] = new Discovery("Disc_"+i, LongAutoID_CURIE);
    }
    pm.insert((Object[])discs).get();

    QueryAsync<Discovery> query = pm.createQuery(Discovery.class).paginate(5).stateful().order("id");
    SienaFuture<List<Discovery>> future = query.fetchKeys();
    List<Discovery> res = future.get();
    assertEquals(5, res.size());
    for(int i=0; i<5; i++){
      assertEquals(discs[i].id, res.get(i).id);
    }   
   
    future = query.nextPage().fetchKeys();
    res = future.get();
    assertEquals(5, res.size());
    for(int i=0; i<5; i++){
      assertEquals(discs[i+5].id, res.get(i).id);
    }
   
    future = query.nextPage().fetchKeys();
    res = future.get();
    assertEquals(5, res.size());
    for(int i=0; i<5; i++){
      assertEquals(discs[i+10].id, res.get(i).id);
    }
   
    future = query.previousPage().fetchKeys();
    res = future.get();
    assertEquals(5, res.size());
    for(int i=0; i<5; i++){
      assertEquals(discs[i+5].id, res.get(i).id);
    }
   
    future = query.previousPage().fetchKeys();
    res = future.get();
    assertEquals(5, res.size());
    for(int i=0; i<5; i++){
      assertEquals(discs[i].id, res.get(i).id);
    }
  }
 
  public void testIterPaginateStatelessNextPage() {
    Discovery[] discs = new Discovery[10];
    for(int i=0; i<10; i++){
      discs[i] = new Discovery("Disc_"+i, LongAutoID_CURIE);
    }
    pm.insert((Object[])discs).get();

    QueryAsync<Discovery> query = pm.createQuery(Discovery.class).paginate(5).order("name");
    try {
      SienaFuture<Iterable<Discovery>> res = query.iter();
      Iterator<Discovery> it = res.get().iterator();
      int i=0;
      while(it.hasNext()){
        assertEquals(discs[i++], it.next());
      }
      assertEquals(5, i);

      res = query.nextPage().iter();
      it = res.get().iterator();
      while(it.hasNext()){
        assertEquals(discs[i++], it.next());
      }
      assertEquals(10, i);
    }finally {
      query.release();
    }
  }
 
  public void testIterPaginateStatelessNextPageRealAsync() {
    Discovery[] discs = new Discovery[10];
    for(int i=0; i<10; i++){
      discs[i] = new Discovery("Disc_"+i, LongAutoID_CURIE);
    }
    pm.insert((Object[])discs).get();

    QueryAsync<Discovery> query = pm.createQuery(Discovery.class).paginate(5).order("name");
    SienaFuture<Iterable<Discovery>> future1 = query.iter();
    SienaFuture<Iterable<Discovery>> future2 = query.nextPage().iter();
   
    Iterator<Discovery> it = future1.get().iterator();
    int i=0;
    while(it.hasNext()){
      assertEquals(discs[i++], it.next());
    }
    assertEquals(5, i);

    it = future2.get().iterator();
    while(it.hasNext()){
      assertEquals(discs[i++], it.next());
    }
    assertEquals(10, i);

  }
 
  public void testIterPaginateStatelessPreviousPageFromScratch() {
    Discovery[] discs = new Discovery[10];
    for(int i=0; i<10; i++){
      discs[i] = new Discovery("Disc_"+i, LongAutoID_CURIE);
    }
    pm.insert((Object[])discs).get();

    QueryAsync<Discovery> query = pm.createQuery(Discovery.class).paginate(5).order("name");
    SienaFuture<Iterable<Discovery>> future = query.previousPage().iter();
    Iterator<Discovery> it = future.get().iterator();
    int i=0;
    while(it.hasNext()){
      assertEquals(discs[i++], it.next());
    }
    assertEquals(0, i);

    future = query.previousPage().iter();
    i=0;
    it = future.get().iterator();
    while(it.hasNext()){
      assertEquals(discs[i++], it.next());
    }
    assertEquals(0, i);

  }
 
  public void testIterPaginateStatelessPreviousPage() {
    Discovery[] discs = new Discovery[10];
    for(int i=0; i<10; i++){
      discs[i] = new Discovery("Disc_"+i, LongAutoID_CURIE);
    }
    pm.insert((Object[])discs).get();

    QueryAsync<Discovery> query = pm.createQuery(Discovery.class).paginate(5).order("name");
    SienaFuture<Iterable<Discovery>> future = query.nextPage().iter();
    Iterator<Discovery> it = future.get().iterator();
    int i=5;
    while(it.hasNext()){
      assertEquals(discs[i++], it.next());
    }
    assertEquals(10, i);

    future = query.previousPage().iter();
    it = future.get().iterator();
    i=0;
    while(it.hasNext()){
      assertEquals(discs[i++], it.next());
    }
    assertEquals(5, i);

  }
 
  public void testIterPaginateStatelessPreviouPageSeveralTimes() {
    Discovery[] discs = new Discovery[15];
    for(int i=0; i<15; i++){
      discs[i] = new Discovery("Disc_"+i, LongAutoID_CURIE);
    }
    pm.insert((Object[])discs).get();

    QueryAsync<Discovery> query = pm.createQuery(Discovery.class).paginate(5).order("id");
    SienaFuture<Iterable<Discovery>> future = query.iter();
    Iterator<Discovery> it = future.get().iterator();
    int i=0;
    while(it.hasNext()){
      assertEquals(discs[i++], it.next());
   
    assertEquals(5, i);
   
    future = query.nextPage().iter();
    it = future.get().iterator();
    while(it.hasNext()){
      assertEquals(discs[i++], it.next());
   
    assertEquals(10, i);
   
    future = query.nextPage().iter();
    it = future.get().iterator();
    while(it.hasNext()){
      assertEquals(discs[i++], it.next());
    }
    assertEquals(15, i);
 
    future = query.previousPage().iter();
    it = future.get().iterator();
    i=5;
    while(it.hasNext()){
      assertEquals(discs[i++], it.next());
    }
    assertEquals(10, i);

    future = query.previousPage().iter();
    it = future.get().iterator();
    i=0;
    while(it.hasNext()){
      assertEquals(discs[i++], it.next());
    }
    assertEquals(5, i);

  }
 
  public void testIterPaginateStatefulNextPage() {
    Discovery[] discs = new Discovery[10];
    for(int i=0; i<10; i++){
      discs[i] = new Discovery("Disc_"+i, LongAutoID_CURIE);
    }
    pm.insert((Object[])discs).get();

    QueryAsync<Discovery> query = pm.createQuery(Discovery.class).paginate(5).stateful().order("id");
    SienaFuture<Iterable<Discovery>> future = query.iter();
    Iterator<Discovery> it = future.get().iterator();
    int i=0;
    while(it.hasNext()){
      assertEquals(discs[i++], it.next());
   
    future = query.nextPage().iter();
    it = future.get().iterator();
    while(it.hasNext()){
      assertEquals(discs[i++], it.next());
   
   
    assertEquals(10, i);
  }
 
  public void testIterPaginateStatefulNextPageRealAsync() {
    Discovery[] discs = new Discovery[10];
    for(int i=0; i<10; i++){
      discs[i] = new Discovery("Disc_"+i, LongAutoID_CURIE);
    }
    pm.insert((Object[])discs).get();

    QueryAsync<Discovery> query = pm.createQuery(Discovery.class).paginate(5).stateful().order("name");
    SienaFuture<Iterable<Discovery>> future1 = query.iter();
    SienaFuture<Iterable<Discovery>> future2 = query.nextPage().iter();
   
    Iterator<Discovery> it = future1.get().iterator();
    int i=0;
    while(it.hasNext()){
      Discovery disc = it.next();
      assertEquals(discs[i++], disc);
   
    assertEquals(5, i);
    it = future2.get().iterator();
    while(it.hasNext()){
      Discovery disc = it.next();
      assertEquals(discs[i++], disc);
    }
    assertEquals(10, i);
  }
 
  public void testIterPaginateStatefulPreviousPageFromScratch() {
    Discovery[] discs = new Discovery[10];
    for(int i=0; i<10; i++){
      discs[i] = new Discovery("Disc_"+i, LongAutoID_CURIE);
    }
    pm.insert((Object[])discs).get();

    QueryAsync<Discovery> query = pm.createQuery(Discovery.class).paginate(5).stateful().order("name");
    SienaFuture<Iterable<Discovery>> future = query.previousPage().iter();
    Iterator<Discovery> it = future.get().iterator();
    int i=0;
    while(it.hasNext()){
      Discovery disc = it.next();
      assertEquals(discs[i++], disc);
   
    assertEquals(0, i);

    it = future.get().iterator();
    i=0;
    while(it.hasNext()){
      Discovery disc = it.next();
      assertEquals(discs[i++], disc);
   
    assertEquals(0, i);
  }
 
  public void testIterPaginateStatefulPreviousPage() {
    Discovery[] discs = new Discovery[10];
    for(int i=0; i<10; i++){
      discs[i] = new Discovery("Disc_"+i, LongAutoID_CURIE);
    }
    pm.insert((Object[])discs).get();

    QueryAsync<Discovery> query = pm.createQuery(Discovery.class).paginate(5).stateful().order("name");
    SienaFuture<Iterable<Discovery>> future = query.iter();
    Iterator<Discovery> it = future.get().iterator();
    int i=0;
    while(it.hasNext()){
      Discovery disc = it.next();
      assertEquals(discs[i++], disc);
   
    assertEquals(5, i);

    future = query.nextPage().iter();
    it = future.get().iterator();
    while(it.hasNext()){
      Discovery disc = it.next();
      assertEquals(discs[i++], disc);
   
    assertEquals(10, i);
   
    future = query.previousPage().iter();
    it = future.get().iterator();
    i=0;
    while(it.hasNext()){
      Discovery disc = it.next();
      assertEquals(discs[i++], disc);
   
    assertEquals(5, i);
  }
 
  public void testIterPaginateStatefulPreviousPageAsync() {
    Discovery[] discs = new Discovery[10];
    for(int i=0; i<10; i++){
      discs[i] = new Discovery("Disc_"+i, LongAutoID_CURIE);
    }
    pm.insert((Object[])discs).get();

    QueryAsync<Discovery> query = pm.createQuery(Discovery.class).paginate(5).stateful().order("name");
    SienaFuture<Iterable<Discovery>> future1 = query.iter();
    SienaFuture<Iterable<Discovery>> future2 = query.nextPage().iter();
    SienaFuture<Iterable<Discovery>> future3 = query.previousPage().iter();
    Iterator<Discovery> it = future1.get().iterator();
    int i=0;
    while(it.hasNext()){
      Discovery disc = it.next();
      assertEquals(discs[i++], disc);
   
    assertEquals(5, i);

    it = future2.get().iterator();
    while(it.hasNext()){
      Discovery disc = it.next();
      assertEquals(discs[i++], disc);
   
    assertEquals(10, i);
   
    it = future3.get().iterator();
    i=0;
    while(it.hasNext()){
      Discovery disc = it.next();
      assertEquals(discs[i++], disc);
   
    assertEquals(5, i);
  }
 
  public void testIterPaginateStatefulPreviouPageSeveralTimes() {
    Discovery[] discs = new Discovery[15];
    for(int i=0; i<15; i++){
      discs[i] = new Discovery("Disc_"+i, LongAutoID_CURIE);
    }
    pm.insert((Object[])discs).get();

    QueryAsync<Discovery> query = pm.createQuery(Discovery.class).paginate(5).stateful().order("id");
    SienaFuture<Iterable<Discovery>> future = query.iter();
    Iterator<Discovery> it = future.get().iterator();
    int i=0;
    while(it.hasNext()){
      Discovery disc = it.next();
      assertEquals(discs[i++], disc);
   
    assertEquals(5, i)
   
    future = query.nextPage().iter();
    it = future.get().iterator();
    while(it.hasNext()){
      Discovery disc = it.next();
      assertEquals(discs[i++], disc);
   
    assertEquals(10, i)
   
    future = query.nextPage().iter();
    it = future.get().iterator();
    while(it.hasNext()){
      Discovery disc = it.next();
      assertEquals(discs[i++], disc);
   
    assertEquals(15, i)
   
    future = query.previousPage().iter();
    i=5;
    it = future.get().iterator();
    while(it.hasNext()){
      Discovery disc = it.next();
      assertEquals(discs[i++], disc);
   
    assertEquals(10, i)
   
    future = query.previousPage().iter();
    i=0;
    it = future.get().iterator();
    while(it.hasNext()){
      Discovery disc = it.next();
      assertEquals(discs[i++], disc);
   
    assertEquals(5, i);
  }
 
  public void testIterPaginateStatefulSeveralTimesRealAsync() {
    Discovery[] discs = new Discovery[15];
    for(int i=0; i<15; i++){
      discs[i] = new Discovery("Disc_"+i, LongAutoID_CURIE);
    }
    pm.insert((Object[])discs).get();

    QueryAsync<Discovery> query = pm.createQuery(Discovery.class).paginate(5).stateful().order("id");
    SienaFuture<Iterable<Discovery>> future = query.iter();
    SienaFuture<Iterable<Discovery>> future2 = query.nextPage().iter();
    SienaFuture<Iterable<Discovery>> future3 = query.nextPage().iter();
    SienaFuture<Iterable<Discovery>> future4 = query.previousPage().iter();
    SienaFuture<Iterable<Discovery>> future5 = query.previousPage().iter();
    Iterator<Discovery> it = future.get().iterator();
    int i=0;
    while(it.hasNext()){
      Discovery disc = it.next();
      assertEquals(discs[i++], disc);
   
    assertEquals(5, i)
   
    it = future2.get().iterator();
    while(it.hasNext()){
      Discovery disc = it.next();
      assertEquals(discs[i++], disc);
   
    assertEquals(10, i)
   
    it = future3.get().iterator();
    while(it.hasNext()){
      Discovery disc = it.next();
      assertEquals(discs[i++], disc);
   
    assertEquals(15, i)
   
    i=5;
    it = future4.get().iterator();
    while(it.hasNext()){
      Discovery disc = it.next();
      assertEquals(discs[i++], disc);
   
    assertEquals(10, i)
   
    i=0;
    it = future5.get().iterator();
    while(it.hasNext()){
      Discovery disc = it.next();
      assertEquals(discs[i++], disc);
   
    assertEquals(5, i);
  }
 
  public void testIterLotsOfEntitiesStateless(){
    Discovery[] discs = new Discovery[150];
    for(int i=0; i<150; i++){
      discs[i] = new Discovery("Disc_"+i, LongAutoID_CURIE);
    }
    pm.insert((Object[])discs).get();
   
    QueryAsync<Discovery> query = pm.createQuery(Discovery.class).order("id");
    SienaFuture<Iterable<Discovery>> future = query.iter();
    Iterator<Discovery> it = future.get().iterator();
    int i=0;
    while(it.hasNext()){
      Discovery disc = it.next();
      assertEquals(discs[i++], disc);
   
    assertEquals(150, i)
  }
 
  public void testIterLotsOfEntitiesStateful(){
    Discovery[] discs = new Discovery[150];
    for(int i=0; i<150; i++){
      discs[i] = new Discovery("Disc_"+i, LongAutoID_CURIE);
    }
    pm.insert((Object[])discs).get();
   
    QueryAsync<Discovery> query = pm.createQuery(Discovery.class).stateful().order("id");
    SienaFuture<Iterable<Discovery>> future = query.iter();
    Iterator<Discovery> it = future.get().iterator();
    int i=0;
    while(it.hasNext()){
      Discovery disc = it.next();
      assertEquals(discs[i++], disc);
   
    assertEquals(150, i)
  }
 
  public void testIterLotsOfEntitiesStatefulMixed(){
    Discovery[] discs = new Discovery[150];
    for(int i=0; i<150; i++){
      discs[i] = new Discovery("Disc_"+i, LongAutoID_CURIE);
    }
    pm.insert((Object[])discs).get();
   
    QueryAsync<Discovery> query = pm.createQuery(Discovery.class).stateful().order("id");
    SienaFuture<Iterable<Discovery>> future = query.iter(50);
    Iterator<Discovery> it = future.get().iterator();
    int i=0;
    while(it.hasNext()){
      Discovery disc = it.next();
      assertEquals(discs[i++], disc);
   
    assertEquals(50, i)

    future = query.iter(50,50);
    it = future.get().iterator();
    i=100;
    while(it.hasNext()){
      Discovery disc = it.next();
      assertEquals(discs[i++], disc);
   
    assertEquals(150, i)

    future = query.iter(50,100);
    it = future.get().iterator();
    while(it.hasNext()){
      Discovery disc = it.next();
      assertEquals(discs[i++], disc);
   
    assertEquals(150, i)
  }
 
  public void testIterLotsOfEntitiesStatefulMixed2(){
    Discovery[] discs = new Discovery[150];
    for(int i=0; i<150; i++){
      discs[i] = new Discovery("Disc_"+i, LongAutoID_CURIE);
    }
    pm.insert((Object[])discs).get();
   
    QueryAsync<Discovery> query = pm.createQuery(Discovery.class).stateful().order("id");
    SienaFuture<Iterable<Discovery>> future = query.paginate(50).iter();
    Iterator<Discovery> it = future.get().iterator();
    int i=0;
    while(it.hasNext()){
      Discovery disc = it.next();
      assertEquals(discs[i++], disc);
   
    assertEquals(50, i)

    future = query.iter(50,50);
    it = future.get().iterator();
    while(it.hasNext()){
      Discovery disc = it.next();
      assertEquals(discs[i++], disc);
   
    assertEquals(100, i)

  }

  public void testIterLotsOfEntitiesStatefulMixed3(){
    Discovery[] discs = new Discovery[150];
    for(int i=0; i<150; i++){
      discs[i] = new Discovery("Disc_"+i, LongAutoID_CURIE);
    }
    pm.insert((Object[])discs).get();
   
    QueryAsync<Discovery> query = pm.createQuery(Discovery.class).stateful().order("id");
    SienaFuture<Iterable<Discovery>> future = query.iter(50);
    Iterator<Discovery> it = future.get().iterator();
    int i=0;
    while(it.hasNext()){
      Discovery disc = it.next();
      assertEquals(discs[i++], disc);
   
    assertEquals(50, i)
       
    future = query.paginate(50).iter();
    it = future.get().iterator();
    i=50;
    while(it.hasNext()){
      Discovery disc = it.next();
      assertEquals(discs[i++], disc);
   
    assertEquals(100, i)
 
    future = query.iter();
    it = future.get().iterator();
    i=50;
    while(it.hasNext()){
      Discovery disc = it.next();
      assertEquals(discs[i++], disc);
   
    assertEquals(100, i)

    future = query.nextPage().iter();
    it = future.get().iterator();
    while(it.hasNext()){
      Discovery disc = it.next();
      assertEquals(discs[i++], disc);
   
    assertEquals(150, i)
  }
 
  public void testFetchLotsOfEntitiesStatefulMixed(){
    Discovery[] discs = new Discovery[150];
    for(int i=0; i<150; i++){
      discs[i] = new Discovery("Disc_"+i, LongAutoID_CURIE);
    }
    pm.insert((Object[])discs).get();
   
    QueryAsync<Discovery> query = pm.createQuery(Discovery.class).stateful().order("id");
    SienaFuture<List<Discovery>> future = query.paginate(50).fetch();
    List<Discovery> res = future.get();
    assertEquals(50, res.size());
    for(int i=0; i<50; i++){
      assertEquals(discs[i], res.get(i));
    }
   
    future = query.fetch(50);
    res = future.get();
    assertEquals(50, res.size());
    for(int i=0; i<50; i++){
      assertEquals(discs[i], res.get(i));
    }
   
    future = query.nextPage().fetch();
    res = future.get();
    assertEquals(50, res.size());
    for(int i=0; i<50; i++){
      assertEquals(discs[i+50], res.get(i));
    }

    future = query.fetch(50);
    res = future.get();
    assertEquals(50, res.size());
    for(int i=0; i<50; i++){
      assertEquals(discs[i+50], res.get(i));
    }
  }
 
  public void testFetchLotsOfEntitiesStatefulMixed2(){
    Discovery[] discs = new Discovery[150];
    for(int i=0; i<150; i++){
      discs[i] = new Discovery("Disc_"+i, LongAutoID_CURIE);
    }
    pm.insert((Object[])discs).get();
   
    QueryAsync<Discovery> query = pm.createQuery(Discovery.class).stateful().order("id");
    SienaFuture<List<Discovery>> future = query.fetch(50);
    List<Discovery> res = future.get();
    assertEquals(50, res.size());
    for(int i=0; i<50; i++){
      assertEquals(discs[i], res.get(i));
    }
   
    future = query.paginate(50).fetch(50);
    res = future.get();
    assertEquals(50, res.size());
    for(int i=0; i<50; i++){
      assertEquals(discs[i+50], res.get(i));
    }
   
    future = query.nextPage().fetch();
    res = future.get();
    assertEquals(50, res.size());
    for(int i=0; i<50; i++){
      assertEquals(discs[i+100], res.get(i));
    }

    future = query.fetch(50);
    res = future.get();
    assertEquals(50, res.size());
    for(int i=0; i<50; i++){
      assertEquals(discs[i+100], res.get(i));
    }
  }
 
  public void testFetchIterLotsOfEntitiesStatefulMixed(){
    Discovery[] discs = new Discovery[150];
    for(int i=0; i<150; i++){
      discs[i] = new Discovery("Disc_"+i, LongAutoID_CURIE);
    }
    pm.insert((Object[])discs).get();
   
    QueryAsync<Discovery> query = pm.createQuery(Discovery.class).stateful().order("id");
    SienaFuture<List<Discovery>> future = query.fetch(50);
    List<Discovery> res = future.get();
    assertEquals(50, res.size());
    for(int i=0; i<50; i++){
      assertEquals(discs[i], res.get(i));
    }
   
    SienaFuture<Iterable<Discovery>> future2 = query.iter(50);
    Iterator<Discovery> it = future2.get().iterator();
    int i=50;
    while(it.hasNext()){
      Discovery disc = it.next();
      assertEquals(discs[i++], disc);
   
    assertEquals(100, i)

    future = query.paginate(25).fetch();
    res = future.get();
    assertEquals(25, res.size());
    for(i=0; i<25; i++){
      assertEquals(discs[i+100], res.get(i));
    }
   
    future2 = query.nextPage().iter();
    it = future2.get().iterator();
    i=125;
    while(it.hasNext()){
      Discovery disc = it.next();
      assertEquals(discs[i++], disc);
   
    assertEquals(150, i)
   
    future = query.previousPage().fetch();
    res = future.get();
    assertEquals(25, res.size());
    for(i=0; i<25; i++){
      assertEquals(discs[i+100], res.get(i));
    }
   
    future = query.previousPage().fetch();
    res = future.get();
    assertEquals(25, res.size());
    for(i=0; i<25; i++){
      assertEquals(discs[i+75], res.get(i));
    }
   
    future = query.previousPage().fetch();
    res = future.get();
    assertEquals(25, res.size());
    for(i=0; i<25; i++){
      assertEquals(discs[i+50], res.get(i));
    }
   
    future = query.nextPage().fetch();
    res = future.get();
    assertEquals(25, res.size());
    for(i=0; i<25; i++){
      assertEquals(discs[i+75], res.get(i));
    }
   
    future = query.nextPage().fetch();
    res = future.get();
    assertEquals(25, res.size());
    for(i=0; i<25; i++){
      assertEquals(discs[i+100], res.get(i));
    }
   
    future = query.nextPage().fetch();
    res = future.get();
    assertEquals(25, res.size());
    for(i=0; i<25; i++){
      assertEquals(discs[i+125], res.get(i));
    }
   
    future = query.nextPage().fetch();
    res = future.get();
    assertEquals(0, res.size());
   
    future = query.previousPage().fetch();
    res = future.get();
    assertEquals(25, res.size());
    for(i=0; i<25; i++){
      assertEquals(discs[i+125], res.get(i));
    }
   
    future = query.previousPage().fetch();
    res = future.get();
    assertEquals(25, res.size());
    for(i=0; i<25; i++){
      assertEquals(discs[i+100], res.get(i));
    }
   
    future = query.previousPage().fetch();
    res = future.get();
    assertEquals(25, res.size());
    for(i=0; i<25; i++){
      assertEquals(discs[i+75], res.get(i));
    }
   
    future = query.previousPage().fetch();
    res = future.get();
    assertEquals(25, res.size());
    for(i=0; i<25; i++){
      assertEquals(discs[i+50], res.get(i));
    }
   
    future = query.previousPage().fetch();
    res = future.get();
    assertEquals(25, res.size());
    for(i=0; i<25; i++){
      assertEquals(discs[i+25], res.get(i));
    }
   
    future = query.previousPage().fetch();
    res = future.get();
    assertEquals(25, res.size());
    for(i=0; i<25; i++){
      assertEquals(discs[i], res.get(i));
    }
  }
 
  public void testFetchIterLotsOfEntitiesStatefulMixed2(){
    Discovery[] discs = new Discovery[200];
    for(int i=0; i<200; i++){
      discs[i] = new Discovery("Disc_"+i, LongAutoID_CURIE);
    }
    pm.insert((Object[])discs).get();
   
    QueryAsync<Discovery> query = pm.createQuery(Discovery.class).stateful().order("id");
    SienaFuture<List<Discovery>> future = query.fetch(50);
    List<Discovery> res = future.get();
    assertEquals(50, res.size());
    for(int i=0; i<50; i++){
      assertEquals(discs[i], res.get(i));
    }

    SienaFuture<Iterable<Discovery>> future2 = query.iter(50);
    Iterator<Discovery> it = future2.get().iterator();
    int i=50;
    while(it.hasNext()){
      Discovery disc = it.next();
      assertEquals(discs[i++], disc);
   
    assertEquals(100, i)
   
    future = query.fetch(50);
    res = future.get();
    assertEquals(50, res.size());
    for(i=0; i<50; i++){
      assertEquals(discs[i+100], res.get(i));
    }
   
    future2 = query.iter(50);
    it = future2.get().iterator();
    i=150;
    while(it.hasNext()){
      Discovery disc = it.next();
      assertEquals(discs[i++], disc);
   
    assertEquals(200, i)

  }
 
 
  public void testSearchSingle() {
    Discovery4Search[] discs = new Discovery4Search[100];
    for(int i=0; i<100; i++){
      discs[i] = new Discovery4Search("Disc_"+i, LongAutoID_CURIE);
    }
    pm.insert((Object[])discs).get();

    QueryAsync<Discovery4Search> query =
      pm.createQuery(Discovery4Search.class).search("Disc_5", "name");
   
    SienaFuture<List<Discovery4Search>> future = query.fetch();
    List<Discovery4Search> res = future.get();
       
    assertEquals(1, res.size());
    assertEquals(discs[5], res.get(0));
  }
 
 
  public void testSearchSingleKeysOnly() {
    Discovery4Search[] discs = new Discovery4Search[100];
    for(int i=0; i<100; i++){
      discs[i] = new Discovery4Search("Disc_"+i, LongAutoID_CURIE);
    }
    pm.insert((Object[])discs).get();

    QueryAsync<Discovery4Search> query =
      pm.createQuery(Discovery4Search.class).search("Disc_5", "name");
   
    SienaFuture<List<Discovery4Search>> future = query.fetchKeys();
    List<Discovery4Search> res = future.get();
       
    assertEquals(1, res.size());
    assertEquals(discs[5].id, res.get(0).id);
    assertTrue(res.get(0).isOnlyIdFilled());
  }
 
  public void testSearchSingleTwice() {
    Discovery4Search[] discs = new Discovery4Search[100];
    for(int i=0; i<100; i++){
      discs[i] = new Discovery4Search("Disc_"+i, LongAutoID_CURIE);
    }
    pm.insert((Object[])discs).get();

    QueryAsync<Discovery4Search> query =
      pm.createQuery(Discovery4Search.class).search("Disc_5", "name");
   
    SienaFuture<List<Discovery4Search>> future = query.fetch();
    List<Discovery4Search> res = future.get();
       
    assertEquals(1, res.size());
    assertEquals(discs[5], res.get(0));

    query =
      pm.createQuery(Discovery4Search.class).search("Disc_48", "name");
   
    future = query.fetch();
    res = future.get();
       
    assertEquals(1, res.size());
    assertEquals(discs[48], res.get(0));

  }

  public void testSearchSingleCount() {
    Discovery4Search[] discs = new Discovery4Search[100];
    for(int i=0; i<100; i++){
      discs[i] = new Discovery4Search("Disc_"+i, LongAutoID_CURIE);
    }
    pm.insert((Object[])discs).get();

    QueryAsync<Discovery4Search> query =
      pm.createQuery(Discovery4Search.class).search("Disc_5", "name");
   
    int res = query.count().get();
       
    assertEquals(1, res);
  }
 
  public void testBatchInsert() {
    Object[] discs = new Discovery[100];
    for(int i=0; i<100; i++){
      discs[i] = new Discovery("Disc_"+i, LongAutoID_CURIE);
    }
    SienaFuture<Integer> resf = pm.insert(discs);
    assertEquals(discs.length, (int)resf.get());
   
    SienaFuture<List<Discovery>> future =
      pm.createQuery(Discovery.class).fetch();
    List<Discovery> res = future.get();
   
    assertEquals(discs.length, res.size());
    int i=0;
    for(Discovery disc:res){
      assertEquals(discs[i++], disc);
    }
  }
  public void testBatchInsertList() {
    List<Discovery> discs = new ArrayList<Discovery>();
    for(int i=0; i<100; i++){
      discs.add(new Discovery("Disc_"+i, LongAutoID_CURIE));
    }
    SienaFuture<Integer> resf = pm.insert(discs);
    assertEquals(discs.size(), (int)resf.get());

    SienaFuture<List<Discovery>> future =
      pm.createQuery(Discovery.class).fetch();
    List<Discovery> res = future.get();
   
    assertEquals(discs.size(), res.size());
    int i=0;
    for(Discovery disc:res){
      assertEquals(discs.get(i++), disc);
    }
  }
 
  public void testBatchDelete() {
    Object[] discs = new Discovery[100];
    for(int i=0; i<100; i++){
      discs[i] = new Discovery("Disc_"+i, LongAutoID_CURIE);
    }
    pm.insert(discs).get();

    SienaFuture<List<Discovery>> future =
      pm.createQuery(Discovery.class).fetch();
    List<Discovery> res = future.get();
   
    assertEquals(discs.length, res.size());
   
    SienaFuture<Integer> resf = pm.delete(discs);
    assertEquals(discs.length, (int)resf.get());
   
    future =
      pm.createQuery(Discovery.class).fetch();
    res = future.get();
   
    assertEquals(0, res.size());
  }
 
  public void testBatchDeleteList() {
    List<Discovery> discs = new ArrayList<Discovery>();
    for(int i=0; i<100; i++){
      Discovery disc = new Discovery("Disc_"+i, LongAutoID_CURIE);
      discs.add(disc);
    }
    pm.insert(discs).get();

    SienaFuture<List<Discovery>> future =
      pm.createQuery(Discovery.class).fetch();
    List<Discovery> res = future.get();
   
    assertEquals(discs.size(), res.size());
   
    pm.delete(discs).get();
   
    future =
      pm.createQuery(Discovery.class).fetch();
    res = future.get();
   
    assertEquals(0, res.size());
  }
 
 
  public void testBatchDeleteByKeys() {
    SienaFuture<Integer> resf = pm.deleteByKeys(PersonStringID.class, "TESLA", "CURIE");
    assertEquals(2, (int)resf.get());
   
    List<PersonStringID> res =
      pm.createQuery(PersonStringID.class).fetch().get();
   
    assertEquals(1, res.size());
    assertEquals(StringID_EINSTEIN, res.get(0));
  }
 
  public void testBatchDeleteByKeysList() {
    SienaFuture<Integer> resf = pm.deleteByKeys(PersonStringID.class, new ArrayList<String>(){
      private static final long serialVersionUID = 1L;
      {add("TESLA"); add( "CURIE");}
    });
    assertEquals(2, (int)resf.get());

    List<PersonStringID> res =
      pm.createQuery(PersonStringID.class).fetch().get();
   
    assertEquals(1, res.size());
    assertEquals(StringID_EINSTEIN, res.get(0));
  }
 
  public void testBatchGet() {
    Discovery[] discs = new Discovery[100];
   
    for(int i=0; i<100; i++){
      discs[i] = new Discovery("Disc_"+i, LongAutoID_CURIE);
    }
    pm.insert((Object[])discs).get();

    Discovery[] discs2Get = new Discovery[100];
    for(int i=0; i<100; i++){
      discs2Get[i] = new Discovery();
      discs2Get[i].id = discs[i].id;
    }
   
    SienaFuture<Integer> resf = pm.get((Object[])discs2Get);
    assertEquals(discs.length, (int)resf.get());

    assertEquals(discs.length, discs2Get.length);
    for(int i=0; i<discs.length; i++){
      assertEquals(discs[i], discs2Get[i]);
    }   
  }
 
  public void testBatchGetList() {
    Discovery[] discs = new Discovery[100];
   
    for(int i=0; i<100; i++){
      discs[i] = new Discovery("Disc_"+i, LongAutoID_CURIE);
    }
    pm.insert((Object[])discs).get();

    List<Discovery> discs2Get = new ArrayList<Discovery>();
    for(int i=0; i<100; i++){
      Discovery disc = new Discovery();
      disc.id = discs[i].id;
      discs2Get.add(disc);
    }
   
    SienaFuture<Integer> resf = pm.get(discs2Get);
    assertEquals(discs.length, (int)resf.get());

    int i=0;
    for(Discovery disc:discs2Get){
      assertEquals(discs[i++], disc);
    }   
  }
 
  public void testBatchGetByKeys() {
    SienaFuture<List<PersonStringID>> future = pm.getByKeys(PersonStringID.class, "TESLA", "CURIE");
   
    List<PersonStringID> res = future.get();
    assertEquals(2, res.size());
    assertEquals(StringID_TESLA, res.get(0));
    assertEquals(StringID_CURIE, res.get(1));
  }
 
  public void testBatchGetByKeysList() {
    Discovery[] discs = new Discovery[100];
   
    for(int i=0; i<100; i++){
      discs[i] = new Discovery("Disc_"+i, LongAutoID_CURIE);
    }
    pm.insert((Object[])discs).get();

    List<Long> discsKeys = new ArrayList<Long>();
    for(int i=0; i<100; i++){
      discsKeys.add(discs[i].id);
    }
   
    SienaFuture<List<Discovery>> future = pm.getByKeys(Discovery.class, discsKeys);
    List<Discovery> discs2Get = future.get();
    int i=0;
    for(Discovery disc:discs2Get){
      assertEquals(discs[i++], disc);
    }   
  }
 
  public void testLimitStateless(){
    Discovery[] discs = new Discovery[150];
    for(int i=0; i<150; i++){
      discs[i] = new Discovery("Disc_"+i, LongAutoID_CURIE);
    }
    pm.insert((Object[])discs).get();
   
    QueryAsync<Discovery> query = pm.createQuery(Discovery.class).stateless().order("id");
    SienaFuture<List<Discovery>> future = query.limit(50).fetch();
    List<Discovery> res = future.get();
    assertEquals(50, res.size());
    for(int i=0; i<50; i++){
      assertEquals(discs[i], res.get(i));
    }
   
    future = query.limit(50).fetch();
    res = future.get();
    assertEquals(50, res.size());
    for(int i=0; i<50; i++){
      assertEquals(discs[i], res.get(i));
    }
   
    future = query.fetch(50);
    res = future.get();
    assertEquals(50, res.size());
    for(int i=0; i<50; i++){
      assertEquals(discs[i], res.get(i));
    }
   
    future = query.paginate(50).fetch();
    res = future.get();
    assertEquals(50, res.size());
    for(int i=0; i<50; i++){
      assertEquals(discs[i], res.get(i));
    }
  }
 
 
 
  public void testLimitStateful(){
    Discovery[] discs = new Discovery[150];
    for(int i=0; i<150; i++){
      discs[i] = new Discovery("Disc_"+i, LongAutoID_CURIE);
    }
    pm.insert((Object[])discs).get();
   
    QueryAsync<Discovery> query = pm.createQuery(Discovery.class).stateful().order("id");
    SienaFuture<List<Discovery>> future = query.limit(50).fetch();
    List<Discovery> res = future.get();
    assertEquals(50, res.size());
    for(int i=0; i<50; i++){
      assertEquals(discs[i], res.get(i));
    }
   
    future = query.fetch(50);
    res = future.get();
    assertEquals(50, res.size());
    for(int i=0; i<50; i++){
      assertEquals(discs[i+50], res.get(i));
    }
   
    future = query.paginate(50).fetch(25);
    res = future.get();
    assertEquals(50, res.size());
    for(int i=0; i<50; i++){
      assertEquals(discs[i+100], res.get(i));
    }
  }

  public void testOffsetStateless(){
    Discovery[] discs = new Discovery[150];
    for(int i=0; i<150; i++){
      discs[i] = new Discovery("Disc_"+i, LongAutoID_CURIE);
    }
    pm.insert((Object[])discs).get();
   
    QueryAsync<Discovery> query = pm.createQuery(Discovery.class).order("id");
    SienaFuture<List<Discovery>> future = query.offset(50).fetch();
    List<Discovery> res = future.get();
    assertEquals(100, res.size());
    for(int i=0; i<100; i++){
      assertEquals(discs[i+50], res.get(i));
    }
  }

  public void testOffsetStateful(){
    Discovery[] discs = new Discovery[150];
    for(int i=0; i<150; i++){
      discs[i] = new Discovery("Disc_"+i, LongAutoID_CURIE);
    }
    pm.insert((Object[])discs).get();
   
    QueryAsync<Discovery> query = pm.createQuery(Discovery.class).stateful().order("id");
    SienaFuture<List<Discovery>> future = query.offset(50).fetch();
    List<Discovery> res = future.get();
    assertEquals(100, res.size());
    for(int i=0; i<100; i++){
      assertEquals(discs[i+50], res.get(i));
    }
  }
 
  public void testOffsetLimitStateless(){
    Discovery[] discs = new Discovery[150];
    for(int i=0; i<150; i++){
      discs[i] = new Discovery("Disc_"+i, LongAutoID_CURIE);
    }
    pm.insert((Object[])discs).get();
   
    QueryAsync<Discovery> query = pm.createQuery(Discovery.class).order("id");
    SienaFuture<List<Discovery>> future = query.offset(50).limit(50).fetch();
    List<Discovery> res = future.get();
    assertEquals(50, res.size());
    for(int i=0; i<50; i++){
      assertEquals(discs[i+50], res.get(i));
    }
  }
 
  public void testOffsetLimitStateful(){
    Discovery[] discs = new Discovery[150];
    for(int i=0; i<150; i++){
      discs[i] = new Discovery("Disc_"+i, LongAutoID_CURIE);
    }
    pm.insert((Object[])discs).get();
   
    QueryAsync<Discovery> query = pm.createQuery(Discovery.class).stateful().order("id");
    SienaFuture<List<Discovery>> future = query.offset(50).limit(50).fetch();
    List<Discovery> res = future.get();
    assertEquals(50, res.size());
    for(int i=0; i<50; i++){
      assertEquals(discs[i+50], res.get(i));
    }
  }


  public void testOffsetLimitStatelessPaginate(){
    Discovery[] discs = new Discovery[150];
    for(int i=0; i<150; i++){
      discs[i] = new Discovery("Disc_"+i, LongAutoID_CURIE);
    }
    pm.insert((Object[])discs).get();
   
    QueryAsync<Discovery> query = pm.createQuery(Discovery.class).order("id");
    SienaFuture<List<Discovery>> future = query.paginate(50).fetch();
    List<Discovery> res = future.get();
    assertEquals(50, res.size());
    for(int i=0; i<50; i++){
      assertEquals(discs[i], res.get(i));
    }
   
    future = query.nextPage().fetch();
    res = future.get();
    assertEquals(50, res.size());
    for(int i=0; i<50; i++){
      assertEquals(discs[i+50], res.get(i));
    }

    future = query.limit(50).fetch();
    res = future.get();
    assertEquals(50, res.size());
    for(int i=0; i<50; i++){
      assertEquals(discs[i], res.get(i));
    }

    future = query.offset(50).fetch();
    res = future.get();
    assertEquals(100, res.size());
    for(int i=0; i<100; i++){
      assertEquals(discs[i+50], res.get(i));
    }
   
    future = query.offset(50).limit(50).fetch();
    res = future.get();
    assertEquals(50, res.size());
    for(int i=0; i<50; i++){
      assertEquals(discs[i+50], res.get(i));
    }

  }
 
  public void testOffsetLimitStatefulPaginate(){
    Discovery[] discs = new Discovery[300];
    for(int i=0; i<300; i++){
      discs[i] = new Discovery("Disc_"+i, LongAutoID_CURIE);
    }
    pm.insert((Object[])discs).get();
   
    QueryAsync<Discovery> query = pm.createQuery(Discovery.class).order("id").stateful();
    SienaFuture<List<Discovery>> future = query.paginate(50).fetch();
    List<Discovery> res = future.get();
    assertEquals(50, res.size());
    for(int i=0; i<50; i++){
      assertEquals(discs[i], res.get(i));
    }
   
    future = query.nextPage().fetch();
    res = future.get();
    assertEquals(50, res.size());
    for(int i=0; i<50; i++){
      assertEquals(discs[i+50], res.get(i));
    }

    future = query.limit(50).fetch();
    res = future.get();
    assertEquals(50, res.size());
    for(int i=0; i<50; i++){
      assertEquals(discs[i+50], res.get(i));
    }

    future = query.offset(50).fetch();
    res = future.get();
    assertEquals(50, res.size());
    for(int i=0; i<50; i++){
      assertEquals(discs[i+150], res.get(i));
    }
   
    future = query.offset(50).limit(25).fetch();
    res = future.get();
    assertEquals(25, res.size());
    for(int i=0; i<25; i++){
      assertEquals(discs[i+250], res.get(i));
    }
    try {
      future = query.previousPage().fetch();
    }catch(SienaException ex){
      return;
    }
    fail();
  }
 
  public void testOffsetLimitStatelessPaginate2(){
    Discovery[] discs = new Discovery[300];
    for(int i=0; i<300; i++){
      discs[i] = new Discovery("Disc_"+i, LongAutoID_CURIE);
    }
    pm.insert((Object[])discs).get();
   
    QueryAsync<Discovery> query = pm.createQuery(Discovery.class).order("id");
    SienaFuture<List<Discovery>> future = query.limit(50).offset(12).fetch();
    List<Discovery> res = future.get();
    assertEquals(50, res.size());
    for(int i=0; i<50; i++){
      assertEquals(discs[i+12], res.get(i));
    }
   
    future = query.offset(13).limit(30).fetch();
    res = future.get();
    assertEquals(30, res.size());
    for(int i=0; i<30; i++){
      assertEquals(discs[i+13], res.get(i));
    }
   
    future = query.offset(10).limit(30).fetch(15);
    res = future.get();
    assertEquals(15, res.size());
    for(int i=0; i<15; i++){
      assertEquals(discs[i+10], res.get(i));
    }
   
    future = query.paginate(6).fetch();
    res = future.get();
    assertEquals(6, res.size());
    for(int i=0; i<6; i++){
      assertEquals(discs[i], res.get(i));
    }
   
    future = query.nextPage().fetch();
    res = future.get();
    assertEquals(6, res.size());
    for(int i=0; i<6; i++){
      assertEquals(discs[i+6], res.get(i));
    }
   
    future = query.nextPage().fetch();
    res = future.get();
    assertEquals(6, res.size());
    for(int i=0; i<6; i++){
      assertEquals(discs[i+12], res.get(i));
    }
   
    future = query.previousPage().fetch();
    res = future.get();
    assertEquals(6, res.size());
    for(int i=0; i<6; i++){
      assertEquals(discs[i+6], res.get(i));
    }
   
    future = query.offset(10).fetch(10);
    res = future.get();
    assertEquals(10, res.size());
    for(int i=0; i<10; i++){
      assertEquals(discs[i+10], res.get(i));
    }
   
    try {
      future = query.nextPage().fetch();
    }catch(SienaException ex){
      future = query.paginate(8).fetch();
      res = future.get();
      assertEquals(8, res.size());
      for(int i=0; i<8; i++){
        assertEquals(discs[i], res.get(i));
      }
     
      future = query.nextPage().fetch();
      res = future.get();
      assertEquals(8, res.size());
      for(int i=0; i<8; i++){
        assertEquals(discs[i+8], res.get(i));
      }
     
      return;
    }
    fail();
   
  }
 
  public void testOffsetLimitStatefulPaginate2(){
    Discovery[] discs = new Discovery[300];
    for(int i=0; i<300; i++){
      discs[i] = new Discovery("Disc_"+i, LongAutoID_CURIE);
    }
    pm.insert((Object[])discs).get();
   
    QueryAsync<Discovery> query = pm.createQuery(Discovery.class).order("id").stateful();
    SienaFuture<List<Discovery>> future = query.limit(50).offset(12).fetch();
    List<Discovery> res = future.get();
    assertEquals(50, res.size());
    for(int i=0; i<50; i++){
      assertEquals(discs[i+12], res.get(i));
    }
   
    future = query.offset(13).limit(30).fetch();
    res = future.get();
    assertEquals(30, res.size());
    for(int i=0; i<30; i++){
      assertEquals(discs[i+75], res.get(i));
    }
   
    future = query.offset(10).limit(30).fetch(15);
    res = future.get();
    assertEquals(15, res.size());
    for(int i=0; i<15; i++){
      assertEquals(discs[i+115], res.get(i));
    }
   
    future = query.paginate(6).fetch();
    res = future.get();
    assertEquals(6, res.size());
    for(int i=0; i<6; i++){
      assertEquals(discs[i+130], res.get(i));
    }
   
    future = query.nextPage().fetch();
    res = future.get();
    assertEquals(6, res.size());
    for(int i=0; i<6; i++){
      assertEquals(discs[i+136], res.get(i));
    }
   
    future = query.nextPage().fetch();
    res = future.get();
    assertEquals(6, res.size());
    for(int i=0; i<6; i++){
      assertEquals(discs[i+142], res.get(i));
    }
   
    future = query.previousPage().fetch();
    res = future.get();
    assertEquals(6, res.size());
    for(int i=0; i<6; i++){
      assertEquals(discs[i+136], res.get(i));
    }
   
    future = query.offset(10).fetch(10);
    res = future.get();
    assertEquals(10, res.size());
    for(int i=0; i<10; i++){
      assertEquals(discs[i+146], res.get(i));
    }
   
    try {
      future = query.nextPage().fetch();
    }catch(SienaException ex){
      future = query.paginate(8).fetch();
      res = future.get();
      assertEquals(8, res.size());
      for(int i=0; i<8; i++){
        assertEquals(discs[i+156], res.get(i));
      }
     
      future = query.nextPage().fetch();
      res = future.get();
      assertEquals(8, res.size());
      for(int i=0; i<8; i++){
        assertEquals(discs[i+164], res.get(i));
      }
    }
  }
 
  public void testFetchPaginateStatelessTwice() {
    Discovery[] discs = new Discovery[15];
    for(int i=0; i<15; i++){
      discs[i] = new Discovery("Disc_"+i, LongAutoID_CURIE);
    }
    pm.insert((Object[])discs).get();

    QueryAsync<Discovery> query = pm.createQuery(Discovery.class).paginate(5).order("id");
    SienaFuture<List<Discovery>> future = query.fetch();
    List<Discovery> res = future.get();
    assertEquals(5, res.size());
    for(int i=0; i<5; i++){
      assertEquals(discs[i], res.get(i));
    }   
   
    future = query.nextPage().fetch();
    res = future.get();
    assertEquals(5, res.size());
    for(int i=0; i<5; i++){
      assertEquals(discs[i+5], res.get(i));
    }
   
    future = query.paginate(8).fetch();
    res = future.get();
    assertEquals(8, res.size());
    for(int i=0; i<8; i++){
      assertEquals(discs[i], res.get(i));
    }
   
    future = query.nextPage().fetch();
    res = future.get();
    assertEquals(7, res.size());
    for(int i=0; i<7; i++){
      assertEquals(discs[i+8], res.get(i));
    }
  }
 
  public void testFetchPaginateStatefulTwice() {
    Discovery[] discs = new Discovery[15];
    for(int i=0; i<15; i++){
      discs[i] = new Discovery("Disc_"+i, LongAutoID_CURIE);
    }
    pm.insert((Object[])discs).get();

    QueryAsync<Discovery> query = pm.createQuery(Discovery.class).stateful().paginate(5).order("id");
    SienaFuture<List<Discovery>> future = query.fetch();
    List<Discovery> res = future.get();
    assertEquals(5, res.size());
    for(int i=0; i<5; i++){
      assertEquals(discs[i], res.get(i));
    }   
   
    future = query.nextPage().fetch();
    res = future.get();
    assertEquals(5, res.size());
    for(int i=0; i<5; i++){
      assertEquals(discs[i+5], res.get(i));
    }
   
    future = query.paginate(8).fetch();
    res = future.get();
    assertEquals(8, res.size());
    for(int i=0; i<8; i++){
      assertEquals(discs[i+5], res.get(i));
    }
   
    future = query.nextPage().fetch();
    res = future.get();
    assertEquals(2, res.size());
    for(int i=0; i<2; i++){
      assertEquals(discs[i+13], res.get(i));
    }
  }
 
 
  public void testLimitStatelessKeys(){
    Discovery[] discs = new Discovery[150];
    for(int i=0; i<150; i++){
      discs[i] = new Discovery("Disc_"+i, LongAutoID_CURIE);
    }
    pm.insert((Object[])discs).get();
   
    QueryAsync<Discovery> query = pm.createQuery(Discovery.class).stateless().order("id");
    SienaFuture<List<Discovery>> future = query.limit(50).fetchKeys();
    List<Discovery> res = future.get();
    assertEquals(50, res.size());
    for(int i=0; i<50; i++){
      assertEquals(discs[i].id, res.get(i).id);
      assertTrue(res.get(i).isOnlyIdFilled());
    }
   
    future = query.limit(50).fetchKeys();
    res = future.get();
    assertEquals(50, res.size());
    for(int i=0; i<50; i++){
      assertEquals(discs[i].id, res.get(i).id);
      assertTrue(res.get(i).isOnlyIdFilled());
    }
   
    future = query.fetchKeys(50);
    res = future.get();
    assertEquals(50, res.size());
    for(int i=0; i<50; i++){
      assertEquals(discs[i].id, res.get(i).id);
      assertTrue(res.get(i).isOnlyIdFilled());
    }
   
    future = query.paginate(50).fetchKeys();
    res = future.get();
    assertEquals(50, res.size());
    for(int i=0; i<50; i++){
      assertEquals(discs[i].id, res.get(i).id);
      assertTrue(res.get(i).isOnlyIdFilled());
    }
  }
 
  public void testLimitStatefulKeys(){
    Discovery[] discs = new Discovery[150];
    for(int i=0; i<150; i++){
      discs[i] = new Discovery("Disc_"+i, LongAutoID_CURIE);
    }
    pm.insert((Object[])discs).get();
   
    QueryAsync<Discovery> query = pm.createQuery(Discovery.class).stateful().order("id");
    SienaFuture<List<Discovery>> future = query.limit(50).fetchKeys();
    List<Discovery> res = future.get();
    assertEquals(50, res.size());
    for(int i=0; i<50; i++){
      assertEquals(discs[i].id, res.get(i).id);
      assertTrue(res.get(i).isOnlyIdFilled());
    }
   
    future = query.fetchKeys(50);
    res = future.get();
    assertEquals(50, res.size());
    for(int i=0; i<50; i++){
      assertEquals(discs[i+50].id, res.get(i).id);
      assertTrue(res.get(i).isOnlyIdFilled());
    }
   
    future = query.paginate(50).fetchKeys(25);
    res = future.get();
    assertEquals(50, res.size());
    for(int i=0; i<50; i++){
      assertEquals(discs[i+100].id, res.get(i).id);
      assertTrue(res.get(i).isOnlyIdFilled());
    }
  }
 
  public void testOffsetStatelessKeys(){
    Discovery[] discs = new Discovery[150];
    for(int i=0; i<150; i++){
      discs[i] = new Discovery("Disc_"+i, LongAutoID_CURIE);
    }
    pm.insert((Object[])discs).get();
   
    QueryAsync<Discovery> query = pm.createQuery(Discovery.class).order("id");
    SienaFuture<List<Discovery>> future = query.offset(50).fetchKeys();
    List<Discovery> res = future.get();
    assertEquals(100, res.size());
    for(int i=0; i<100; i++){
      assertEquals(discs[i+50].id, res.get(i).id);
      assertTrue(res.get(i).isOnlyIdFilled());
    }
  }

  public void testOffsetStatefulKeys(){
    Discovery[] discs = new Discovery[150];
    for(int i=0; i<150; i++){
      discs[i] = new Discovery("Disc_"+i, LongAutoID_CURIE);
    }
    pm.insert((Object[])discs).get();
   
    QueryAsync<Discovery> query = pm.createQuery(Discovery.class).stateful().order("id");
    SienaFuture<List<Discovery>> future = query.offset(50).fetchKeys();
    List<Discovery> res = future.get();
    assertEquals(100, res.size());
    for(int i=0; i<100; i++){
      assertEquals(discs[i+50].id, res.get(i).id);
      assertTrue(res.get(i).isOnlyIdFilled());
    }
  }
 
  public void testOffsetLimitStatelessKeys(){
    Discovery[] discs = new Discovery[150];
    for(int i=0; i<150; i++){
      discs[i] = new Discovery("Disc_"+i, LongAutoID_CURIE);
    }
    pm.insert((Object[])discs).get();
   
    QueryAsync<Discovery> query = pm.createQuery(Discovery.class).order("id");
    SienaFuture<List<Discovery>> future = query.offset(50).limit(50).fetchKeys();
    List<Discovery> res = future.get();
    assertEquals(50, res.size());
    for(int i=0; i<50; i++){
      assertEquals(discs[i+50].id, res.get(i).id);
      assertTrue(res.get(i).isOnlyIdFilled());
    }
  }

  public void testOffsetLimitStatefulKeys(){
    Discovery[] discs = new Discovery[150];
    for(int i=0; i<150; i++){
      discs[i] = new Discovery("Disc_"+i, LongAutoID_CURIE);
    }
    pm.insert((Object[])discs).get();
   
    QueryAsync<Discovery> query = pm.createQuery(Discovery.class).stateful().order("id");
    SienaFuture<List<Discovery>> future = query.offset(50).limit(50).fetchKeys();
    List<Discovery> res = future.get();
    assertEquals(50, res.size());
    for(int i=0; i<50; i++){
      assertEquals(discs[i+50].id, res.get(i).id);
      assertTrue(res.get(i).isOnlyIdFilled());
    }
  }

 
  public void testOffsetLimitStatelessPaginateKeys(){
    Discovery[] discs = new Discovery[150];
    for(int i=0; i<150; i++){
      discs[i] = new Discovery("Disc_"+i, LongAutoID_CURIE);
    }
    pm.insert((Object[])discs).get();
   
    QueryAsync<Discovery> query = pm.createQuery(Discovery.class).order("id");
    SienaFuture<List<Discovery>> future = query.paginate(50).fetchKeys();
    List<Discovery> res = future.get();
    assertEquals(50, res.size());
    for(int i=0; i<50; i++){
      assertEquals(discs[i].id, res.get(i).id);
      assertTrue(res.get(i).isOnlyIdFilled());
    }
   
    future = query.nextPage().fetchKeys();
    res = future.get();
    assertEquals(50, res.size());
    for(int i=0; i<50; i++){
      assertEquals(discs[i+50].id, res.get(i).id);
      assertTrue(res.get(i).isOnlyIdFilled());
    }

    future = query.limit(50).fetchKeys();
    res = future.get();
    assertEquals(50, res.size());
    for(int i=0; i<50; i++){
      assertEquals(discs[i].id, res.get(i).id);
      assertTrue(res.get(i).isOnlyIdFilled());
    }

    future = query.offset(50).fetchKeys();
    res = future.get();
    assertEquals(100, res.size());
    for(int i=0; i<100; i++){
      assertEquals(discs[i+50].id, res.get(i).id);
      assertTrue(res.get(i).isOnlyIdFilled());
    }
   
    future = query.offset(50).limit(50).fetchKeys();
    res = future.get();
    assertEquals(50, res.size());
    for(int i=0; i<50; i++){
      assertEquals(discs[i+50].id, res.get(i).id);
      assertTrue(res.get(i).isOnlyIdFilled());
    }

  }
 
  public void testOffsetLimitStatefulPaginateKeys(){
    Discovery[] discs = new Discovery[300];
    for(int i=0; i<300; i++){
      discs[i] = new Discovery("Disc_"+i, LongAutoID_CURIE);
    }
    pm.insert((Object[])discs).get();
   
    QueryAsync<Discovery> query = pm.createQuery(Discovery.class).order("id").stateful();
    SienaFuture<List<Discovery>> future = query.paginate(50).fetchKeys();
    List<Discovery> res = future.get();
    assertEquals(50, res.size());
    for(int i=0; i<50; i++){
      assertEquals(discs[i].id, res.get(i).id);
      assertTrue(res.get(i).isOnlyIdFilled());
    }
   
    future = query.nextPage().fetchKeys();
    res = future.get();
    assertEquals(50, res.size());
    for(int i=0; i<50; i++){
      assertEquals(discs[i+50].id, res.get(i).id);
      assertTrue(res.get(i).isOnlyIdFilled());
    }

    future = query.limit(50).fetchKeys();
    res = future.get();
    assertEquals(50, res.size());
    for(int i=0; i<50; i++){
      assertEquals(discs[i+50].id, res.get(i).id);
      assertTrue(res.get(i).isOnlyIdFilled());
    }

    future = query.offset(50).fetchKeys();
    res = future.get();
    assertEquals(50, res.size());
    for(int i=0; i<50; i++){
      assertEquals(discs[i+150].id, res.get(i).id);
      assertTrue(res.get(i).isOnlyIdFilled());
    }
   
    future = query.offset(50).limit(25).fetchKeys();
    res = future.get();
    assertEquals(25, res.size());
    for(int i=0; i<25; i++){
      assertEquals(discs[i+250].id, res.get(i).id);
      assertTrue(res.get(i).isOnlyIdFilled());
    }
    try {
      future = query.previousPage().fetch();
    }catch(SienaException ex){
      return;
    }
    fail();
  }
 
  public void testOffsetLimitStatelessPaginate2Keys(){
    Discovery[] discs = new Discovery[300];
    for(int i=0; i<300; i++){
      discs[i] = new Discovery("Disc_"+i, LongAutoID_CURIE);
    }
    pm.insert((Object[])discs).get();
   
    QueryAsync<Discovery> query = pm.createQuery(Discovery.class).order("id");
    SienaFuture<List<Discovery>> future = query.limit(50).offset(12).fetchKeys();
    List<Discovery> res = future.get();
    assertEquals(50, res.size());
    for(int i=0; i<50; i++){
      assertEquals(discs[i+12].id, res.get(i).id);
      assertTrue(res.get(i).isOnlyIdFilled());
    }
   
    future = query.offset(13).limit(30).fetchKeys();
    res = future.get();
    assertEquals(30, res.size());
    for(int i=0; i<30; i++){
      assertEquals(discs[i+13].id, res.get(i).id);
      assertTrue(res.get(i).isOnlyIdFilled());
    }
   
    future = query.offset(10).limit(30).fetchKeys(15);
    res = future.get();
    assertEquals(15, res.size());
    for(int i=0; i<15; i++){
      assertEquals(discs[i+10].id, res.get(i).id);
      assertTrue(res.get(i).isOnlyIdFilled());
    }
   
    future = query.paginate(6).fetchKeys();
    res = future.get();
    assertEquals(6, res.size());
    for(int i=0; i<6; i++){
      assertEquals(discs[i].id, res.get(i).id);
      assertTrue(res.get(i).isOnlyIdFilled());
    }
   
    future = query.nextPage().fetchKeys();
    res = future.get();
    assertEquals(6, res.size());
    for(int i=0; i<6; i++){
      assertEquals(discs[i+6].id, res.get(i).id);
      assertTrue(res.get(i).isOnlyIdFilled());
    }
   
    future = query.nextPage().fetchKeys();
    res = future.get();
    assertEquals(6, res.size());
    for(int i=0; i<6; i++){
      assertEquals(discs[i+12].id, res.get(i).id);
      assertTrue(res.get(i).isOnlyIdFilled());
    }
   
    future = query.previousPage().fetchKeys();
    res = future.get();
    assertEquals(6, res.size());
    for(int i=0; i<6; i++){
      assertEquals(discs[i+6].id, res.get(i).id);
      assertTrue(res.get(i).isOnlyIdFilled());
    }
   
    future = query.offset(10).fetchKeys(10);
    res = future.get();
    assertEquals(10, res.size());
    for(int i=0; i<10; i++){
      assertEquals(discs[i+10].id, res.get(i).id);
      assertTrue(res.get(i).isOnlyIdFilled());
    }
   
    try {
      future = query.nextPage().fetchKeys();
    }catch(SienaException ex){
      future = query.paginate(8).fetch();
      res = future.get();
      assertEquals(8, res.size());
      for(int i=0; i<8; i++){
        assertEquals(discs[i].id, res.get(i).id);
      }
     
      future = query.nextPage().fetchKeys();
      res = future.get();
      assertEquals(8, res.size());
      for(int i=0; i<8; i++){
        assertEquals(discs[i+8].id, res.get(i).id);
      }
    }
   
  }
 
  public void testOffsetLimitStatefulPaginate2Keys(){
    Discovery[] discs = new Discovery[300];
    for(int i=0; i<300; i++){
      discs[i] = new Discovery("Disc_"+i, LongAutoID_CURIE);
    }
    pm.insert((Object[])discs).get();
   
    QueryAsync<Discovery> query = pm.createQuery(Discovery.class).order("id").stateful();
    SienaFuture<List<Discovery>> future = query.limit(50).offset(12).fetchKeys();
    List<Discovery> res = future.get();
    assertEquals(50, res.size());
    for(int i=0; i<50; i++){
      assertEquals(discs[i+12].id, res.get(i).id);
      assertTrue(res.get(i).isOnlyIdFilled());
    }
   
    future = query.offset(13).limit(30).fetchKeys();
    res = future.get();
    assertEquals(30, res.size());
    for(int i=0; i<30; i++){
      assertEquals(discs[i+75].id, res.get(i).id);
      assertTrue(res.get(i).isOnlyIdFilled());
    }
   
    future = query.offset(10).limit(30).fetchKeys(15);
    res = future.get();
    assertEquals(15, res.size());
    for(int i=0; i<15; i++){
      assertEquals(discs[i+115].id, res.get(i).id);
      assertTrue(res.get(i).isOnlyIdFilled());
    }
   
    future = query.paginate(6).fetchKeys();
    res = future.get();
    assertEquals(6, res.size());
    for(int i=0; i<6; i++){
      assertEquals(discs[i+130].id, res.get(i).id);
      assertTrue(res.get(i).isOnlyIdFilled());
    }
   
    future = query.nextPage().fetchKeys();
    res = future.get();
    assertEquals(6, res.size());
    for(int i=0; i<6; i++){
      assertEquals(discs[i+136].id, res.get(i).id);
      assertTrue(res.get(i).isOnlyIdFilled());
    }
   
    future = query.nextPage().fetchKeys();
    res = future.get();
    assertEquals(6, res.size());
    for(int i=0; i<6; i++){
      assertEquals(discs[i+142].id, res.get(i).id);
      assertTrue(res.get(i).isOnlyIdFilled());
    }
   
    future = query.previousPage().fetchKeys();
    res = future.get();
    assertEquals(6, res.size());
    for(int i=0; i<6; i++){
      assertEquals(discs[i+136].id, res.get(i).id);
      assertTrue(res.get(i).isOnlyIdFilled());
    }
   
    future = query.offset(10).fetchKeys(10);
    res = future.get();
    assertEquals(10, res.size());
    for(int i=0; i<10; i++){
      assertEquals(discs[i+146].id, res.get(i).id);
      assertTrue(res.get(i).isOnlyIdFilled());
    }
   
    try {
      future = query.nextPage().fetchKeys();
    }catch(SienaException ex){
      future = query.paginate(8).fetchKeys();
      res = future.get();
      assertEquals(8, res.size());
      for(int i=0; i<8; i++){
        assertEquals(discs[i+156].id, res.get(i).id);
        assertTrue(res.get(i).isOnlyIdFilled());
      }
     
      future = query.nextPage().fetchKeys();
      res = future.get();
      assertEquals(8, res.size());
      for(int i=0; i<8; i++){
        assertEquals(discs[i+164].id, res.get(i).id);
        assertTrue(res.get(i).isOnlyIdFilled());
      }
    }
  }
 
  public void testFetchPaginateStatelessTwiceKeys() {
    Discovery[] discs = new Discovery[15];
    for(int i=0; i<15; i++){
      discs[i] = new Discovery("Disc_"+i, LongAutoID_CURIE);
    }
    pm.insert((Object[])discs).get();

    QueryAsync<Discovery> query = pm.createQuery(Discovery.class).paginate(5).order("id");
    SienaFuture<List<Discovery>> future = query.fetchKeys();
    List<Discovery> res = future.get();
    assertEquals(5, res.size());
    for(int i=0; i<5; i++){
      assertEquals(discs[i].id, res.get(i).id);
      assertTrue(res.get(i).isOnlyIdFilled());
    }   
   
    future = query.nextPage().fetchKeys();
    res = future.get();
    assertEquals(5, res.size());
    for(int i=0; i<5; i++){
      assertEquals(discs[i+5].id, res.get(i).id);
      assertTrue(res.get(i).isOnlyIdFilled());
    }
   
    future = query.paginate(8).fetchKeys();
    res = future.get();
    assertEquals(8, res.size());
    for(int i=0; i<8; i++){
      assertEquals(discs[i].id, res.get(i).id);
      assertTrue(res.get(i).isOnlyIdFilled());
    }
   
    future = query.nextPage().fetchKeys();
    res = future.get();
    assertEquals(7, res.size());
    for(int i=0; i<7; i++){
      assertEquals(discs[i+8].id, res.get(i).id);
      assertTrue(res.get(i).isOnlyIdFilled());
    }
  }
 
  public void testFetchPaginateStatefulTwiceKeys() {
    Discovery[] discs = new Discovery[15];
    for(int i=0; i<15; i++){
      discs[i] = new Discovery("Disc_"+i, LongAutoID_CURIE);
    }
    pm.insert((Object[])discs).get();

    QueryAsync<Discovery> query = pm.createQuery(Discovery.class).stateful().paginate(5).order("id");
    SienaFuture<List<Discovery>> future = query.fetchKeys();
    List<Discovery> res = future.get();
    assertEquals(5, res.size());
    for(int i=0; i<5; i++){
      assertEquals(discs[i].id, res.get(i).id);
      assertTrue(res.get(i).isOnlyIdFilled());
    }   
   
    future = query.nextPage().fetchKeys();
    res = future.get();
    assertEquals(5, res.size());
    for(int i=0; i<5; i++){
      assertEquals(discs[i+5].id, res.get(i).id);
      assertTrue(res.get(i).isOnlyIdFilled());
    }
   
    future = query.paginate(8).fetchKeys();
    res = future.get();
    assertEquals(8, res.size());
    for(int i=0; i<8; i++){
      assertEquals(discs[i+5].id, res.get(i).id);
      assertTrue(res.get(i).isOnlyIdFilled());
    }
   
    future = query.nextPage().fetchKeys();
    res = future.get();
    assertEquals(2, res.size());
    for(int i=0; i<2; i++){
      assertEquals(discs[i+13].id, res.get(i).id);
      assertTrue(res.get(i).isOnlyIdFilled());
    }
  }
 
  public void testLimitStatelessIter(){
    Discovery[] discs = new Discovery[150];
    for(int i=0; i<150; i++){
      discs[i] = new Discovery("Disc_"+i, LongAutoID_CURIE);
    }
    pm.insert((Object[])discs).get();
   
    QueryAsync<Discovery> query = pm.createQuery(Discovery.class).stateless().order("id");
    SienaFuture<Iterable<Discovery>> future = query.limit(50).iter();
    Iterable<Discovery> iter = future.get();
    Iterator<Discovery> it = iter.iterator();
    int i=0;
    while(it.hasNext()){
      Discovery disc = it.next();
      assertEquals(discs[i++], disc);
   
    assertEquals(50, i)
   
    future = query.limit(50).iter();
    iter = future.get();
    it = iter.iterator();
    i=0;
    while(it.hasNext()){
      Discovery disc = it.next();
      assertEquals(discs[i++], disc);
   
    assertEquals(50, i)
   
    future = query.iter(50);
    iter = future.get();
    it = iter.iterator();
    i=0;
    while(it.hasNext()){
      Discovery disc = it.next();
      assertEquals(discs[i++], disc);
   
    assertEquals(50, i)

    future = query.paginate(50).iter();
    iter = future.get();
    it = iter.iterator();
    i=0;
    while(it.hasNext()){
      Discovery disc = it.next();
      assertEquals(discs[i++], disc);
   
    assertEquals(50, i);
  }
 
  public void testLimitStatefulIter(){
    Discovery[] discs = new Discovery[150];
    for(int i=0; i<150; i++){
      discs[i] = new Discovery("Disc_"+i, LongAutoID_CURIE);
    }
    pm.insert((Object[])discs).get();
   
    QueryAsync<Discovery> query = pm.createQuery(Discovery.class).stateful().order("id");
    SienaFuture<Iterable<Discovery>> future = query.limit(50).iter();
    Iterable<Discovery> iter = future.get();
    Iterator<Discovery> it = iter.iterator();
    int i=0;
    while(it.hasNext()){
      Discovery disc = it.next();
      assertEquals(discs[i++], disc);
   
    assertEquals(50, i);
   
    future = query.iter(50);
    iter = future.get();
    it = iter.iterator();
    i=50;
    while(it.hasNext()){
      Discovery disc = it.next();
      assertEquals(discs[i++], disc);
   
    assertEquals(100, i);
   
    future = query.paginate(50).iter(25);
    iter = future.get();
    it = iter.iterator();
    i=100;
    while(it.hasNext()){
      Discovery disc = it.next();
      assertEquals(discs[i++], disc);
   
    assertEquals(150, i);
  }
 
  public void testOffsetStatelessIter(){
    Discovery[] discs = new Discovery[150];
    for(int i=0; i<150; i++){
      discs[i] = new Discovery("Disc_"+i, LongAutoID_CURIE);
    }
    pm.insert((Object[])discs).get();
   
    QueryAsync<Discovery> query = pm.createQuery(Discovery.class).order("id");
    SienaFuture<Iterable<Discovery>> future = query.offset(50).iter();
    Iterable<Discovery> iter = future.get();
    Iterator<Discovery> it = iter.iterator();
    int i=50;
    while(it.hasNext()){
      Discovery disc = it.next();
      assertEquals(discs[i++], disc);
   
    assertEquals(150, i);
  }
 
  public void testOffsetStatefulIter(){
    Discovery[] discs = new Discovery[150];
    for(int i=0; i<150; i++){
      discs[i] = new Discovery("Disc_"+i, LongAutoID_CURIE);
    }
    pm.insert((Object[])discs).get();
   
    QueryAsync<Discovery> query = pm.createQuery(Discovery.class).stateful().order("id");
    SienaFuture<Iterable<Discovery>> future = query.offset(50).iter();
    Iterable<Discovery> iter = future.get();
    Iterator<Discovery> it = iter.iterator();
    int i=50;
    while(it.hasNext()){
      Discovery disc = it.next();
      assertEquals(discs[i++], disc);
   
    assertEquals(150, i);
  }
 
  public void testOffsetLimitStatelessIter(){
    Discovery[] discs = new Discovery[150];
    for(int i=0; i<150; i++){
      discs[i] = new Discovery("Disc_"+i, LongAutoID_CURIE);
    }
    pm.insert((Object[])discs).get();
   
    QueryAsync<Discovery> query = pm.createQuery(Discovery.class).order("id");
    SienaFuture<Iterable<Discovery>> future = query.offset(50).limit(50).iter();
    Iterable<Discovery> iter = future.get();
    Iterator<Discovery> it = iter.iterator();
    int i=50;
    while(it.hasNext()){
      Discovery disc = it.next();
      assertEquals(discs[i++], disc);
   
    assertEquals(100, i);
  }
 
  public void testOffsetLimitStatefulIter(){
    Discovery[] discs = new Discovery[150];
    for(int i=0; i<150; i++){
      discs[i] = new Discovery("Disc_"+i, LongAutoID_CURIE);
    }
    pm.insert((Object[])discs).get();
   
    QueryAsync<Discovery> query = pm.createQuery(Discovery.class).stateful().order("id");
    SienaFuture<Iterable<Discovery>> future = query.offset(50).limit(50).iter();
    Iterable<Discovery> iter = future.get();
    Iterator<Discovery> it = iter.iterator();
    int i=50;
    while(it.hasNext()){
      Discovery disc = it.next();
      assertEquals(discs[i++], disc);
   
    assertEquals(100, i);
  }
 
  public void testOffsetLimitStatelessPaginateIter(){
    Discovery[] discs = new Discovery[150];
    for(int i=0; i<150; i++){
      discs[i] = new Discovery("Disc_"+i, LongAutoID_CURIE);
    }
    pm.insert((Object[])discs).get();
   
    QueryAsync<Discovery> query = pm.createQuery(Discovery.class).order("id");
    SienaFuture<Iterable<Discovery>> future = query.paginate(50).iter();
    Iterable<Discovery> iter = future.get();
    Iterator<Discovery> it = iter.iterator();
    int i=0;
    while(it.hasNext()){
      Discovery disc = it.next();
      assertEquals(discs[i++], disc);
   
    assertEquals(50, i);
   
    future = query.nextPage().iter();
    iter = future.get();
    it = iter.iterator();
    while(it.hasNext()){
      Discovery disc = it.next();
      assertEquals(discs[i++], disc);
   
    assertEquals(100, i);

    future = query.limit(50).iter();
    iter = future.get();
    it = iter.iterator();
    i=0;
    while(it.hasNext()){
      Discovery disc = it.next();
      assertEquals(discs[i++], disc);
   
    assertEquals(50, i);

    future = query.offset(50).iter();
    iter = future.get();
    it = iter.iterator();
    i=50;
    while(it.hasNext()){
      Discovery disc = it.next();
      assertEquals(discs[i++], disc);
   
    assertEquals(150, i);
   
    future = query.offset(50).limit(50).iter();
    iter = future.get();
    it = iter.iterator();
    i=50;
    while(it.hasNext()){
      Discovery disc = it.next();
      assertEquals(discs[i++], disc);
   
    assertEquals(100, i);

  }
 
  public void testOffsetLimitStatefulPaginateIter(){
    Discovery[] discs = new Discovery[300];
    for(int i=0; i<300; i++){
      discs[i] = new Discovery("Disc_"+i, LongAutoID_CURIE);
    }
    pm.insert((Object[])discs).get();
   
    QueryAsync<Discovery> query = pm.createQuery(Discovery.class).stateful().order("id");
    SienaFuture<Iterable<Discovery>> future = query.paginate(50).iter();
    Iterable<Discovery> iter = future.get();
    Iterator<Discovery> it = iter.iterator();
    int i=0;
    while(it.hasNext()){
      Discovery disc = it.next();
      assertEquals(discs[i++], disc);
   
    assertEquals(50, i);
   
    future = query.nextPage().iter();
    iter = future.get();
    it = iter.iterator();
    while(it.hasNext()){
      Discovery disc = it.next();
      assertEquals(discs[i++], disc);
   
    assertEquals(100, i);

    future = query.limit(50).iter();
    iter = future.get();
    it = iter.iterator();
    i=50;
    while(it.hasNext()){
      Discovery disc = it.next();
      assertEquals(discs[i++], disc);
   
    assertEquals(100, i);

    future = query.offset(50).iter();
    iter = future.get();
    it = iter.iterator();
    i=150;
    while(it.hasNext()){
      Discovery disc = it.next();
      assertEquals(discs[i++], disc);
   
    assertEquals(200, i);
   
    future = query.offset(50).limit(25).iter();
    iter = future.get();
    it = iter.iterator();
    i=250;
    while(it.hasNext()){
      Discovery disc = it.next();
      assertEquals(discs[i++], disc);
   
    assertEquals(275, i);

    try {
      future = query.previousPage().iter();
    }catch(SienaException ex){
      return;
    }
    fail();
  }
 
  public void testOffsetLimitStatelessPaginate2Iter(){
    Discovery[] discs = new Discovery[300];
    for(int i=0; i<300; i++){
      discs[i] = new Discovery("Disc_"+i, LongAutoID_CURIE);
    }
    pm.insert((Object[])discs).get();
   
    QueryAsync<Discovery> query = pm.createQuery(Discovery.class).order("id");
    SienaFuture<Iterable<Discovery>> future = query.limit(50).offset(12).iter();
    Iterable<Discovery> iter = future.get();
    Iterator<Discovery> it = iter.iterator();
    int i=12;
    while(it.hasNext()){
      Discovery disc = it.next();
      assertEquals(discs[i++], disc);
   
    assertEquals(62, i);
   
    future = query.offset(13).limit(30).iter();
    iter = future.get();
    it = iter.iterator();
    i=13;
    while(it.hasNext()){
      Discovery disc = it.next();
      assertEquals(discs[i++], disc);
   
    assertEquals(43, i);
   
    future = query.offset(10).limit(30).iter(15);
    iter = future.get();
    it = iter.iterator();
    i=10;
    while(it.hasNext()){
      Discovery disc = it.next();
      assertEquals(discs[i++], disc);
   
    assertEquals(25, i);

    future = query.paginate(6).iter();
    iter = future.get();
    it = iter.iterator();
    i=0;
    while(it.hasNext()){
      Discovery disc = it.next();
      assertEquals(discs[i++], disc);
   
    assertEquals(6, i);
   
    future = query.nextPage().iter();
    iter = future.get();
    it = iter.iterator();
    i=6;
    while(it.hasNext()){
      Discovery disc = it.next();
      assertEquals(discs[i++], disc);
   
    assertEquals(12, i);
   
    future = query.nextPage().iter();
    iter = future.get();
    it = iter.iterator();
    i=12;
    while(it.hasNext()){
      Discovery disc = it.next();
      assertEquals(discs[i++], disc);
   
    assertEquals(18, i);
   
    future = query.previousPage().iter();
    iter = future.get();
    it = iter.iterator();
    i=6;
    while(it.hasNext()){
      Discovery disc = it.next();
      assertEquals(discs[i++], disc);
   
    assertEquals(12, i);
   
    future = query.offset(10).iter(10);
    iter = future.get();
    it = iter.iterator();
    i=10;
    while(it.hasNext()){
      Discovery disc = it.next();
      assertEquals(discs[i++], disc);
   
    assertEquals(20, i);
   
    try {
      future = query.nextPage().iter();
    }catch(SienaException ex){
      future = query.paginate(8).iter();
      iter = future.get();
      it = iter.iterator();
      i=0;
      while(it.hasNext()){
        Discovery disc = it.next();
        assertEquals(discs[i++], disc);
     
      assertEquals(8, i);
     
      future = query.nextPage().iter();
      iter = future.get();
      it = iter.iterator();
      i=8;
      while(it.hasNext()){
        Discovery disc = it.next();
        assertEquals(discs[i++], disc);
     
      assertEquals(16, i);
     
      return;
    }
    fail();
   
  }
 
  public void testOffsetLimitStatefulPaginate2Iter(){
    Discovery[] discs = new Discovery[300];
    for(int i=0; i<300; i++){
      discs[i] = new Discovery("Disc_"+i, LongAutoID_CURIE);
    }
    pm.insert((Object[])discs).get();
   
    QueryAsync<Discovery> query = pm.createQuery(Discovery.class).stateful().order("id");
    SienaFuture<Iterable<Discovery>> future = query.limit(50).offset(12).iter();
    Iterable<Discovery> iter = future.get();
    Iterator<Discovery> it = iter.iterator();
    int i=12;
    while(it.hasNext()){
      Discovery disc = it.next();
      assertEquals(discs[i++], disc);
   
    assertEquals(62, i);
   
    future = query.offset(13).limit(30).iter();
    iter = future.get();
    it = iter.iterator();
    i=75;
    while(it.hasNext()){
      Discovery disc = it.next();
      assertEquals(discs[i++], disc);
   
    assertEquals(105, i);
   
    future = query.offset(10).limit(30).iter(15);
    iter = future.get();
    it = iter.iterator();
    i=115;
    while(it.hasNext()){
      Discovery disc = it.next();
      assertEquals(discs[i++], disc);
   
    assertEquals(130, i);

    future = query.paginate(6).iter();
    iter = future.get();
    it = iter.iterator();
    i=130;
    while(it.hasNext()){
      Discovery disc = it.next();
      assertEquals(discs[i++], disc);
   
    assertEquals(136, i);
   
    future = query.nextPage().iter();
    iter = future.get();
    it = iter.iterator();
    i=136;
    while(it.hasNext()){
      Discovery disc = it.next();
      assertEquals(discs[i++], disc);
   
    assertEquals(142, i);
   
    future = query.nextPage().iter();
    iter = future.get();
    it = iter.iterator();
    i=142;
    while(it.hasNext()){
      Discovery disc = it.next();
      assertEquals(discs[i++], disc);
   
    assertEquals(148, i);
   
    future = query.previousPage().iter();
    iter = future.get();
    it = iter.iterator();
    i=136;
    while(it.hasNext()){
      Discovery disc = it.next();
      assertEquals(discs[i++], disc);
   
    assertEquals(142, i);
   
    future = query.offset(10).iter(10);
    iter = future.get();
    it = iter.iterator();
    i=146;
    while(it.hasNext()){
      Discovery disc = it.next();
      assertEquals(discs[i++], disc);
   
    assertEquals(156, i);
   
    try {
      future = query.nextPage().iter();
    }catch(SienaException ex){
      future = query.paginate(8).iter();
      iter = future.get();
      it = iter.iterator();
      i=156;
      while(it.hasNext()){
        Discovery disc = it.next();
        assertEquals(discs[i++], disc);
     
      assertEquals(164, i);
     
      future = query.nextPage().iter();
      iter = future.get();
      it = iter.iterator();
      i=164;
      while(it.hasNext()){
        Discovery disc = it.next();
        assertEquals(discs[i++], disc);
     
      assertEquals(172, i);
     
      return;
    }
    fail();
   
  }
 
  public void testFetchPaginateStatelessTwiceIter() {
    Discovery[] discs = new Discovery[15];
    for(int i=0; i<15; i++){
      discs[i] = new Discovery("Disc_"+i, LongAutoID_CURIE);
    }
    pm.insert((Object[])discs).get();

    QueryAsync<Discovery> query = pm.createQuery(Discovery.class).paginate(5).order("id");
    SienaFuture<Iterable<Discovery>> future = query.iter();
    Iterable<Discovery> iter = future.get();
    Iterator<Discovery> it = iter.iterator();
    int i=0;
    while(it.hasNext()){
      Discovery disc = it.next();
      assertEquals(discs[i++], disc);
   
    assertEquals(5, i);
   
    future = query.nextPage().iter();
    iter = future.get();
    it = iter.iterator();
    i=5;
    while(it.hasNext()){
      Discovery disc = it.next();
      assertEquals(discs[i++], disc);
   
    assertEquals(10, i);
   
    future = query.paginate(8).iter();
    iter = future.get();
    it = iter.iterator();
    i=0;
    while(it.hasNext()){
      Discovery disc = it.next();
      assertEquals(discs[i++], disc);
   
    assertEquals(8, i);
   
    future = query.nextPage().iter();
    iter = future.get();
    it = iter.iterator();
    i=8;
    while(it.hasNext()){
      Discovery disc = it.next();
      assertEquals(discs[i++], disc);
   
    assertEquals(15, i);
  }
 
  public void testFetchPaginateStatefulTwiceIter() {
    Discovery[] discs = new Discovery[15];
    for(int i=0; i<15; i++){
      discs[i] = new Discovery("Disc_"+i, LongAutoID_CURIE);
    }
    pm.insert((Object[])discs).get();

    QueryAsync<Discovery> query = pm.createQuery(Discovery.class).stateful().paginate(5).order("id");
    SienaFuture<Iterable<Discovery>> future = query.iter();
    Iterable<Discovery> iter = future.get();
    Iterator<Discovery> it = iter.iterator();
    int i=0;
    while(it.hasNext()){
      Discovery disc = it.next();
      assertEquals(discs[i++], disc);
   
    assertEquals(5, i);
   
    future = query.nextPage().iter();
    iter = future.get();
    it = iter.iterator();
    i=5;
    while(it.hasNext()){
      Discovery disc = it.next();
      assertEquals(discs[i++], disc);
   
    assertEquals(10, i);
   
    future = query.paginate(8).iter();
    iter = future.get();
    it = iter.iterator();
    i=5;
    while(it.hasNext()){
      Discovery disc = it.next();
      assertEquals(discs[i++], disc);
   
    assertEquals(13, i);
   
    future = query.nextPage().iter();
    iter = future.get();
    it = iter.iterator();
    i=13;
    while(it.hasNext()){
      Discovery disc = it.next();
      assertEquals(discs[i++], disc);
   
    assertEquals(15, i);
  }
 
  public void testLimitStatelessRealAsync(){
    Discovery[] discs = new Discovery[150];
    for(int i=0; i<150; i++){
      discs[i] = new Discovery("Disc_"+i, LongAutoID_CURIE);
    }
    pm.insert((Object[])discs).get();
   
    QueryAsync<Discovery> query = pm.createQuery(Discovery.class).stateless().order("id");
    SienaFuture<List<Discovery>> future1 = query.limit(50).fetch();
    SienaFuture<List<Discovery>> future2 = query.offset(50).fetch();
    SienaFuture<List<Discovery>> future21 = query.limit(70).offset(30).fetch();
    SienaFuture<List<Discovery>> future3 = query.fetch(50);
    SienaFuture<List<Discovery>> future4 = query.paginate(50).fetch();
    SienaFuture<List<Discovery>> future5 = query.nextPage().fetch();
    SienaFuture<List<Discovery>> future6 = query.nextPage().fetch();
    SienaFuture<List<Discovery>> future7 = query.previousPage().fetch();

    List<Discovery> res = future1.get();
    assertEquals(50, res.size());
    for(int i=0; i<50; i++){
      assertEquals(discs[i], res.get(i));
    }
   
    res = future2.get();
    assertEquals(100, res.size());
    for(int i=0; i<100; i++){
      assertEquals(discs[i+50], res.get(i));
    }
       
    res = future21.get();
    assertEquals(70, res.size());
    for(int i=0; i<70; i++){
      assertEquals(discs[i+30], res.get(i));
    }
   
    res = future3.get();
    assertEquals(50, res.size());
    for(int i=0; i<50; i++){
      assertEquals(discs[i], res.get(i));
    }
   
    res = future4.get();
    assertEquals(50, res.size());
    for(int i=0; i<50; i++){
      assertEquals(discs[i], res.get(i));
    }
   
    res = future5.get();
    assertEquals(50, res.size());
    for(int i=0; i<50; i++){
      assertEquals(discs[i+50], res.get(i));
    }
   
    res = future6.get();
    assertEquals(50, res.size());
    for(int i=0; i<50; i++){
      assertEquals(discs[i+100], res.get(i));
    }
   
    res = future7.get();
    assertEquals(50, res.size());
    for(int i=0; i<50; i++){
      assertEquals(discs[i+50], res.get(i));
    }   
  }
 
  public void testLimitStatefulRealAsync(){
    Discovery[] discs = new Discovery[320];
    for(int i=0; i<320; i++){
      discs[i] = new Discovery("Disc_"+i, LongAutoID_CURIE);
    }
    pm.insert((Object[])discs).get();
   
    QueryAsync<Discovery> query = pm.createQuery(Discovery.class).stateful().order("id");
    SienaFuture<List<Discovery>> future1 = query.limit(50).fetch();
    SienaFuture<List<Discovery>> future2 = query.offset(5).fetch(5);
    SienaFuture<List<Discovery>> future21 = query.limit(70).offset(30).fetch();
    SienaFuture<List<Discovery>> future3 = query.fetch(50);
    SienaFuture<List<Discovery>> future4 = query.paginate(50).fetch();
    SienaFuture<List<Discovery>> future5 = query.nextPage().fetch();
    SienaFuture<List<Discovery>> future6 = query.nextPage().fetch();
    SienaFuture<List<Discovery>> future7 = query.previousPage().fetch();

    List<Discovery> res = future1.get();
    assertEquals(50, res.size());
    for(int i=0; i<50; i++){
      assertEquals(discs[i], res.get(i));
    }
   
    res = future2.get();
    assertEquals(5, res.size());
    for(int i=0; i<5; i++){
      assertEquals(discs[i+55], res.get(i));
    }
    // 60   
    res = future21.get();
    assertEquals(70, res.size());
    for(int i=0; i<70; i++){
      assertEquals(discs[i+90], res.get(i));
    }
    // 160
    res = future3.get();
    assertEquals(50, res.size());
    for(int i=0; i<50; i++){
      assertEquals(discs[i+160], res.get(i));
    }
   
    res = future4.get();
    assertEquals(50, res.size());
    for(int i=0; i<50; i++){
      assertEquals(discs[i+210], res.get(i));
    }
   
    res = future5.get();
    assertEquals(50, res.size());
    for(int i=0; i<50; i++){
      assertEquals(discs[i+260], res.get(i));
    }
   
    res = future6.get();
    assertEquals(10, res.size());
    for(int i=0; i<10; i++){
      assertEquals(discs[i+310], res.get(i));
    }
   
    res = future7.get();
    assertEquals(50, res.size());
    for(int i=0; i<50; i++){
      assertEquals(discs[i+260], res.get(i));
    }   
  }
 
  public void testFetchStringAutoInc() {
    PersonStringAutoIncID person = new PersonStringAutoIncID("TEST1", "TEST2", "TEST3", "TEST4", 123);
   
    pm.insert(person).get();
   
    SienaFuture<List<PersonStringAutoIncID>> future = pm.getByKeys(PersonStringAutoIncID.class, "TEST1");
    List<PersonStringAutoIncID> l = future.get();
    assertEquals(person, l.get(0));
  }
 
  public void testInsertObjectWithNullJoinObject() {
    Discovery4Join model = new Discovery4Join();
    model.discovererJoined = null; // explicitly set the join object to null

    pm.insert(model).get();

    QueryAsync<Discovery4Join> query = pm.createQuery(Discovery4Join.class)
        .filter("id", model.id);
    Discovery4Join modelFromDatabase = pm.get(query).get();
    assertNull(modelFromDatabase.discovererJoined);
  }

  public void testInsertObjectWithDoubleNullJoinObject() {
    Discovery4Join2 model = new Discovery4Join2();
    model.discovererJoined = null; // explicitly set the join object to null
    model.discovererJoined2 = null; // explicitly set the join object to
                    // null

    pm.insert(model).get();

    QueryAsync<Discovery4Join2> query = pm.createQuery(Discovery4Join2.class)
        .filter("id", model.id);
    Discovery4Join2 modelFromDatabase = pm.get(query).get();
    assertNull(modelFromDatabase.discovererJoined);
    assertNull(modelFromDatabase.discovererJoined2);
  }

  public void testJoinAnnotationDouble() {
    Discovery4Join2 radioactivity = new Discovery4Join2("Radioactivity",
        LongAutoID_CURIE, LongAutoID_TESLA);
    Discovery4Join2 relativity = new Discovery4Join2("Relativity",
        LongAutoID_EINSTEIN, LongAutoID_TESLA);
    Discovery4Join2 foo = new Discovery4Join2("Foo", LongAutoID_EINSTEIN,
        LongAutoID_EINSTEIN);
    Discovery4Join2 teslaCoil = new Discovery4Join2("Tesla Coil",
        LongAutoID_TESLA, LongAutoID_CURIE);

    pm.insert(radioactivity, relativity, foo, teslaCoil).get();

    List<Discovery4Join2> res = pm.createQuery(Discovery4Join2.class)
        .fetch().get();
    assertEquals(4, res.size());
    assertEquals(radioactivity, res.get(0));
    assertEquals(relativity, res.get(1));
    assertEquals(foo, res.get(2));
    assertEquals(teslaCoil, res.get(3));

    assertEquals(LongAutoID_CURIE, res.get(0).discovererJoined);
    assertEquals(LongAutoID_EINSTEIN, res.get(1).discovererJoined);
    assertEquals(LongAutoID_EINSTEIN, res.get(2).discovererJoined);
    assertEquals(LongAutoID_TESLA, res.get(3).discovererJoined);

    assertEquals(LongAutoID_TESLA, res.get(0).discovererJoined2);
    assertEquals(LongAutoID_TESLA, res.get(1).discovererJoined2);
    assertEquals(LongAutoID_EINSTEIN, res.get(2).discovererJoined2);
    assertEquals(LongAutoID_CURIE, res.get(3).discovererJoined2);

  }
 
  public void testBatchUpdate() {
    Object[] discs = new Discovery[100];
    for(int i=0; i<100; i++){
      discs[i] = new Discovery("Disc_"+i, LongAutoID_CURIE);
    }
    pm.insert(discs).get();

    List<Discovery> res =
      pm.createQuery(Discovery.class).fetch().get();
   
    assertEquals(discs.length, res.size());
   
    for(int i=0; i<100; i++){
      ((Discovery)discs[i]).discoverer = LongAutoID_EINSTEIN;
    }
   
    int nb = pm.update(discs).get();
    assertEquals(discs.length, nb);
    res =
      pm.createQuery(Discovery.class).fetch().get();
    int i=0;
    for(Discovery disc:res){
      assertEquals(discs[i++], disc);
    }
   
  }
 
  public void testBatchUpdateList() {
    List<Discovery> discs = new ArrayList<Discovery>();
    for(int i=0; i<100; i++){
      discs.add(new Discovery("Disc_"+i, LongAutoID_CURIE));
    }
    int nb = pm.insert(discs).get();
    assertEquals(discs.size(), nb);

    List<Discovery> res =
      pm.createQuery(Discovery.class).fetch().get();
   
    assertEquals(discs.size(), res.size());
   
    for(Discovery d: discs){
      d.discoverer = LongAutoID_EINSTEIN;
    }
   
    nb = pm.update(discs).get();
    assertEquals(discs.size(), nb);
    res =
      pm.createQuery(Discovery.class).fetch().get();
    int i=0;
    for(Discovery disc:res){
      assertEquals(discs.get(i++), disc);
    }
   
  }
 
 
  public void testIterPerPageStateless(){
    Discovery[] discs = new Discovery[500];
    for(int i=0; i<500; i++){
      discs[i] = new Discovery("Disc_"+i, LongAutoID_CURIE);
    }
    pm.insert((Object[])discs).get();
   
    QueryAsync<Discovery> query = pm.createQuery(Discovery.class).order("id");
    SienaFuture<Iterable<Discovery>> iter = query.iterPerPage(50);
    int i=0;
    for(Discovery disc: iter.get()){
      assertEquals(discs[i++], disc);
   
    assertEquals(500, i)
  }
 
  public void testIterPerPageStateless2(){
    Discovery[] discs = new Discovery[500];
    for(int i=0; i<500; i++){
      discs[i] = new Discovery("Disc_"+i, LongAutoID_CURIE);
    }
    pm.insert((Object[])discs).get();
   
    QueryAsync<Discovery> query = pm.createQuery(Discovery.class).order("id");
    SienaFuture<Iterable<Discovery>> iter = query.iterPerPage(50);
    Iterator<Discovery> it = iter.get().iterator();
    int i=0;
    while(it.hasNext()){
      assertEquals(discs[i++], it.next());
   
    assertEquals(500, i)
  }
 
  public void testIterPerPageStateless3(){
    Discovery[] discs = new Discovery[500];
    for(int i=0; i<500; i++){
      discs[i] = new Discovery("Disc_"+i, LongAutoID_CURIE);
    }
    pm.insert((Object[])discs).get();
   
    QueryAsync<Discovery> query = pm.createQuery(Discovery.class).order("id");
    SienaFuture<Iterable<Discovery>> iter = query.offset(25).iterPerPage(50);
    Iterator<Discovery> it = iter.get().iterator();
    int i=25;
    while(it.hasNext()){
      assertEquals(discs[i++], it.next());
   
    assertEquals(500, i)
  }
 
  public void testIterPerPageStateful(){
    Discovery[] discs = new Discovery[500];
    for(int i=0; i<500; i++){
      discs[i] = new Discovery("Disc_"+i, LongAutoID_CURIE);
    }
    pm.insert((Object[])discs).get();
   
    QueryAsync<Discovery> query = pm.createQuery(Discovery.class).stateful().order("id");
    SienaFuture<Iterable<Discovery>> iter = query.iterPerPage(50);
    int i=0;
    for(Discovery disc: iter.get()){
      assertEquals(discs[i++], disc);
   
    assertEquals(500, i)
  }
 
  public void testIterPerPageStateful2(){
    Discovery[] discs = new Discovery[500];
    for(int i=0; i<500; i++){
      discs[i] = new Discovery("Disc_"+i, LongAutoID_CURIE);
    }
    pm.insert((Object[])discs).get();
   
    QueryAsync<Discovery> query = pm.createQuery(Discovery.class).stateful().order("id");
    SienaFuture<Iterable<Discovery>> iter = query.iterPerPage(50);
    Iterator<Discovery> it = iter.get().iterator();
    int i=0;
    while(it.hasNext()){
      assertEquals(discs[i++], it.next());
   
    assertEquals(500, i)
  }
 
  public void testIterPerPageStatefull3(){
    Discovery[] discs = new Discovery[500];
    for(int i=0; i<500; i++){
      discs[i] = new Discovery("Disc_"+i, LongAutoID_CURIE);
    }
    pm.insert((Object[])discs).get();
   
    QueryAsync<Discovery> query = pm.createQuery(Discovery.class).stateful().order("id");
    SienaFuture<Iterable<Discovery>> iter = query.offset(25).iterPerPage(50);
    Iterator<Discovery> it = iter.get().iterator();
    int i=25;
    while(it.hasNext()){
      assertEquals(discs[i++], it.next());
   
    assertEquals(500, i)
  }
 
  public void testGetByKeyUUID() {
    PersonUUID curie = pm.getByKey(PersonUUID.class, UUID_CURIE.id).get();
    assertEquals(UUID_CURIE, curie);
  }

  public void testGetByKeyLongAutoID() {
    PersonLongAutoID curie = pm.getByKey(PersonLongAutoID.class, LongAutoID_CURIE.id).get();
    assertEquals(LongAutoID_CURIE, curie);
  }

  public void testGetByKeyLongManualID() {
    PersonLongManualID curie = pm.getByKey(PersonLongManualID.class, LongManualID_CURIE.id).get();
    assertEquals(LongManualID_CURIE, curie);
  }

  public void testGetByKeyStringID() {
    PersonStringID curie = pm.getByKey(PersonStringID.class, StringID_CURIE.id).get();
    assertEquals(StringID_CURIE, curie);
  }
 
  public void testSaveLongAutoID() {
    PersonLongAutoID maxwell = new PersonLongAutoID();
    maxwell.firstName = "James Clerk";
    maxwell.lastName = "Maxwell";
    maxwell.city = "Edinburgh";
    maxwell.n = 4;

    pm.save(maxwell).get();
    assertNotNull(maxwell.id);

    SienaFuture<List<PersonLongAutoID>> future = queryPersonLongAutoIDOrderBy("n", 0, false).fetch();
    List<PersonLongAutoID> people = future.get();
    assertEquals(4, people.size());

    assertEquals(LongAutoID_TESLA, people.get(0));
    assertEquals(LongAutoID_CURIE, people.get(1));
    assertEquals(LongAutoID_EINSTEIN, people.get(2));
    assertEquals(maxwell, people.get(3));
   
    maxwell.firstName = "James Clerk UPD";
    maxwell.lastName = "Maxwell UPD";
    maxwell.city = "Edinburgh UPD";
    maxwell.n = 5;
   
    pm.save(maxwell).get();
    assertNotNull(maxwell.id);
   
    future = queryPersonLongAutoIDOrderBy("n", 0, false).fetch();
    people = future.get();
    assertEquals(4, people.size());

    assertEquals(LongAutoID_TESLA, people.get(0));
    assertEquals(LongAutoID_CURIE, people.get(1));
    assertEquals(LongAutoID_EINSTEIN, people.get(2));
    assertEquals(maxwell, people.get(3));
  }
 
  public void testSaveUUID() {
    PersonUUID maxwell = new PersonUUID();
    maxwell.firstName = "James Clerk";
    maxwell.lastName = "Maxwell";
    maxwell.city = "Edinburgh";
    maxwell.n = 4;

    pm.save(maxwell).get();
    assertNotNull(maxwell.id);

    SienaFuture<List<PersonUUID>> future = queryPersonUUIDOrderBy("n", 0, false).fetch();
    List<PersonUUID> people = future.get();
    assertEquals(4, people.size());

    assertEquals(UUID_TESLA, people.get(0));
    assertEquals(UUID_CURIE, people.get(1));
    assertEquals(UUID_EINSTEIN, people.get(2));
    assertEquals(maxwell, people.get(3));
   
    maxwell.firstName = "James Clerk UPD";
    maxwell.lastName = "Maxwell UPD";
    maxwell.city = "Edinburgh UPD";
    maxwell.n = 5;
   
    pm.save(maxwell).get();
    assertNotNull(maxwell.id);
   
    future = queryPersonUUIDOrderBy("n", 0, false).fetch();
    people = future.get();
    assertEquals(4, people.size());

    assertEquals(UUID_TESLA, people.get(0));
    assertEquals(UUID_CURIE, people.get(1));
    assertEquals(UUID_EINSTEIN, people.get(2));
    assertEquals(maxwell, people.get(3));
  }


  public void testSaveLongManualID() {
    PersonLongManualID maxwell = new PersonLongManualID();
    maxwell.id = 4L;
    maxwell.firstName = "James Clerk";
    maxwell.lastName = "Maxwell";
    maxwell.city = "Edinburgh";
    maxwell.n = 4;

    pm.save(maxwell).get();
    assertEquals((Long)4L, maxwell.id);

    SienaFuture<List<PersonLongManualID>> future = queryPersonLongManualIDOrderBy("n", 0, false).fetch();
    List<PersonLongManualID> people = future.get();
    assertEquals(4, people.size());

    assertEquals(LongManualID_TESLA, people.get(0));
    assertEquals(LongManualID_CURIE, people.get(1));
    assertEquals(LongManualID_EINSTEIN, people.get(2));
    assertEquals(maxwell, people.get(3));
   
    maxwell.firstName = "James Clerk UPD";
    maxwell.lastName = "Maxwell UPD";
    maxwell.city = "Edinburgh UPD";
    maxwell.n = 5;
   
    pm.save(maxwell).get();
    assertEquals((Long)4L, maxwell.id);

    future = queryPersonLongManualIDOrderBy("n", 0, false).fetch();
    people = future.get();
    assertEquals(4, people.size());

    assertEquals(LongManualID_TESLA, people.get(0));
    assertEquals(LongManualID_CURIE, people.get(1));
    assertEquals(LongManualID_EINSTEIN, people.get(2));
    assertEquals(maxwell, people.get(3));
  }
 
  public void testSaveStringID() {
    PersonStringID maxwell = new PersonStringID();
    maxwell.id = "MAXWELL";
    maxwell.firstName = "James Clerk";
    maxwell.lastName = "Maxwell";
    maxwell.city = "Edinburgh";
    maxwell.n = 4;

    pm.save(maxwell).get();
    assertEquals(maxwell.id, "MAXWELL");

    SienaFuture<List<PersonStringID>> future = queryPersonStringIDOrderBy("n", 0, false).fetch();
    List<PersonStringID> people = future.get();
    assertEquals(4, people.size());

    assertEquals(StringID_TESLA, people.get(0));
    assertEquals(StringID_CURIE, people.get(1));
    assertEquals(StringID_EINSTEIN, people.get(2));
    assertEquals(maxwell, people.get(3));

    maxwell.firstName = "James Clerk UPD";
    maxwell.lastName = "Maxwell UPD";
    maxwell.city = "Edinburgh UPD";
    maxwell.n = 5;
   
    pm.save(maxwell).get();
    assertEquals(maxwell.id, "MAXWELL");

    future = queryPersonStringIDOrderBy("n", 0, false).fetch();
    people = future.get();
    assertEquals(4, people.size());

    assertEquals(StringID_TESLA, people.get(0));
    assertEquals(StringID_CURIE, people.get(1));
    assertEquals(StringID_EINSTEIN, people.get(2));
    assertEquals(maxwell, people.get(3));
  }
 
  public void testBatchSave() {
    Object[] discs = new Discovery[100];
    for(int i=0; i<100; i++){
      discs[i] = new Discovery("Disc_"+i, LongAutoID_CURIE);
    }
    pm.save(discs).get();

    SienaFuture<List<Discovery>> future =
      pm.createQuery(Discovery.class).fetch();
    List<Discovery> res = future.get();
    assertEquals(discs.length, res.size());
    int i=0;
    for(Discovery disc:res){
      assertEquals(discs[i++], disc);
    }
   
    for(i=0; i<100; i++){
      ((Discovery)discs[i]).name += "UPD";
      ((Discovery)discs[i]).discoverer = LongAutoID_EINSTEIN;
    }
   
    int nb = pm.save(discs).get();
    assertEquals(discs.length, nb);
    future =
      pm.createQuery(Discovery.class).fetch();
    res = future.get();
    i=0;
    for(Discovery disc:res){
      assertEquals(discs[i++], disc);
    }
   
  }
 
 
  public void testBatchSaveList() {
    List<Discovery> discs = new ArrayList<Discovery>();
    for(int i=0; i<100; i++){
      discs.add(new Discovery("Disc_"+i, LongAutoID_CURIE));
    }
    int nb = pm.insert(discs).get();
    assertEquals(discs.size(), nb);
   
    SienaFuture<List<Discovery>> future =
      pm.createQuery(Discovery.class).fetch();
    List<Discovery> res = future.get();
   
    assertEquals(discs.size(), res.size());
    int i=0;
    for(Discovery disc:res){
      assertEquals(discs.get(i++), disc);
    }
   
    for(i=0; i<100; i++){
      ((Discovery)discs.get(i)).name += "UPD";
      ((Discovery)discs.get(i)).discoverer = LongAutoID_EINSTEIN;
    }
   
    nb = pm.save(discs).get();
    assertEquals(discs.size(), nb);
    future =
      pm.createQuery(Discovery.class).fetch();
    res = future.get();
    i=0;
    for(Discovery disc:res){
      assertEquals(discs.get(i++), disc);
    }
  }
 
  public void testPolymorphic() {
    PolymorphicModel<String> poly = new PolymorphicModel<String>("test");
    pm.insert(poly).get();
   
    PolymorphicModel<String> poly2 = pm.getByKey(PolymorphicModel.class, poly.id).get();
    assertEquals(poly, poly2);
  }
 
  public void testPolymorphic2() {
    List<String> arr = new ArrayList<String>();
    arr.add("alpha");
    arr.add("beta");
    PolymorphicModel<List<String>> poly = new PolymorphicModel<List<String>>(arr);
    pm.insert(poly).get();
   
    PolymorphicModel<List<String>> poly2 = pm.getByKey(PolymorphicModel.class, poly.id).get();
    assertEquals(poly, poly2);
  }
 
  public void testEmbeddedModel() {
    EmbeddedModel embed = new EmbeddedModel();
    embed.id = "embed";
    embed.alpha = "test";
    embed.beta = 123;
    pm.insert(embed).get();
   
    EmbeddedContainerModel container = new EmbeddedContainerModel();
    container.id = "container";
    container.embed = embed;
    pm.insert(container).get();

    EmbeddedContainerModel afterContainer = pm.getByKey(EmbeddedContainerModel.class, container.id).get();
    assertNotNull(afterContainer);
    assertEquals(container.id, afterContainer.id);
    assertNotNull(afterContainer.embed);
    assertEquals(embed.id, afterContainer.embed.id);
    assertEquals(null, afterContainer.embed.alpha);
    assertEquals(embed.beta, afterContainer.embed.beta);
  }

  public void testNoColumn() {
    DiscoveryNoColumn radioactivity = new DiscoveryNoColumn("Radioactivity", LongAutoID_CURIE, LongAutoID_TESLA);
    DiscoveryNoColumn relativity = new DiscoveryNoColumn("Relativity", LongAutoID_EINSTEIN, LongAutoID_TESLA);
    DiscoveryNoColumn foo = new DiscoveryNoColumn("Foo", LongAutoID_EINSTEIN, LongAutoID_EINSTEIN);
    DiscoveryNoColumn teslaCoil = new DiscoveryNoColumn("Tesla Coil", LongAutoID_TESLA, LongAutoID_CURIE);
   
    pm.insert(radioactivity, relativity, foo, teslaCoil).get();
   
    List<DiscoveryNoColumn> res = pm.createQuery(DiscoveryNoColumn.class).fetch().get();
    assertEquals(4, res.size());
    assertEquals(radioactivity, res.get(0));
    assertEquals(relativity, res.get(1));
    assertEquals(foo, res.get(2));
    assertEquals(teslaCoil, res.get(3));
   
    assertEquals(LongAutoID_CURIE, res.get(0).discovererJoined);
    assertEquals(LongAutoID_EINSTEIN, res.get(1).discovererJoined);
    assertEquals(LongAutoID_EINSTEIN, res.get(2).discovererJoined);
    assertEquals(LongAutoID_TESLA, res.get(3).discovererJoined);

    assertEquals(LongAutoID_TESLA.id, res.get(0).discovererNotJoined.id);
    assertEquals(LongAutoID_TESLA.id, res.get(1).discovererNotJoined.id);
    assertEquals(LongAutoID_EINSTEIN.id, res.get(2).discovererNotJoined.id);
    assertEquals(LongAutoID_CURIE.id, res.get(3).discovererNotJoined.id);
   
    assertTrue(res.get(0).discovererNotJoined.isOnlyIdFilled());
    assertTrue(res.get(1).discovererNotJoined.isOnlyIdFilled());
    assertTrue(res.get(2).discovererNotJoined.isOnlyIdFilled());
    assertTrue(res.get(3).discovererNotJoined.isOnlyIdFilled());
  }

  public void testNoColumnMultipleKeys() {
    if(!supportsMultipleKeys()) return;
   
    MultipleKeys mk1 = new MultipleKeys();
    mk1.id1 = "aid1";
    mk1.id2 = "aid2";
    mk1.name = "first";
    mk1.parent = null;
    pm.insert(mk1).get();

    MultipleKeys mk2 = new MultipleKeys();
    mk2.id1 = "bid1";
    mk2.id2 = "bid2";
    mk2.name = "second";
    mk2.parent = null;
    pm.insert(mk2).get();
   
    mk2.parent = mk1;
    pm.update(mk2).get();
   
    DiscoveryNoColumnMultipleKeys disc = new DiscoveryNoColumnMultipleKeys("disc1", mk1, mk2);
    pm.insert(disc);
   
    DiscoveryNoColumnMultipleKeys afterDisc = pm.getByKey(DiscoveryNoColumnMultipleKeys.class, disc.id).get();
    assertNotNull(afterDisc);
    assertEquals("disc1", afterDisc.name);
    assertEquals(mk1.id1, afterDisc.mk1.id1);
    assertEquals(mk1.id2, afterDisc.mk1.id2);
    assertEquals(mk2.id1, afterDisc.mk2.id1);
    assertEquals(mk2.id2, afterDisc.mk2.id2);
  }
}
TOP

Related Classes of siena.base.test.BaseAsyncTest

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.