Package com.orientechnologies.orient.test.database.auto

Source Code of com.orientechnologies.orient.test.database.auto.CRUDObjectPhysicalTest

/*
* Copyright 2010-2012 Luca Garulli (l.garulli--at--orientechnologies.com)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*     http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.orientechnologies.orient.test.database.auto;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.*;

import org.testng.Assert;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Optional;
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;

import com.orientechnologies.common.log.OLogManager;
import com.orientechnologies.orient.core.db.object.OLazyObjectSetInterface;
import com.orientechnologies.orient.core.db.record.ORecordLazyList;
import com.orientechnologies.orient.core.db.record.ORecordLazyMap;
import com.orientechnologies.orient.core.db.record.ORecordLazySet;
import com.orientechnologies.orient.core.db.record.OTrackedList;
import com.orientechnologies.orient.core.db.record.OTrackedMap;
import com.orientechnologies.orient.core.db.record.OTrackedSet;
import com.orientechnologies.orient.core.exception.ODatabaseException;
import com.orientechnologies.orient.core.exception.OQueryParsingException;
import com.orientechnologies.orient.core.exception.OSerializationException;
import com.orientechnologies.orient.core.id.ORID;
import com.orientechnologies.orient.core.id.ORecordId;
import com.orientechnologies.orient.core.metadata.security.OUser;
import com.orientechnologies.orient.core.record.impl.ODocument;
import com.orientechnologies.orient.core.record.impl.ORecordBytes;
import com.orientechnologies.orient.core.sql.query.OSQLSynchQuery;
import com.orientechnologies.orient.core.tx.OTransaction.TXTYPE;
import com.orientechnologies.orient.core.type.tree.OMVRBTreeRIDSet;
import com.orientechnologies.orient.enterprise.channel.binary.OResponseProcessingException;
import com.orientechnologies.orient.object.db.OObjectDatabasePool;
import com.orientechnologies.orient.object.iterator.OObjectIteratorClass;
import com.orientechnologies.orient.object.iterator.OObjectIteratorCluster;
import com.orientechnologies.orient.test.domain.base.*;
import com.orientechnologies.orient.test.domain.business.Account;
import com.orientechnologies.orient.test.domain.business.Address;
import com.orientechnologies.orient.test.domain.business.Child;
import com.orientechnologies.orient.test.domain.business.City;
import com.orientechnologies.orient.test.domain.business.Country;
import com.orientechnologies.orient.test.domain.whiz.Profile;

@Test(groups = { "crud", "object" })
public class CRUDObjectPhysicalTest extends ObjectDBBaseTest {
  protected static final int TOT_RECORDS = 100;
  protected long             startRecordNumber;
  private City               rome        = new City(new Country("Italy"), "Rome");

  @Parameters(value = "url")
  public CRUDObjectPhysicalTest(@Optional String url) {
    super(url);
  }

  @BeforeMethod
  @Override
  public void beforeMethod() throws Exception {
    database.close();
    database = OObjectDatabasePool.global().acquire(url, "admin", "admin");
  }

  @AfterClass
  @Override
  public void afterClass() throws Exception {
    database.close();

    database = createDatabaseInstance(url);
    super.afterClass();
  }

  @Test
  public void create() {
    database.getEntityManager().registerEntityClasses("com.orientechnologies.orient.test.domain.business");
    database.getEntityManager().registerEntityClasses("com.orientechnologies.orient.test.domain.whiz");
    database.getEntityManager().registerEntityClasses("com.orientechnologies.orient.test.domain.base");

    startRecordNumber = database.countClusterElements("Account");

    Account account;

    for (long i = startRecordNumber; i < startRecordNumber + TOT_RECORDS; ++i) {
      account = new Account((int) i, "Bill", "Gates");
      account.setBirthDate(new Date());
      account.setSalary(i + 300.10f);
      account.getAddresses().add(new Address("Residence", rome, "Piazza Navona, 1"));
      database.save(account);
    }
  }

  @Test(dependsOnMethods = "create", expectedExceptions = UnsupportedOperationException.class)
  public void testReleasedPoolDatabase() {
    database.open("admin", "admin");
  }

  @Test(dependsOnMethods = "testReleasedPoolDatabase")
  public void testCreate() {
    Assert.assertEquals(database.countClusterElements("Account") - startRecordNumber, TOT_RECORDS);
  }

  @Test(dependsOnMethods = "testCreate")
  public void testAutoCreateClass() {
    Assert.assertNull(database.getMetadata().getSchema().getClass(Dummy.class.getSimpleName()));

    database.getEntityManager().registerEntityClass(Dummy.class);

    database.countClass(Dummy.class.getSimpleName());

    Assert.assertNotNull(database.getMetadata().getSchema().getClass(Dummy.class.getSimpleName()));
  }

  @Test
  public void testDeletionClassFromSchemaShouldNotLockDatabase() {
    Assert.assertNull(database.getMetadata().getSchema().getClass(DummyForTestFreeze.class.getSimpleName()));

    database.getEntityManager().registerEntityClass(DummyForTestFreeze.class);

    database.countClass(Dummy.class.getSimpleName());

    database.getMetadata().getSchema().dropClass(DummyForTestFreeze.class.getSimpleName());

    Assert.assertNotNull(database.getMetadata().getSchema().getClass(DummyForTestFreeze.class.getSimpleName()));
  }

  @Test
  public void testSimpleTypes() {
    JavaSimpleTestClass javaObj = database.newInstance(JavaSimpleTestClass.class);
    Assert.assertEquals(javaObj.getText(), "initTest");
    Date date = new Date();
    javaObj.setText("test");
    javaObj.setNumberSimple(12345);
    javaObj.setDoubleSimple(12.34d);
    javaObj.setFloatSimple(123.45f);
    javaObj.setLongSimple(12345678l);
    javaObj.setByteSimple((byte) 1);
    javaObj.setFlagSimple(true);
    javaObj.setDateField(date);
    javaObj.setEnumeration(EnumTest.ENUM1);

    JavaSimpleTestClass savedJavaObj = database.save(javaObj);
    ORID id = database.getIdentity(savedJavaObj);
    database.close();

    database = OObjectDatabasePool.global().acquire(url, "admin", "admin");
    JavaSimpleTestClass loadedJavaObj = (JavaSimpleTestClass) database.load(id);
    Assert.assertEquals(loadedJavaObj.getText(), "test");
    Assert.assertEquals(loadedJavaObj.getNumberSimple(), 12345);
    Assert.assertEquals(loadedJavaObj.getDoubleSimple(), 12.34d);
    Assert.assertEquals(loadedJavaObj.getFloatSimple(), 123.45f);
    Assert.assertEquals(loadedJavaObj.getLongSimple(), 12345678l);
    Assert.assertEquals(loadedJavaObj.getByteSimple(), (byte) 1);
    Assert.assertEquals(loadedJavaObj.getFlagSimple(), true);
    Assert.assertEquals(loadedJavaObj.getEnumeration(), EnumTest.ENUM1);
    Assert.assertEquals(loadedJavaObj.getDateField(), date);
    Assert.assertTrue(loadedJavaObj.getTestAnonymous() instanceof JavaTestInterface);
    Assert.assertEquals(loadedJavaObj.getTestAnonymous().getNumber(), -1);
    loadedJavaObj.setEnumeration(EnumTest.ENUM2);
    loadedJavaObj.setTestAnonymous(new JavaTestInterface() {

      @Override
      public int getNumber() {
        return 0;
      }
    });
    database.save(loadedJavaObj);

    database.close();

    database = OObjectDatabasePool.global().acquire(url, "admin", "admin");
    loadedJavaObj = (JavaSimpleTestClass) database.load(id);
    Assert.assertEquals(loadedJavaObj.getEnumeration(), EnumTest.ENUM2);
    Assert.assertTrue(loadedJavaObj.getTestAnonymous() instanceof JavaTestInterface);
    Assert.assertEquals(loadedJavaObj.getTestAnonymous().getNumber(), -1);
  }

  @Test(dependsOnMethods = "testSimpleTypes")
  public void testSimpleArrayTypes() {
    JavaSimpleArraysTestClass javaObj = database.newInstance(JavaSimpleArraysTestClass.class);
    Assert.assertEquals(javaObj.getText()[0], "initTest");
    String[] textArray = new String[10];
    EnumTest[] enumerationArray = new EnumTest[10];
    int[] intArray = new int[10];
    long[] longArray = new long[10];
    double[] doubleArray = new double[10];
    float[] floatArray = new float[10];
    byte[] byteArray = new byte[10];
    boolean[] booleanArray = new boolean[10];
    Date[] dateArray = new Date[10];
    Calendar cal = Calendar.getInstance();
    cal.set(Calendar.SECOND, 0);
    cal.set(Calendar.MINUTE, 0);
    cal.set(Calendar.MILLISECOND, 0);
    cal.set(Calendar.HOUR_OF_DAY, 0);
    cal.set(Calendar.YEAR, 1900);
    cal.set(Calendar.MONTH, Calendar.JANUARY);
    for (int i = 0; i < 10; i++) {
      textArray[i] = i + "";
      intArray[i] = i;
      longArray[i] = i;
      doubleArray[i] = i;
      floatArray[i] = i;
      byteArray[i] = (byte) i;
      booleanArray[i] = (i % 2 == 0);
      enumerationArray[i] = (i % 2 == 0) ? EnumTest.ENUM2 : ((i % 3 == 0) ? EnumTest.ENUM3 : EnumTest.ENUM1);
      cal.set(Calendar.DAY_OF_MONTH, (i + 1));
      dateArray[i] = cal.getTime();
    }
    javaObj.setText(textArray);
    javaObj.setByteSimple(byteArray);
    javaObj.setDateField(dateArray);
    javaObj.setDoubleSimple(doubleArray);
    javaObj.setEnumeration(enumerationArray);
    javaObj.setFlagSimple(booleanArray);
    javaObj.setFloatSimple(floatArray);
    javaObj.setLongSimple(longArray);
    javaObj.setNumberSimple(intArray);

    ODocument doc = database.getRecordByUserObject(javaObj, false);
    Assert.assertNotNull(doc.field("text"));
    Assert.assertNotNull(doc.field("enumeration"));
    Assert.assertNotNull(doc.field("numberSimple"));
    Assert.assertNotNull(doc.field("longSimple"));
    Assert.assertNotNull(doc.field("doubleSimple"));
    Assert.assertNotNull(doc.field("floatSimple"));
    Assert.assertNotNull(doc.field("byteSimple"));
    Assert.assertNotNull(doc.field("flagSimple"));
    Assert.assertNotNull(doc.field("dateField"));

    JavaSimpleArraysTestClass savedJavaObj = database.save(javaObj);
    ORID id = database.getIdentity(savedJavaObj);
    database.close();

    database = OObjectDatabasePool.global().acquire(url, "admin", "admin");
    JavaSimpleArraysTestClass loadedJavaObj = database.load(id);
    doc = database.getRecordByUserObject(loadedJavaObj, false);
    Assert.assertNotNull(doc.field("text"));
    Assert.assertNotNull(doc.field("enumeration"));
    Assert.assertNotNull(doc.field("numberSimple"));
    Assert.assertNotNull(doc.field("longSimple"));
    Assert.assertNotNull(doc.field("doubleSimple"));
    Assert.assertNotNull(doc.field("floatSimple"));
    Assert.assertNotNull(doc.field("byteSimple"));
    Assert.assertNotNull(doc.field("flagSimple"));
    Assert.assertNotNull(doc.field("dateField"));

    Assert.assertEquals(loadedJavaObj.getText().length, 10);
    Assert.assertEquals(loadedJavaObj.getNumberSimple().length, 10);
    Assert.assertEquals(loadedJavaObj.getLongSimple().length, 10);
    Assert.assertEquals(loadedJavaObj.getDoubleSimple().length, 10);
    Assert.assertEquals(loadedJavaObj.getFloatSimple().length, 10);
    Assert.assertEquals(loadedJavaObj.getByteSimple().length, 10);
    Assert.assertEquals(loadedJavaObj.getFlagSimple().length, 10);
    Assert.assertEquals(loadedJavaObj.getEnumeration().length, 10);
    Assert.assertEquals(loadedJavaObj.getDateField().length, 10);

    for (int i = 0; i < 10; i++) {
      Assert.assertEquals(loadedJavaObj.getText()[i], i + "");
      Assert.assertEquals(loadedJavaObj.getNumberSimple()[i], i);
      Assert.assertEquals(loadedJavaObj.getLongSimple()[i], i);
      Assert.assertEquals(loadedJavaObj.getDoubleSimple()[i], (double) i);
      Assert.assertEquals(loadedJavaObj.getFloatSimple()[i], (float) i);
      Assert.assertEquals(loadedJavaObj.getByteSimple()[i], (byte) i);
      Assert.assertEquals(loadedJavaObj.getFlagSimple()[i], (i % 2 == 0));
      EnumTest enumCheck = (i % 2 == 0) ? EnumTest.ENUM2 : ((i % 3 == 0) ? EnumTest.ENUM3 : EnumTest.ENUM1);
      Assert.assertEquals(loadedJavaObj.getEnumeration()[i], enumCheck);
      cal.set(Calendar.DAY_OF_MONTH, (i + 1));
      Assert.assertEquals(loadedJavaObj.getDateField()[i], cal.getTime());
    }

    for (int i = 0; i < 10; i++) {
      int j = i + 10;
      textArray[i] = j + "";
      intArray[i] = j;
      longArray[i] = j;
      doubleArray[i] = j;
      floatArray[i] = j;
      byteArray[i] = (byte) j;
      booleanArray[i] = (j % 2 == 0);
      enumerationArray[i] = (j % 2 == 0) ? EnumTest.ENUM2 : ((j % 3 == 0) ? EnumTest.ENUM3 : EnumTest.ENUM1);
      cal.set(Calendar.DAY_OF_MONTH, (j + 1));
      dateArray[i] = cal.getTime();
    }
    loadedJavaObj.setText(textArray);
    loadedJavaObj.setByteSimple(byteArray);
    loadedJavaObj.setDateField(dateArray);
    loadedJavaObj.setDoubleSimple(doubleArray);
    loadedJavaObj.setEnumeration(enumerationArray);
    loadedJavaObj.setFlagSimple(booleanArray);
    loadedJavaObj.setFloatSimple(floatArray);
    loadedJavaObj.setLongSimple(longArray);
    loadedJavaObj.setNumberSimple(intArray);

    doc = database.getRecordByUserObject(javaObj, false);
    Assert.assertNotNull(doc.field("text"));
    Assert.assertNotNull(doc.field("enumeration"));
    Assert.assertNotNull(doc.field("numberSimple"));
    Assert.assertNotNull(doc.field("longSimple"));
    Assert.assertNotNull(doc.field("doubleSimple"));
    Assert.assertNotNull(doc.field("floatSimple"));
    Assert.assertNotNull(doc.field("byteSimple"));
    Assert.assertNotNull(doc.field("flagSimple"));
    Assert.assertNotNull(doc.field("dateField"));

    loadedJavaObj = database.save(loadedJavaObj);
    database.close();

    database = OObjectDatabasePool.global().acquire(url, "admin", "admin");
    loadedJavaObj = database.load(id);
    doc = database.getRecordByUserObject(loadedJavaObj, false);
    Assert.assertNotNull(doc.field("text"));
    Assert.assertNotNull(doc.field("enumeration"));
    Assert.assertNotNull(doc.field("numberSimple"));
    Assert.assertNotNull(doc.field("longSimple"));
    Assert.assertNotNull(doc.field("doubleSimple"));
    Assert.assertNotNull(doc.field("floatSimple"));
    Assert.assertNotNull(doc.field("byteSimple"));
    Assert.assertNotNull(doc.field("flagSimple"));
    Assert.assertNotNull(doc.field("dateField"));

    Assert.assertEquals(loadedJavaObj.getText().length, 10);
    Assert.assertEquals(loadedJavaObj.getNumberSimple().length, 10);
    Assert.assertEquals(loadedJavaObj.getLongSimple().length, 10);
    Assert.assertEquals(loadedJavaObj.getDoubleSimple().length, 10);
    Assert.assertEquals(loadedJavaObj.getFloatSimple().length, 10);
    Assert.assertEquals(loadedJavaObj.getByteSimple().length, 10);
    Assert.assertEquals(loadedJavaObj.getFlagSimple().length, 10);
    Assert.assertEquals(loadedJavaObj.getEnumeration().length, 10);
    Assert.assertEquals(loadedJavaObj.getDateField().length, 10);

    for (int i = 0; i < 10; i++) {
      int j = i + 10;
      Assert.assertEquals(loadedJavaObj.getText()[i], j + "");
      Assert.assertEquals(loadedJavaObj.getNumberSimple()[i], j);
      Assert.assertEquals(loadedJavaObj.getLongSimple()[i], j);
      Assert.assertEquals(loadedJavaObj.getDoubleSimple()[i], (double) j);
      Assert.assertEquals(loadedJavaObj.getFloatSimple()[i], (float) j);
      Assert.assertEquals(loadedJavaObj.getByteSimple()[i], (byte) j);
      Assert.assertEquals(loadedJavaObj.getFlagSimple()[i], (j % 2 == 0));
      EnumTest enumCheck = (j % 2 == 0) ? EnumTest.ENUM2 : ((j % 3 == 0) ? EnumTest.ENUM3 : EnumTest.ENUM1);
      Assert.assertEquals(loadedJavaObj.getEnumeration()[i], enumCheck);
      cal.set(Calendar.DAY_OF_MONTH, (j + 1));
      Assert.assertEquals(loadedJavaObj.getDateField()[i], cal.getTime());
    }

    database.close();

    database = OObjectDatabasePool.global().acquire(url, "admin", "admin");
    loadedJavaObj = database.load(id);
    doc = database.getRecordByUserObject(loadedJavaObj, false);

    Assert.assertTrue(((Collection<?>) doc.field("text")).iterator().next() instanceof String);
    Assert.assertTrue(((Collection<?>) doc.field("enumeration")).iterator().next() instanceof String);
    Assert.assertTrue(((Collection<?>) doc.field("numberSimple")).iterator().next() instanceof Integer);
    Assert.assertTrue(((Collection<?>) doc.field("longSimple")).iterator().next() instanceof Long);
    Assert.assertTrue(((Collection<?>) doc.field("doubleSimple")).iterator().next() instanceof Double);
    Assert.assertTrue(((Collection<?>) doc.field("floatSimple")).iterator().next() instanceof Float);
    Assert.assertTrue(((Collection<?>) doc.field("byteSimple")).iterator().next() instanceof Byte);
    Assert.assertTrue(((Collection<?>) doc.field("flagSimple")).iterator().next() instanceof Boolean);
    Assert.assertTrue(((Collection<?>) doc.field("dateField")).iterator().next() instanceof Date);

    // TODO - remove this delete to test simple type collections JSON import/export
    database.delete(id);
  }

  @Test(dependsOnMethods = "testSimpleArrayTypes")
  public void collectionsDocumentTypeTestPhaseOne() {
    JavaComplexTestClass a = database.newInstance(JavaComplexTestClass.class);

    for (int i = 0; i < 3; i++) {
      a.getList().add(new Child());
      a.getSet().add(new Child());
      a.getChildren().put("" + i, new Child());
    }
    a = database.save(a);
    ORID rid = database.getIdentity(a);

    database.close();

    database = OObjectDatabasePool.global().acquire(url, "admin", "admin");
    List<JavaComplexTestClass> agendas = database.query(new OSQLSynchQuery<JavaComplexTestClass>("SELECT FROM " + rid));
    JavaComplexTestClass testLoadedEntity = agendas.get(0);

    ODocument doc = database.getRecordByUserObject(testLoadedEntity, false);

    checkCollectionImplementations(doc);

    testLoadedEntity = database.save(testLoadedEntity);

    database.freeze(false);
    database.release();

    testLoadedEntity = database.reload(testLoadedEntity, "*:-1", true);

    doc = database.getRecordByUserObject(testLoadedEntity, false);

    checkCollectionImplementations(doc);
  }

  @Test(dependsOnMethods = "collectionsDocumentTypeTestPhaseOne")
  public void collectionsDocumentTypeTestPhaseTwo() {
    JavaComplexTestClass a = database.newInstance(JavaComplexTestClass.class);

    for (int i = 0; i < 10; i++) {
      a.getList().add(new Child());
      a.getSet().add(new Child());
      a.getChildren().put("" + i, new Child());
    }
    a = database.save(a);
    ORID rid = database.getIdentity(a);

    database.close();

    database = OObjectDatabasePool.global().acquire(url, "admin", "admin");
    List<JavaComplexTestClass> agendas = database.query(new OSQLSynchQuery<JavaComplexTestClass>("SELECT FROM " + rid));
    JavaComplexTestClass testLoadedEntity = agendas.get(0);

    ODocument doc = database.getRecordByUserObject(testLoadedEntity, false);
    checkCollectionImplementations(doc);

    testLoadedEntity = database.save(testLoadedEntity);

    database.freeze(false);
    database.release();

    testLoadedEntity = database.reload(testLoadedEntity, "*:-1", true);

    doc = database.getRecordByUserObject(testLoadedEntity, false);

    checkCollectionImplementations(doc);
  }

  @Test(dependsOnMethods = "collectionsDocumentTypeTestPhaseTwo")
  public void collectionsDocumentTypeTestPhaseThree() {
    JavaComplexTestClass a = database.newInstance(JavaComplexTestClass.class);

    for (int i = 0; i < 100; i++) {
      a.getList().add(new Child());
      a.getSet().add(new Child());
      a.getChildren().put("" + i, new Child());
    }
    a = database.save(a);
    ORID rid = database.getIdentity(a);

    database.close();

    database = OObjectDatabasePool.global().acquire(url, "admin", "admin");
    List<JavaComplexTestClass> agendas = database.query(new OSQLSynchQuery<JavaComplexTestClass>("SELECT FROM " + rid));
    JavaComplexTestClass testLoadedEntity = agendas.get(0);

    ODocument doc = database.getRecordByUserObject(testLoadedEntity, false);
    checkCollectionImplementations(doc);

    testLoadedEntity = database.save(testLoadedEntity);

    database.freeze(false);
    database.release();

    testLoadedEntity = database.reload(testLoadedEntity, "*:-1", true);

    doc = database.getRecordByUserObject(testLoadedEntity, false);

    checkCollectionImplementations(doc);
  }

  protected boolean checkCollectionImplementations(ODocument doc) {
    Object collectionObj = doc.field("list");
    boolean validImplementation = (collectionObj instanceof OTrackedList<?>) || (doc.field("list") instanceof ORecordLazyList);
    if (!validImplementation) {
      Assert.fail("Document list implementation " + collectionObj.getClass().getName()
          + " not compatible with current Object Database loading management");
    }
    collectionObj = doc.field("set");
    validImplementation = (collectionObj instanceof OTrackedSet<?>) || (collectionObj instanceof ORecordLazySet)
        || (collectionObj instanceof OMVRBTreeRIDSet);
    if (!validImplementation) {
      Assert.fail("Document set implementation " + collectionObj.getClass().getName()
          + " not compatible with current Object Database management");
    }
    collectionObj = doc.field("children");
    validImplementation = (collectionObj instanceof OTrackedMap<?>) || (collectionObj instanceof ORecordLazyMap);
    if (!validImplementation) {
      Assert.fail("Document map implementation " + collectionObj.getClass().getName()
          + " not compatible with current Object Database management");
    }
    return validImplementation;
  }

  @Test(dependsOnMethods = "testSimpleTypes")
  public void testDateInTransaction() {
    JavaSimpleTestClass javaObj = new JavaSimpleTestClass();
    Date date = new Date();
    javaObj.setDateField(date);
    database.begin(TXTYPE.OPTIMISTIC);
    JavaSimpleTestClass dbEntry = database.save(javaObj);
    database.commit();
    database.detachAll(dbEntry, false);
    Assert.assertEquals(dbEntry.getDateField(), date);
  }

  @Test(dependsOnMethods = "testAutoCreateClass")
  public void readAndBrowseDescendingAndCheckHoleUtilization() {
    database.getLocalCache().invalidate();

    // BROWSE ALL THE OBJECTS

    Set<Integer> ids = new HashSet<Integer>(TOT_RECORDS);
    for (int i = 0; i < TOT_RECORDS; i++)
      ids.add(i);

    for (Account a : database.browseClass(Account.class)) {
      int id = a.getId();
      Assert.assertTrue(ids.remove(id));

      Assert.assertEquals(a.getId(), id);
      Assert.assertEquals(a.getName(), "Bill");
      Assert.assertEquals(a.getSurname(), "Gates");
      Assert.assertEquals(a.getSalary(), id + 300.1f);
      Assert.assertEquals(a.getAddresses().size(), 1);
      Assert.assertEquals(a.getAddresses().get(0).getCity().getName(), rome.getName());
      Assert.assertEquals(a.getAddresses().get(0).getCity().getCountry().getName(), rome.getCountry().getName());
    }

    Assert.assertTrue(ids.isEmpty());
  }

  @Test(dependsOnMethods = "testAutoCreateClass")
  public void synchQueryCollectionsFetch() {
    database.getLocalCache().invalidate();

    // BROWSE ALL THE OBJECTS
    Set<Integer> ids = new HashSet<Integer>(TOT_RECORDS);
    for (int i = 0; i < TOT_RECORDS; i++)
      ids.add(i);

    List<Account> result = database.query(new OSQLSynchQuery<Account>("select from Account").setFetchPlan("*:-1"));
    for (Account a : result) {
      int id = a.getId();
      Assert.assertTrue(ids.remove(id));

      Assert.assertEquals(a.getId(), id);
      Assert.assertEquals(a.getName(), "Bill");
      Assert.assertEquals(a.getSurname(), "Gates");
      Assert.assertEquals(a.getSalary(), id + 300.1f);
      Assert.assertEquals(a.getAddresses().size(), 1);
      Assert.assertEquals(a.getAddresses().get(0).getCity().getName(), rome.getName());
      Assert.assertEquals(a.getAddresses().get(0).getCity().getCountry().getName(), rome.getCountry().getName());
    }

    Assert.assertTrue(ids.isEmpty());
  }

  @Test(dependsOnMethods = "testAutoCreateClass")
  public void synchQueryCollectionsFetchNoLazyLoad() {
    database.getLocalCache().invalidate();
    database.setLazyLoading(false);

    // BROWSE ALL THE OBJECTS
    Set<Integer> ids = new HashSet<Integer>(TOT_RECORDS);
    for (int i = 0; i < TOT_RECORDS; i++)
      ids.add(i);

    List<Account> result = database.query(new OSQLSynchQuery<Account>("select from Account").setFetchPlan("*:2"));
    for (Account a : result) {
      int id = a.getId();
      Assert.assertTrue(ids.remove(id));

      Assert.assertEquals(a.getId(), id);
      Assert.assertEquals(a.getName(), "Bill");
      Assert.assertEquals(a.getSurname(), "Gates");
      Assert.assertEquals(a.getSalary(), id + 300.1f);
      Assert.assertEquals(a.getAddresses().size(), 1);
      Assert.assertEquals(a.getAddresses().get(0).getCity().getName(), rome.getName());
      Assert.assertEquals(a.getAddresses().get(0).getCity().getCountry().getName(), rome.getCountry().getName());
    }

    Assert.assertTrue(ids.isEmpty());
  }

  @Test(dependsOnMethods = "readAndBrowseDescendingAndCheckHoleUtilization")
  public void mapEnumAndInternalObjects() {
    // BROWSE ALL THE OBJECTS
    for (OUser u : database.browseClass(OUser.class)) {
      u.save();
    }
  }

  @Test(dependsOnMethods = "mapEnumAndInternalObjects")
  public void mapObjectsLinkTest() {
    JavaComplexTestClass p = database.newInstance(JavaComplexTestClass.class);
    p.setName("Silvester");

    Child c = database.newInstance(Child.class);
    c.setName("John");

    Child c1 = database.newInstance(Child.class);
    c1.setName("Jack");

    Child c2 = database.newInstance(Child.class);
    c2.setName("Bob");

    Child c3 = database.newInstance(Child.class);
    c3.setName("Sam");

    Child c4 = database.newInstance(Child.class);
    c4.setName("Dean");

    p.getList().add(c1);
    p.getList().add(c2);
    p.getList().add(c3);
    p.getList().add(c4);

    p.getChildren().put("first", c);

    p.getEnumList().add(EnumTest.ENUM1);
    p.getEnumList().add(EnumTest.ENUM2);

    p.getEnumSet().add(EnumTest.ENUM1);
    p.getEnumSet().add(EnumTest.ENUM3);

    p.getEnumMap().put("1", EnumTest.ENUM2);
    p.getEnumMap().put("2", EnumTest.ENUM3);

    database.save(p);

    List<Child> cresult = database.query(new OSQLSynchQuery<Child>("select * from Child"));

    Assert.assertTrue(cresult.size() > 0);

    ORID rid = new ORecordId(p.getId());

    database.close();

    database = OObjectDatabasePool.global().acquire(url, "admin", "admin");
    JavaComplexTestClass loaded = database.load(rid);

    Assert.assertEquals(loaded.getList().size(), 4);
    Assert.assertTrue(loaded.getList().get(0) instanceof Child);
    Assert.assertTrue(loaded.getList().get(1) instanceof Child);
    Assert.assertTrue(loaded.getList().get(2) instanceof Child);
    Assert.assertTrue(loaded.getList().get(3) instanceof Child);
    Assert.assertEquals(loaded.getList().get(0).getName(), "Jack");
    Assert.assertEquals(loaded.getList().get(1).getName(), "Bob");
    Assert.assertEquals(loaded.getList().get(2).getName(), "Sam");
    Assert.assertEquals(loaded.getList().get(3).getName(), "Dean");

    Assert.assertEquals(loaded.getEnumList().size(), 2);
    Assert.assertEquals(loaded.getEnumList().get(0), EnumTest.ENUM1);
    Assert.assertEquals(loaded.getEnumList().get(1), EnumTest.ENUM2);

    Assert.assertEquals(loaded.getEnumSet().size(), 2);
    Iterator<EnumTest> it = loaded.getEnumSet().iterator();
    Assert.assertEquals(it.next(), EnumTest.ENUM1);
    Assert.assertEquals(it.next(), EnumTest.ENUM3);

    Assert.assertEquals(loaded.getEnumMap().size(), 2);
    Assert.assertEquals(loaded.getEnumMap().get("1"), EnumTest.ENUM2);
    Assert.assertEquals(loaded.getEnumMap().get("2"), EnumTest.ENUM3);
  }

  @Test(dependsOnMethods = "mapObjectsLinkTest")
  public void listObjectsLinkTest() {
    PersonTest hanSolo = database.newInstance(PersonTest.class);
    hanSolo.setFirstname("Han");
    hanSolo = database.save(hanSolo);

    PersonTest obiWan = database.newInstance(PersonTest.class);
    obiWan.setFirstname("Obi-Wan");
    obiWan = database.save(obiWan);

    PersonTest luke = database.newInstance(PersonTest.class);
    luke.setFirstname("Luke");
    luke = database.save(luke);

    // ============================== step 1
    // add new information to luke
    luke.addFriend(hanSolo);
    database.save(luke);
    Assert.assertTrue(luke.getFriends().size() == 1);
    // ============================== end 1

    // ============================== step 2
    // add new information to luke
    HashSet<PersonTest> friends = new HashSet<PersonTest>();
    friends.add(obiWan);
    luke.setFriends(friends);
    database.save(luke);
    Assert.assertTrue(luke.getFriends().size() == 1);
    // ============================== end 2
  }

  @Test(dependsOnMethods = "listObjectsLinkTest")
  public void listObjectsIterationTest() {
    Agenda a = database.newInstance(Agenda.class);

    for (int i = 0; i < 10; i++) {
      a.getEvents().add(database.newInstance(Event.class));
    }
    a = database.save(a);
    ORID rid = database.getIdentity(a);

    database.close();

    database = OObjectDatabasePool.global().acquire(url, "admin", "admin");
    List<Agenda> agendas = database.query(new OSQLSynchQuery<Agenda>("SELECT FROM " + rid));
    Agenda agenda = agendas.get(0);
    for (Event e : agenda.getEvents()) {
      // NO NEED TO DO ANYTHING, JUST NEED TO ITERATE THE LIST
    }

    agenda = database.save(agenda);

    database.freeze(false);
    database.release();

    agenda = database.reload(agenda, "*:-1", true);

    try {
      agenda.getEvents();
      agenda.getEvents().size();
      for (int i = 0; i < agenda.getEvents().size(); i++) {
        Event e = agenda.getEvents().get(i);
        // NO NEED TO DO ANYTHING, JUST NEED TO ITERATE THE LIST
      }
    } catch (ConcurrentModificationException cme) {
      Assert.fail("Error iterating Object list", cme);
    }
  }

  @Test(dependsOnMethods = "listObjectsIterationTest")
  public void mapObjectsListEmbeddedTest() {
    List<Child> cresult = database.query(new OSQLSynchQuery<Child>("select * from Child"));

    int childSize = cresult.size();

    JavaComplexTestClass p = database.newInstance(JavaComplexTestClass.class);
    p.setName("Silvester");

    Child c = database.newInstance(Child.class);
    c.setName("John");

    Child c1 = database.newInstance(Child.class);
    c1.setName("Jack");

    Child c2 = database.newInstance(Child.class);
    c2.setName("Bob");

    Child c3 = database.newInstance(Child.class);
    c3.setName("Sam");

    Child c4 = database.newInstance(Child.class);
    c4.setName("Dean");

    p.getEmbeddedList().add(c1);
    p.getEmbeddedList().add(c2);
    p.getEmbeddedList().add(c3);
    p.getEmbeddedList().add(c4);

    database.save(p);

    cresult = database.query(new OSQLSynchQuery<Child>("select * from Child"));

    Assert.assertTrue(cresult.size() == childSize);

    ORID rid = new ORecordId(p.getId());

    database.close();

    database = OObjectDatabasePool.global().acquire(url, "admin", "admin");
    JavaComplexTestClass loaded = database.load(rid);

    Assert.assertEquals(loaded.getEmbeddedList().size(), 4);
    Assert.assertTrue(database.getRecordByUserObject(loaded.getEmbeddedList().get(0), false).isEmbedded());
    Assert.assertTrue(database.getRecordByUserObject(loaded.getEmbeddedList().get(1), false).isEmbedded());
    Assert.assertTrue(database.getRecordByUserObject(loaded.getEmbeddedList().get(2), false).isEmbedded());
    Assert.assertTrue(database.getRecordByUserObject(loaded.getEmbeddedList().get(3), false).isEmbedded());
    Assert.assertTrue(loaded.getEmbeddedList().get(0) instanceof Child);
    Assert.assertTrue(loaded.getEmbeddedList().get(1) instanceof Child);
    Assert.assertTrue(loaded.getEmbeddedList().get(2) instanceof Child);
    Assert.assertTrue(loaded.getEmbeddedList().get(3) instanceof Child);
    Assert.assertEquals(loaded.getEmbeddedList().get(0).getName(), "Jack");
    Assert.assertEquals(loaded.getEmbeddedList().get(1).getName(), "Bob");
    Assert.assertEquals(loaded.getEmbeddedList().get(2).getName(), "Sam");
    Assert.assertEquals(loaded.getEmbeddedList().get(3).getName(), "Dean");
  }

  @Test(dependsOnMethods = "mapObjectsListEmbeddedTest")
  public void mapObjectsSetEmbeddedTest() {
    List<Child> cresult = database.query(new OSQLSynchQuery<Child>("select * from Child"));

    int childSize = cresult.size();

    JavaComplexTestClass p = database.newInstance(JavaComplexTestClass.class);
    p.setName("Silvester");

    Child c = database.newInstance(Child.class);
    c.setName("John");

    Child c1 = database.newInstance(Child.class);
    c1.setName("Jack");

    Child c2 = database.newInstance(Child.class);
    c2.setName("Bob");

    Child c3 = database.newInstance(Child.class);
    c3.setName("Sam");

    Child c4 = database.newInstance(Child.class);
    c4.setName("Dean");

    p.getEmbeddedSet().add(c);
    p.getEmbeddedSet().add(c1);
    p.getEmbeddedSet().add(c2);
    p.getEmbeddedSet().add(c3);
    p.getEmbeddedSet().add(c4);

    database.save(p);

    cresult = database.query(new OSQLSynchQuery<Child>("select * from Child"));

    Assert.assertTrue(cresult.size() == childSize);

    ORID rid = new ORecordId(p.getId());

    database.close();

    database = OObjectDatabasePool.global().acquire(url, "admin", "admin");
    JavaComplexTestClass loaded = database.load(rid);

    Assert.assertEquals(loaded.getEmbeddedSet().size(), 5);
    Iterator<Child> it = loaded.getEmbeddedSet().iterator();
    while (it.hasNext()) {
      Child loadedC = it.next();
      Assert.assertTrue(database.getRecordByUserObject(loadedC, false).isEmbedded());
      Assert.assertTrue(loadedC instanceof Child);
      Assert.assertTrue(loadedC.getName().equals("John") || loadedC.getName().equals("Jack") || loadedC.getName().equals("Bob")
          || loadedC.getName().equals("Sam") || loadedC.getName().equals("Dean"));
    }
  }

  @Test(dependsOnMethods = "mapObjectsSetEmbeddedTest")
  public void mapObjectsMapEmbeddedTest() {
    List<Child> cresult = database.query(new OSQLSynchQuery<Child>("select * from Child"));

    int childSize = cresult.size();

    JavaComplexTestClass p = database.newInstance(JavaComplexTestClass.class);
    p.setName("Silvester");

    Child c = database.newInstance(Child.class);
    c.setName("John");

    Child c1 = database.newInstance(Child.class);
    c1.setName("Jack");

    Child c2 = database.newInstance(Child.class);
    c2.setName("Bob");

    Child c3 = database.newInstance(Child.class);
    c3.setName("Sam");

    Child c4 = database.newInstance(Child.class);
    c4.setName("Dean");

    p.getEmbeddedChildren().put(c.getName(), c);
    p.getEmbeddedChildren().put(c1.getName(), c1);
    p.getEmbeddedChildren().put(c2.getName(), c2);
    p.getEmbeddedChildren().put(c3.getName(), c3);
    p.getEmbeddedChildren().put(c4.getName(), c4);

    database.save(p);

    cresult = database.query(new OSQLSynchQuery<Child>("select * from Child"));

    Assert.assertTrue(cresult.size() == childSize);

    ORID rid = new ORecordId(p.getId());

    database.close();

    database = OObjectDatabasePool.global().acquire(url, "admin", "admin");
    JavaComplexTestClass loaded = database.load(rid);

    Assert.assertEquals(loaded.getEmbeddedChildren().size(), 5);
    for (String key : loaded.getEmbeddedChildren().keySet()) {
      Child loadedC = loaded.getEmbeddedChildren().get(key);
      Assert.assertTrue(database.getRecordByUserObject(loadedC, false).isEmbedded());
      Assert.assertTrue(loadedC instanceof Child);
      Assert.assertTrue(loadedC.getName().equals("John") || loadedC.getName().equals("Jack") || loadedC.getName().equals("Bob")
          || loadedC.getName().equals("Sam") || loadedC.getName().equals("Dean"));
    }
  }

  @Test(dependsOnMethods = "mapObjectsLinkTest")
  public void mapObjectsNonExistingKeyTest() {
    JavaComplexTestClass p = new JavaComplexTestClass();
    p.setName("Silvester");

    p = database.save(p);

    Child c1 = new Child();
    c1.setName("John");

    Child c2 = new Child();
    c2.setName("Jack");

    p.getChildren().put("first", c1);
    p.getChildren().put("second", c2);

    database.save(p);

    Child c3 = new Child();
    c3.setName("Olivia");
    Child c4 = new Child();
    c4.setName("Peter");

    p.getChildren().put("third", c3);
    p.getChildren().put("fourth", c4);

    database.save(p);

    List<Child> cresult = database.query(new OSQLSynchQuery<Child>("select * from Child"));

    Assert.assertTrue(cresult.size() > 0);

    ORID rid = new ORecordId(p.getId());

    database.close();

    database = OObjectDatabasePool.global().acquire(url, "admin", "admin");
    JavaComplexTestClass loaded = database.load(rid);

    Assert.assertEquals(loaded.getChildren().get("first").getName(), c1.getName());
    Assert.assertEquals(loaded.getChildren().get("second").getName(), c2.getName());
    Assert.assertEquals(loaded.getChildren().get("third").getName(), c3.getName());
    Assert.assertEquals(loaded.getChildren().get("fourth").getName(), c4.getName());
    Assert.assertEquals(loaded.getChildren().get("fifth"), null);
  }

  @Test(dependsOnMethods = "mapObjectsLinkTest")
  public void mapObjectsLinkTwoSaveTest() {
    JavaComplexTestClass p = new JavaComplexTestClass();
    p.setName("Silvester");

    p = database.save(p);

    Child c1 = new Child();
    c1.setName("John");

    Child c2 = new Child();
    c2.setName("Jack");

    p.getChildren().put("first", c1);
    p.getChildren().put("second", c2);

    database.save(p);

    Child c3 = new Child();
    c3.setName("Olivia");
    Child c4 = new Child();
    c4.setName("Peter");

    p.getChildren().put("third", c3);
    p.getChildren().put("fourth", c4);

    database.save(p);

    List<Child> cresult = database.query(new OSQLSynchQuery<Child>("select * from Child"));

    Assert.assertTrue(cresult.size() > 0);

    ORID rid = new ORecordId(p.getId());

    database.close();

    database = OObjectDatabasePool.global().acquire(url, "admin", "admin");
    JavaComplexTestClass loaded = database.load(rid);

    Assert.assertEquals(loaded.getChildren().get("first").getName(), c1.getName());
    Assert.assertEquals(loaded.getChildren().get("second").getName(), c2.getName());
    Assert.assertEquals(loaded.getChildren().get("third").getName(), c3.getName());
    Assert.assertEquals(loaded.getChildren().get("fourth").getName(), c4.getName());
  }

  @Test(dependsOnMethods = "mapObjectsLinkTest")
  public void enumQueryTest() {
    JavaComplexTestClass testEnum1 = database.newInstance(JavaComplexTestClass.class);
    testEnum1.setName("Silvester");

    JavaComplexTestClass testEnum2 = database.newInstance(JavaComplexTestClass.class);
    testEnum1.setName("Silvester");

    testEnum1.setEnumField(EnumTest.ENUM1);

    testEnum1.getEnumList().add(EnumTest.ENUM1);
    testEnum1.getEnumList().add(EnumTest.ENUM2);

    testEnum1.getEnumSet().add(EnumTest.ENUM1);
    testEnum1.getEnumSet().add(EnumTest.ENUM3);

    testEnum1.getEnumMap().put("1", EnumTest.ENUM2);
    testEnum1.getEnumMap().put("2", EnumTest.ENUM3);

    testEnum2.setEnumField(EnumTest.ENUM2);

    testEnum2.getEnumList().add(EnumTest.ENUM2);
    testEnum2.getEnumList().add(EnumTest.ENUM3);

    testEnum2.getEnumSet().add(EnumTest.ENUM1);
    testEnum2.getEnumSet().add(EnumTest.ENUM2);

    database.save(testEnum1);
    database.save(testEnum2);

    ORID enum1Rid = database.getIdentity(testEnum1);
    ORID enum2Rid = database.getIdentity(testEnum2);

    OSQLSynchQuery<JavaComplexTestClass> enumFieldQuery = new OSQLSynchQuery<JavaComplexTestClass>(
        "select from JavaComplexTestClass where enumField = :enumField");

    Map<String, Object> enum1Config = new HashMap<String, Object>();
    Map<String, Object> enum2Config = new HashMap<String, Object>();
    enum1Config.put("enumField", EnumTest.ENUM1);
    enum2Config.put("enumField", EnumTest.ENUM2);
    List<JavaComplexTestClass> result = database.query(enumFieldQuery, enum1Config);
    Assert.assertEquals(result.size(), 1);
    Assert.assertEquals(database.getIdentity(result.get(0)).getIdentity(), enum1Rid);

    result = database.query(enumFieldQuery, enum2Config);
    Assert.assertEquals(result.size(), 1);
    Assert.assertEquals(database.getIdentity(result.get(0)).getIdentity(), enum2Rid);

    database.close();

    database = OObjectDatabasePool.global().acquire(url, "admin", "admin");
    result = database.query(enumFieldQuery, enum1Config);
    Assert.assertEquals(result.size(), 1);
    Assert.assertEquals(database.getIdentity(result.get(0)).getIdentity(), enum1Rid);

    result = database.query(enumFieldQuery, enum2Config);
    Assert.assertEquals(result.size(), 1);
    Assert.assertEquals(database.getIdentity(result.get(0)).getIdentity(), enum2Rid);
  }

  @Test(dependsOnMethods = "enumQueryTest")
  public void paramQueryTest() {
    JavaComplexTestClass testObject = database.newInstance(JavaComplexTestClass.class);
    testObject.setName("Silvester");
    Child child = database.newInstance(Child.class);
    testObject.setChild(child);
    testObject.setEnumField(EnumTest.ENUM1);

    database.save(testObject);

    ORID testObjectRid = database.getIdentity(testObject);
    ORID childRid = database.getIdentity(child);

    OSQLSynchQuery<JavaComplexTestClass> enumFieldQuery = new OSQLSynchQuery<JavaComplexTestClass>(
        "select from JavaComplexTestClass where enumField = :enumField and child = :child");

    Map<String, Object> params = new HashMap<String, Object>();
    params.put("child", childRid);
    params.put("enumField", EnumTest.ENUM1);
    List<JavaComplexTestClass> result = database.query(enumFieldQuery, params);
    Assert.assertEquals(result.size(), 1);
    Assert.assertEquals(database.getIdentity(result.get(0)).getIdentity(), testObjectRid);

    database.close();

    database = OObjectDatabasePool.global().acquire(url, "admin", "admin");
    enumFieldQuery = new OSQLSynchQuery<JavaComplexTestClass>(
        "select from JavaComplexTestClass where enumField = :enumField and child = :child");
    result = database.query(enumFieldQuery, params);
    Assert.assertEquals(result.size(), 1);
    Assert.assertEquals(database.getIdentity(result.get(0)).getIdentity(), testObjectRid);
  }

  @Test(dependsOnMethods = "mapObjectsLinkTest")
  public void mapObjectsLinkUpdateDatabaseNewInstanceTest() {
    // TEST WITH NEW INSTANCE
    JavaComplexTestClass p = database.newInstance(JavaComplexTestClass.class);
    p.setName("Fringe");

    Child c = database.newInstance(Child.class);
    c.setName("Peter");
    Child c1 = database.newInstance(Child.class);
    c1.setName("Walter");
    Child c2 = database.newInstance(Child.class);
    c2.setName("Olivia");
    Child c3 = database.newInstance(Child.class);
    c3.setName("Astrid");

    p.getChildren().put(c.getName(), c);
    p.getChildren().put(c1.getName(), c1);
    p.getChildren().put(c2.getName(), c2);
    p.getChildren().put(c3.getName(), c3);

    // database.begin();
    database.save(p);
    // database.commit();
    ORID rid = new ORecordId(p.getId());

    database.close();

    database = OObjectDatabasePool.global().acquire(url, "admin", "admin");
    JavaComplexTestClass loaded = database.load(rid);

    for (String key : loaded.getChildren().keySet()) {
      Assert.assertTrue(key.equals("Peter") || key.equals("Walter") || key.equals("Olivia") || key.equals("Astrid"));
      Assert.assertTrue(loaded.getChildren().get(key) instanceof Child);
      Assert.assertTrue(loaded.getChildren().get(key).getName().equals(key));
      if (key.equals("Peter")) {
        Assert.assertTrue(loaded.getChildren().get(key).getName().equals("Peter"));
      } else if (key.equals("Walter")) {
        Assert.assertTrue(loaded.getChildren().get(key).getName().equals("Walter"));
      } else if (key.equals("Olivia")) {
        Assert.assertTrue(loaded.getChildren().get(key).getName().equals("Olivia"));
      } else if (key.equals("Astrid")) {
        Assert.assertTrue(loaded.getChildren().get(key).getName().equals("Astrid"));
      }
    }

    database.setLazyLoading(false);
    for (JavaComplexTestClass reloaded : database.browseClass(JavaComplexTestClass.class).setFetchPlan("*:-1")) {
      database.reload(reloaded);

      Child c4 = database.newInstance(Child.class);
      c4.setName("The Observer");

      reloaded.getChildren().put(c4.getName(), c4);
      database.save(reloaded);
    }
    database.close();
    database = OObjectDatabasePool.global().acquire(url, "admin", "admin");
    for (JavaComplexTestClass reloaded : database.browseClass(JavaComplexTestClass.class).setFetchPlan("*:-1")) {
      database.reload(reloaded);
      Assert.assertTrue(reloaded.getChildren().containsKey("The Observer"));
      Assert.assertTrue(reloaded.getChildren().get("The Observer") != null);
      Assert.assertEquals(reloaded.getChildren().get("The Observer").getName(), "The Observer");
      Assert.assertTrue(database.getIdentity(reloaded.getChildren().get("The Observer")).isPersistent()
          && database.getIdentity(reloaded.getChildren().get("The Observer")).isValid());
    }
  }

  @Test(dependsOnMethods = "mapObjectsLinkUpdateDatabaseNewInstanceTest")
  public void mapObjectsLinkUpdateJavaNewInstanceTest() {
    // TEST WITH NEW INSTANCE
    JavaComplexTestClass p = new JavaComplexTestClass();
    p.setName("Fringe");

    Child c = new Child();
    c.setName("Peter");
    Child c1 = new Child();
    c1.setName("Walter");
    Child c2 = new Child();
    c2.setName("Olivia");
    Child c3 = new Child();
    c3.setName("Astrid");

    p.getChildren().put(c.getName(), c);
    p.getChildren().put(c1.getName(), c1);
    p.getChildren().put(c2.getName(), c2);
    p.getChildren().put(c3.getName(), c3);

    p = database.save(p);
    ORID rid = new ORecordId(p.getId());

    database.close();

    database = OObjectDatabasePool.global().acquire(url, "admin", "admin");
    JavaComplexTestClass loaded = database.load(rid);

    for (String key : loaded.getChildren().keySet()) {
      Assert.assertTrue(key.equals("Peter") || key.equals("Walter") || key.equals("Olivia") || key.equals("Astrid"));
      Assert.assertTrue(loaded.getChildren().get(key) instanceof Child);
      Assert.assertTrue(loaded.getChildren().get(key).getName().equals(key));
      if (key.equals("Peter")) {
        Assert.assertTrue(loaded.getChildren().get(key).getName().equals("Peter"));
      } else if (key.equals("Walter")) {
        Assert.assertTrue(loaded.getChildren().get(key).getName().equals("Walter"));
      } else if (key.equals("Olivia")) {
        Assert.assertTrue(loaded.getChildren().get(key).getName().equals("Olivia"));
      } else if (key.equals("Astrid")) {
        Assert.assertTrue(loaded.getChildren().get(key).getName().equals("Astrid"));
      }
    }

    database.setLazyLoading(false);
    for (JavaComplexTestClass reloaded : database.browseClass(JavaComplexTestClass.class).setFetchPlan("*:-1")) {
      database.reload(reloaded);

      Child c4 = new Child();
      c4.setName("The Observer");

      reloaded.getChildren().put(c4.getName(), c4);
      database.save(reloaded);
    }
    database.close();
    database = OObjectDatabasePool.global().acquire(url, "admin", "admin");
    for (JavaComplexTestClass reloaded : database.browseClass(JavaComplexTestClass.class).setFetchPlan("*:-1")) {
      database.reload(reloaded);
      Assert.assertTrue(reloaded.getChildren().containsKey("The Observer"));
      Assert.assertTrue(reloaded.getChildren().get("The Observer") != null);
      Assert.assertEquals(reloaded.getChildren().get("The Observer").getName(), "The Observer");
      Assert.assertTrue(database.getIdentity(reloaded.getChildren().get("The Observer")).isPersistent()
          && database.getIdentity(reloaded.getChildren().get("The Observer")).isValid());
    }
  }

  @Test(dependsOnMethods = "mapObjectsLinkUpdateJavaNewInstanceTest")
  public void mapStringTest() {
    Map<String, String> relatives = new HashMap<String, String>();
    relatives.put("father", "Mike");
    relatives.put("mother", "Julia");

    // TEST WITH OBJECT DATABASE NEW INSTANCE AND HANDLER MANAGEMENT
    JavaComplexTestClass p = database.newInstance(JavaComplexTestClass.class);
    p.setName("Chuck");
    p.getStringMap().put("father", "Mike");
    p.getStringMap().put("mother", "Julia");

    for (String referenceRelativ : relatives.keySet()) {
      Assert.assertEquals(relatives.get(referenceRelativ), p.getStringMap().get(referenceRelativ));
    }

    database.save(p);
    ORID rid = database.getIdentity(p);
    database.close();
    database = OObjectDatabasePool.global().acquire(url, "admin", "admin");
    JavaComplexTestClass loaded = database.load(rid);
    Assert.assertNotNull(loaded.getStringMap());
    for (String referenceRelativ : relatives.keySet()) {
      Assert.assertEquals(relatives.get(referenceRelativ), loaded.getStringMap().get(referenceRelativ));
    }
    loaded.getStringMap().put("brother", "Nike");
    relatives.put("brother", "Nike");
    database.save(loaded);
    for (String referenceRelativ : relatives.keySet()) {
      Assert.assertEquals(relatives.get(referenceRelativ), loaded.getStringMap().get(referenceRelativ));
    }
    database.close();
    database = OObjectDatabasePool.global().acquire(url, "admin", "admin");
    loaded = database.load(rid);
    Assert.assertNotNull(loaded.getStringMap());
    for (String referenceRelativ : relatives.keySet()) {
      Assert.assertEquals(relatives.get(referenceRelativ), loaded.getStringMap().get(referenceRelativ));
    }
    database.delete(loaded);

    // TEST WITH OBJECT DATABASE NEW INSTANCE AND MAP DIRECT SET
    p = database.newInstance(JavaComplexTestClass.class);
    p.setName("Chuck");
    p.setStringMap(relatives);

    for (String referenceRelativ : relatives.keySet()) {
      Assert.assertEquals(relatives.get(referenceRelativ), p.getStringMap().get(referenceRelativ));
    }

    database.save(p);
    rid = database.getIdentity(p);
    database.close();
    database = OObjectDatabasePool.global().acquire(url, "admin", "admin");
    loaded = database.load(rid);
    Assert.assertNotNull(loaded.getStringMap());
    for (String referenceRelativ : relatives.keySet()) {
      Assert.assertEquals(relatives.get(referenceRelativ), loaded.getStringMap().get(referenceRelativ));
    }
    loaded.getStringMap().put("brother", "Nike");
    relatives.put("brother", "Nike");
    database.save(loaded);
    for (String referenceRelativ : relatives.keySet()) {
      Assert.assertEquals(relatives.get(referenceRelativ), loaded.getStringMap().get(referenceRelativ));
    }
    database.close();
    database = OObjectDatabasePool.global().acquire(url, "admin", "admin");
    loaded = database.load(rid);
    Assert.assertNotNull(loaded.getStringMap());
    for (String referenceRelativ : relatives.keySet()) {
      Assert.assertEquals(relatives.get(referenceRelativ), loaded.getStringMap().get(referenceRelativ));
    }
    database.delete(loaded);

    // TEST WITH JAVA CONSTRUCTOR
    p = new JavaComplexTestClass();
    p.setName("Chuck");
    p.setStringMap(relatives);

    for (String referenceRelativ : relatives.keySet()) {
      Assert.assertEquals(relatives.get(referenceRelativ), p.getStringMap().get(referenceRelativ));
    }

    p = database.save(p);
    rid = database.getIdentity(p);
    database.close();
    database = OObjectDatabasePool.global().acquire(url, "admin", "admin");
    loaded = database.load(rid);
    Assert.assertNotNull(loaded.getStringMap());
    for (String referenceRelativ : relatives.keySet()) {
      Assert.assertEquals(relatives.get(referenceRelativ), loaded.getStringMap().get(referenceRelativ));
    }
    loaded.getStringMap().put("brother", "Nike");
    relatives.put("brother", "Nike");
    database.save(loaded);
    for (String referenceRelativ : relatives.keySet()) {
      Assert.assertEquals(relatives.get(referenceRelativ), loaded.getStringMap().get(referenceRelativ));
    }
    database.close();
    database = OObjectDatabasePool.global().acquire(url, "admin", "admin");
    loaded = database.load(rid);
    Assert.assertNotNull(loaded.getStringMap());
    for (String referenceRelativ : relatives.keySet()) {
      Assert.assertEquals(relatives.get(referenceRelativ), loaded.getStringMap().get(referenceRelativ));
    }
    database.delete(loaded);
  }

  @Test(dependsOnMethods = "mapStringTest")
  public void setStringTest() {
    JavaComplexTestClass testClass = new JavaComplexTestClass();
    Set<String> roles = new HashSet<String>();
    roles.add("manager");
    roles.add("developer");
    testClass.setStringSet(roles);

    JavaComplexTestClass testClassProxy = database.save(testClass);
    Assert.assertEquals(roles.size(), testClassProxy.getStringSet().size());
    for (String referenceRole : roles) {
      Assert.assertTrue(testClassProxy.getStringSet().contains(referenceRole));
    }

    ORID orid = database.getIdentity(testClassProxy);
    database.close();
    database = OObjectDatabasePool.global().acquire(url, "admin", "admin");

    JavaComplexTestClass loadedProxy = database.load(orid);
    Assert.assertEquals(roles.size(), loadedProxy.getStringSet().size());
    for (String referenceRole : roles) {
      Assert.assertTrue(loadedProxy.getStringSet().contains(referenceRole));
    }

    database.save(loadedProxy);
    Assert.assertEquals(roles.size(), loadedProxy.getStringSet().size());
    for (String referenceRole : roles) {
      Assert.assertTrue(loadedProxy.getStringSet().contains(referenceRole));
    }

    loadedProxy.getStringSet().remove("developer");
    roles.remove("developer");
    database.save(loadedProxy);
    Assert.assertEquals(roles.size(), loadedProxy.getStringSet().size());
    for (String referenceRole : roles) {
      Assert.assertTrue(loadedProxy.getStringSet().contains(referenceRole));
    }
    database.close();
    database = OObjectDatabasePool.global().acquire(url, "admin", "admin");

    loadedProxy = database.load(orid);
    Assert.assertEquals(roles.size(), loadedProxy.getStringSet().size());
    for (String referenceRole : roles) {
      Assert.assertTrue(loadedProxy.getStringSet().contains(referenceRole));
    }
  }

  @Test(dependsOnMethods = "setStringTest")
  public void mapStringListTest() {
    Map<String, List<String>> songAndMovies = new HashMap<String, List<String>>();
    List<String> movies = new ArrayList<String>();
    List<String> songs = new ArrayList<String>();
    movies.add("Star Wars");
    movies.add("Star Wars: The Empire Strikes Back");
    movies.add("Star Wars: The return of the Jedi");
    songs.add("Metallica - Master of Puppets");
    songs.add("Daft Punk - Harder, Better, Faster, Stronger");
    songs.add("Johnny Cash - Cocaine Blues");
    songs.add("Skrillex - Scary Monsters & Nice Sprites");
    songAndMovies.put("movies", movies);
    songAndMovies.put("songs", songs);

    // TEST WITH OBJECT DATABASE NEW INSTANCE AND HANDLER MANAGEMENT
    JavaComplexTestClass p = database.newInstance(JavaComplexTestClass.class);
    p.setName("Chuck");

    p.getStringListMap().put("movies", movies);
    p.getStringListMap().put("songs", songs);

    for (String referenceRelativ : songAndMovies.keySet()) {
      Assert.assertEquals(songAndMovies.get(referenceRelativ), p.getStringListMap().get(referenceRelativ));
    }

    database.save(p);
    ORID rid = database.getIdentity(p);
    database.close();
    database = OObjectDatabasePool.global().acquire(url, "admin", "admin");
    JavaComplexTestClass loaded = database.load(rid);
    Assert.assertNotNull(loaded.getStringListMap());
    for (String reference : songAndMovies.keySet()) {
      Assert.assertEquals(songAndMovies.get(reference), loaded.getStringListMap().get(reference));
    }
    database.delete(loaded);

    // TEST WITH OBJECT DATABASE NEW INSTANCE AND MAP DIRECT SET
    p = database.newInstance(JavaComplexTestClass.class);
    p.setName("Chuck");
    p.setStringListMap(songAndMovies);

    for (String referenceRelativ : songAndMovies.keySet()) {
      Assert.assertEquals(songAndMovies.get(referenceRelativ), p.getStringListMap().get(referenceRelativ));
    }

    database.save(p);
    rid = database.getIdentity(p);
    database.close();
    database = OObjectDatabasePool.global().acquire(url, "admin", "admin");
    loaded = database.load(rid);
    Assert.assertNotNull(loaded.getStringListMap());
    for (String referenceRelativ : songAndMovies.keySet()) {
      Assert.assertEquals(songAndMovies.get(referenceRelativ), loaded.getStringListMap().get(referenceRelativ));
    }
    database.delete(loaded);

    // TEST WITH OBJECT DATABASE NEW INSTANCE LIST DIRECT ADD
    p = database.newInstance(JavaComplexTestClass.class);
    p.setName("Chuck");
    p.getStringListMap().put("songs", new ArrayList<String>());
    p.getStringListMap().get("songs").add("Metallica - Master of Puppets");
    p.getStringListMap().get("songs").add("Daft Punk - Harder, Better, Faster, Stronger");
    p.getStringListMap().get("songs").add("Johnny Cash - Cocaine Blues");
    p.getStringListMap().get("songs").add("Skrillex - Scary Monsters & Nice Sprites");
    p.getStringListMap().put("movies", new ArrayList<String>());
    p.getStringListMap().get("movies").add("Star Wars");
    p.getStringListMap().get("movies").add("Star Wars: The Empire Strikes Back");
    p.getStringListMap().get("movies").add("Star Wars: The return of the Jedi");

    for (String referenceRelativ : songAndMovies.keySet()) {
      Assert.assertEquals(songAndMovies.get(referenceRelativ), p.getStringListMap().get(referenceRelativ));
    }

    database.save(p);
    rid = database.getIdentity(p);
    database.close();
    database = OObjectDatabasePool.global().acquire(url, "admin", "admin");
    loaded = database.load(rid);
    Assert.assertNotNull(loaded.getStringListMap());
    for (String referenceRelativ : songAndMovies.keySet()) {
      Assert.assertEquals(songAndMovies.get(referenceRelativ), loaded.getStringListMap().get(referenceRelativ));
    }
    database.delete(loaded);

    // TEST WITH JAVA CONSTRUCTOR
    p = new JavaComplexTestClass();
    p.setName("Chuck");
    p.setStringListMap(songAndMovies);

    for (String referenceRelativ : songAndMovies.keySet()) {
      Assert.assertEquals(songAndMovies.get(referenceRelativ), p.getStringListMap().get(referenceRelativ));
    }

    p = database.save(p);
    rid = database.getIdentity(p);
    database.close();
    database = OObjectDatabasePool.global().acquire(url, "admin", "admin");
    loaded = database.load(rid);
    Assert.assertNotNull(loaded.getStringListMap());
    for (String referenceRelativ : songAndMovies.keySet()) {
      Assert.assertEquals(songAndMovies.get(referenceRelativ), loaded.getStringListMap().get(referenceRelativ));
    }
    database.delete(loaded);
  }

  @Test(dependsOnMethods = "mapStringListTest")
  public void mapStringObjectTest() {
    Map<String, Object> relatives = new HashMap<String, Object>();
    relatives.put("father", "Mike");
    relatives.put("mother", "Julia");

    // TEST WITH OBJECT DATABASE NEW INSTANCE AND HANDLER MANAGEMENT
    JavaComplexTestClass p = database.newInstance(JavaComplexTestClass.class);
    p.setName("Chuck");
    p.getMapObject().put("father", "Mike");
    p.getMapObject().put("mother", "Julia");

    for (String referenceRelativ : relatives.keySet()) {
      Assert.assertEquals(relatives.get(referenceRelativ), p.getMapObject().get(referenceRelativ));
    }

    p.getMapObject().keySet().size();

    database.save(p);
    ORID rid = database.getIdentity(p);
    database.close();
    database = OObjectDatabasePool.global().acquire(url, "admin", "admin");
    JavaComplexTestClass loaded = database.load(rid);
    Assert.assertNotNull(loaded.getMapObject());
    for (String referenceRelativ : relatives.keySet()) {
      Assert.assertEquals(relatives.get(referenceRelativ), loaded.getMapObject().get(referenceRelativ));
    }
    loaded.getMapObject().keySet().size();
    loaded.getMapObject().put("brother", "Nike");
    relatives.put("brother", "Nike");
    database.save(loaded);
    for (String referenceRelativ : relatives.keySet()) {
      Assert.assertEquals(relatives.get(referenceRelativ), loaded.getMapObject().get(referenceRelativ));
    }
    loaded.getMapObject().keySet().size();
    database.close();
    database = OObjectDatabasePool.global().acquire(url, "admin", "admin");
    loaded = database.load(rid);
    Assert.assertNotNull(loaded.getMapObject());
    for (String referenceRelativ : relatives.keySet()) {
      Assert.assertEquals(relatives.get(referenceRelativ), loaded.getMapObject().get(referenceRelativ));
    }
    database.delete(loaded);

    // TEST WITH OBJECT DATABASE NEW INSTANCE AND MAP DIRECT SET
    p = database.newInstance(JavaComplexTestClass.class);
    p.setName("Chuck");
    p.setMapObject(relatives);

    for (String referenceRelativ : relatives.keySet()) {
      Assert.assertEquals(relatives.get(referenceRelativ), p.getMapObject().get(referenceRelativ));
    }

    database.save(p);
    p.getMapObject().keySet().size();
    rid = database.getIdentity(p);
    database.close();
    database = OObjectDatabasePool.global().acquire(url, "admin", "admin");
    loaded = database.load(rid);
    Assert.assertNotNull(loaded.getMapObject());
    for (String referenceRelativ : relatives.keySet()) {
      Assert.assertEquals(relatives.get(referenceRelativ), loaded.getMapObject().get(referenceRelativ));
    }
    loaded.getMapObject().keySet().size();
    loaded.getMapObject().put("brother", "Nike");
    relatives.put("brother", "Nike");
    database.save(loaded);
    for (String referenceRelativ : relatives.keySet()) {
      Assert.assertEquals(relatives.get(referenceRelativ), loaded.getMapObject().get(referenceRelativ));
    }
    loaded.getMapObject().keySet().size();
    database.close();
    database = OObjectDatabasePool.global().acquire(url, "admin", "admin");
    loaded = database.load(rid);
    Assert.assertNotNull(loaded.getMapObject());
    for (String referenceRelativ : relatives.keySet()) {
      Assert.assertEquals(relatives.get(referenceRelativ), loaded.getMapObject().get(referenceRelativ));
    }
    loaded.getMapObject().keySet().size();
    database.delete(loaded);

    // TEST WITH JAVA CONSTRUCTOR
    p = new JavaComplexTestClass();
    p.setName("Chuck");
    p.setMapObject(relatives);

    for (String referenceRelativ : relatives.keySet()) {
      Assert.assertEquals(relatives.get(referenceRelativ), p.getMapObject().get(referenceRelativ));
    }

    p = database.save(p);
    p.getMapObject().keySet().size();
    rid = database.getIdentity(p);
    database.close();
    database = OObjectDatabasePool.global().acquire(url, "admin", "admin");
    loaded = database.load(rid);
    Assert.assertNotNull(loaded.getMapObject());
    for (String referenceRelativ : relatives.keySet()) {
      Assert.assertEquals(relatives.get(referenceRelativ), loaded.getMapObject().get(referenceRelativ));
    }
    loaded.getMapObject().keySet().size();
    loaded.getMapObject().put("brother", "Nike");
    relatives.put("brother", "Nike");
    database.save(loaded);
    for (String referenceRelativ : relatives.keySet()) {
      Assert.assertEquals(relatives.get(referenceRelativ), loaded.getMapObject().get(referenceRelativ));
    }
    database.close();
    database = OObjectDatabasePool.global().acquire(url, "admin", "admin");
    loaded = database.load(rid);
    loaded.getMapObject().keySet().size();
    Assert.assertNotNull(loaded.getMapObject());
    for (String referenceRelativ : relatives.keySet()) {
      Assert.assertEquals(relatives.get(referenceRelativ), loaded.getMapObject().get(referenceRelativ));
    }
    database.delete(loaded);
  }

  @Test(dependsOnMethods = "mapStringObjectTest")
  public void embeddedMapObjectTest() {
    Calendar cal = Calendar.getInstance();
    cal.set(Calendar.HOUR_OF_DAY, 0);
    cal.set(Calendar.MINUTE, 0);
    cal.set(Calendar.SECOND, 0);
    cal.set(Calendar.MILLISECOND, 0);
    Map<String, Object> relatives = new HashMap<String, Object>();
    relatives.put("father", "Mike");
    relatives.put("mother", "Julia");
    relatives.put("number", 10);
    relatives.put("date", cal.getTime());

    // TEST WITH OBJECT DATABASE NEW INSTANCE AND HANDLER MANAGEMENT
    JavaComplexTestClass p = database.newInstance(JavaComplexTestClass.class);
    p.setName("Chuck");
    p.getMapObject().put("father", "Mike");
    p.getMapObject().put("mother", "Julia");
    p.getMapObject().put("number", 10);
    p.getMapObject().put("date", cal.getTime());

    for (String referenceRelativ : relatives.keySet()) {
      Assert.assertEquals(relatives.get(referenceRelativ), p.getMapObject().get(referenceRelativ));
    }

    p.getMapObject().keySet().size();

    database.save(p);
    ORID rid = database.getIdentity(p);
    database.close();
    database = OObjectDatabasePool.global().acquire(url, "admin", "admin");
    JavaComplexTestClass loaded = database.load(rid);
    Assert.assertNotNull(loaded.getMapObject());
    for (String referenceRelativ : relatives.keySet()) {
      Assert.assertEquals(relatives.get(referenceRelativ), loaded.getMapObject().get(referenceRelativ));
    }
    loaded.getMapObject().keySet().size();
    loaded.getMapObject().put("brother", "Nike");
    relatives.put("brother", "Nike");
    database.save(loaded);
    for (String referenceRelativ : relatives.keySet()) {
      Assert.assertEquals(relatives.get(referenceRelativ), loaded.getMapObject().get(referenceRelativ));
    }
    loaded.getMapObject().keySet().size();
    database.close();
    database = OObjectDatabasePool.global().acquire(url, "admin", "admin");
    loaded = database.load(rid);
    Assert.assertNotNull(loaded.getMapObject());
    for (String referenceRelativ : relatives.keySet()) {
      Assert.assertEquals(relatives.get(referenceRelativ), loaded.getMapObject().get(referenceRelativ));
    }
    database.delete(loaded);

    // TEST WITH OBJECT DATABASE NEW INSTANCE AND MAP DIRECT SET
    p = database.newInstance(JavaComplexTestClass.class);
    p.setName("Chuck");
    p.setMapObject(relatives);

    for (String referenceRelativ : relatives.keySet()) {
      Assert.assertEquals(relatives.get(referenceRelativ), p.getMapObject().get(referenceRelativ));
    }

    database.save(p);
    p.getMapObject().keySet().size();
    rid = database.getIdentity(p);
    database.close();
    database = OObjectDatabasePool.global().acquire(url, "admin", "admin");
    loaded = database.load(rid);
    Assert.assertNotNull(loaded.getMapObject());
    for (String referenceRelativ : relatives.keySet()) {
      Assert.assertEquals(relatives.get(referenceRelativ), loaded.getMapObject().get(referenceRelativ));
    }
    loaded.getMapObject().keySet().size();
    loaded.getMapObject().put("brother", "Nike");
    relatives.put("brother", "Nike");
    database.save(loaded);
    for (String referenceRelativ : relatives.keySet()) {
      Assert.assertEquals(relatives.get(referenceRelativ), loaded.getMapObject().get(referenceRelativ));
    }
    loaded.getMapObject().keySet().size();
    database.close();
    database = OObjectDatabasePool.global().acquire(url, "admin", "admin");
    loaded = database.load(rid);
    Assert.assertNotNull(loaded.getMapObject());
    for (String referenceRelativ : relatives.keySet()) {
      Assert.assertEquals(relatives.get(referenceRelativ), loaded.getMapObject().get(referenceRelativ));
    }
    loaded.getMapObject().keySet().size();
    database.delete(loaded);

    // TEST WITH JAVA CONSTRUCTOR
    p = new JavaComplexTestClass();
    p.setName("Chuck");
    p.setMapObject(relatives);

    for (String referenceRelativ : relatives.keySet()) {
      Assert.assertEquals(relatives.get(referenceRelativ), p.getMapObject().get(referenceRelativ));
    }

    p = database.save(p);
    p.getMapObject().keySet().size();
    rid = database.getIdentity(p);
    database.close();
    database = OObjectDatabasePool.global().acquire(url, "admin", "admin");
    loaded = database.load(rid);
    Assert.assertNotNull(loaded.getMapObject());
    for (String referenceRelativ : relatives.keySet()) {
      Assert.assertEquals(relatives.get(referenceRelativ), loaded.getMapObject().get(referenceRelativ));
    }
    loaded.getMapObject().keySet().size();
    loaded.getMapObject().put("brother", "Nike");
    relatives.put("brother", "Nike");
    database.save(loaded);
    for (String referenceRelativ : relatives.keySet()) {
      Assert.assertEquals(relatives.get(referenceRelativ), loaded.getMapObject().get(referenceRelativ));
    }
    database.close();
    database = OObjectDatabasePool.global().acquire(url, "admin", "admin");
    loaded = database.load(rid);
    loaded.getMapObject().keySet().size();
    Assert.assertNotNull(loaded.getMapObject());
    for (String referenceRelativ : relatives.keySet()) {
      Assert.assertEquals(relatives.get(referenceRelativ), loaded.getMapObject().get(referenceRelativ));
    }
    database.delete(loaded);
  }

  @SuppressWarnings("unchecked")
  @Test(dependsOnMethods = "embeddedMapObjectTest")
  public void testNoGenericCollections() {
    JavaNoGenericCollectionsTestClass p = database.newInstance(JavaNoGenericCollectionsTestClass.class);
    Child c1 = new Child();
    c1.setName("1");
    Child c2 = new Child();
    c2.setName("2");
    Child c3 = new Child();
    c3.setName("3");
    Child c4 = new Child();
    c4.setName("4");
    p.getList().add(c1);
    p.getList().add(c2);
    p.getList().add(c3);
    p.getList().add(c4);
    p.getSet().add(c1);
    p.getSet().add(c2);
    p.getSet().add(c3);
    p.getSet().add(c4);
    p.getMap().put("1", c1);
    p.getMap().put("2", c2);
    p.getMap().put("3", c3);
    p.getMap().put("4", c4);
    p = database.save(p);
    ORID rid = database.getIdentity(p);
    database.close();
    database = OObjectDatabasePool.global().acquire(url, "admin", "admin");
    p = database.load(rid);
    Assert.assertEquals(p.getList().size(), 4);
    Assert.assertEquals(p.getSet().size(), 4);
    Assert.assertEquals(p.getMap().size(), 4);
    for (int i = 0; i < 4; i++) {
      Object o = p.getList().get(i);
      Assert.assertTrue(o instanceof Child);
      Assert.assertEquals(((Child) o).getName(), (i + 1) + "");
      o = p.getMap().get((i + 1) + "");
      Assert.assertTrue(o instanceof Child);
      Assert.assertEquals(((Child) o).getName(), (i + 1) + "");
    }
    for (Object o : p.getSet()) {
      Assert.assertTrue(o instanceof Child);
      int nameToInt = Integer.valueOf(((Child) o).getName());
      Assert.assertTrue(nameToInt > 0 && nameToInt < 5);
    }
    JavaSimpleTestClass other = new JavaSimpleTestClass();
    p.getList().add(other);
    p.getSet().add(other);
    p.getMap().put("5", other);
    database.save(p);
    database.close();
    database = OObjectDatabasePool.global().acquire(url, "admin", "admin");
    p = database.load(rid);
    Assert.assertEquals(p.getList().size(), 5);
    Object o = p.getList().get(4);
    Assert.assertTrue(o instanceof JavaSimpleTestClass);
    o = p.getMap().get("5");
    Assert.assertTrue(o instanceof JavaSimpleTestClass);
    boolean hasOther = false;
    for (Object obj : p.getSet()) {
      hasOther = hasOther || (obj instanceof JavaSimpleTestClass);
    }
    Assert.assertTrue(hasOther);
  }

  @SuppressWarnings("unchecked")
  @Test(dependsOnMethods = "testNoGenericCollections")
  public void testNoGenericCollectionsWrongAdding() {
    OLogManager.instance().setErrorEnabled(false);
    JavaNoGenericCollectionsTestClass p = database.newInstance(JavaNoGenericCollectionsTestClass.class);
    // OBJECT ADDING
    boolean throwedEx = false;
    try {
      p.getList().add(new Object());
    } catch (Throwable ose) {
      if (ose instanceof ODatabaseException && ose.getCause() instanceof OSerializationException)
        throwedEx = true;
    }
    Assert.assertTrue(throwedEx);
    throwedEx = false;
    try {
      p.getSet().add(new Object());
    } catch (Throwable ose) {
      if (ose instanceof ODatabaseException && ose.getCause() instanceof OSerializationException)
        throwedEx = true;
    }
    Assert.assertTrue(throwedEx);
    throwedEx = false;
    try {
      p.getMap().put("1", new Object());
    } catch (Throwable ose) {
      if (ose instanceof ODatabaseException && ose.getCause() instanceof OSerializationException)
        throwedEx = true;
    }
    Assert.assertTrue(throwedEx);

    // JAVA TYPE ADDING
    try {
      p.getList().add(1);
    } catch (Throwable ose) {
      if (ose instanceof ODatabaseException && ose.getCause() instanceof OSerializationException)
        throwedEx = true;
    }
    Assert.assertTrue(throwedEx);
    throwedEx = false;
    try {
      p.getList().add("asd");
    } catch (Throwable ose) {
      if (ose instanceof ODatabaseException && ose.getCause() instanceof OSerializationException)
        throwedEx = true;
    }
    Assert.assertTrue(throwedEx);
    throwedEx = false;
    try {
      p.getSet().add(1);
    } catch (Throwable ose) {
      if (ose instanceof ODatabaseException && ose.getCause() instanceof OSerializationException)
        throwedEx = true;
    }
    Assert.assertTrue(throwedEx);
    throwedEx = false;
    try {
      p.getSet().add("asd");
    } catch (Throwable ose) {
      if (ose instanceof ODatabaseException && ose.getCause() instanceof OSerializationException)
        throwedEx = true;
    }
    Assert.assertTrue(throwedEx);
    throwedEx = false;

    try {
      p.getMap().put("1", 1);
    } catch (Throwable ose) {
      if (ose instanceof ODatabaseException && ose.getCause() instanceof OSerializationException)
        throwedEx = true;
    }
    Assert.assertTrue(throwedEx);
    throwedEx = false;
    try {
      p.getMap().put("1", "ASF");
    } catch (Throwable ose) {
      if (ose instanceof ODatabaseException && ose.getCause() instanceof OSerializationException)
        throwedEx = true;
    }
    Assert.assertTrue(throwedEx);
    OLogManager.instance().setErrorEnabled(true);
  }

  @Test(dependsOnMethods = "testNoGenericCollectionsWrongAdding")
  public void oidentifableFieldsTest() {
    JavaComplexTestClass p = database.newInstance(JavaComplexTestClass.class);
    p.setName("Dean Winchester");

    ODocument testEmbeddedDocument = new ODocument();
    testEmbeddedDocument.field("testEmbeddedField", "testEmbeddedValue");

    p.setEmbeddedDocument(testEmbeddedDocument);

    ODocument testDocument = new ODocument();
    testDocument.field("testField", "testValue");

    p.setDocument(testDocument);

    ORecordBytes testRecordBytes = new ORecordBytes(
        "this is a bytearray test. if you read this Object database has stored it correctly".getBytes());

    p.setByteArray(testRecordBytes);

    database.save(p);

    ORID rid = database.getRecordByUserObject(p, false).getIdentity();

    database.close();

    database = OObjectDatabasePool.global().acquire(url, "admin", "admin");
    JavaComplexTestClass loaded = database.load(rid);

    Assert.assertTrue(loaded.getByteArray() instanceof ORecordBytes);
    try {
      ByteArrayOutputStream out = new ByteArrayOutputStream();
      try {
        loaded.getByteArray().toOutputStream(out);
        Assert.assertEquals("this is a bytearray test. if you read this Object database has stored it correctly".getBytes(),
            out.toByteArray());
        Assert.assertEquals("this is a bytearray test. if you read this Object database has stored it correctly",
            new String(out.toByteArray()));
      } finally {
        out.close();
      }
    } catch (IOException ioe) {
      Assert.assertTrue(false);
      OLogManager.instance().error(this, "Error reading byte[]", ioe);
    }
    Assert.assertTrue(loaded.getDocument() instanceof ODocument);
    Assert.assertEquals("testValue", loaded.getDocument().field("testField"));
    Assert.assertTrue(loaded.getDocument().getIdentity().isPersistent());

    Assert.assertTrue(loaded.getEmbeddedDocument() instanceof ODocument);
    Assert.assertEquals("testEmbeddedValue", loaded.getEmbeddedDocument().field("testEmbeddedField"));
    Assert.assertFalse(loaded.getEmbeddedDocument().getIdentity().isValid());

    database.close();
    database = OObjectDatabasePool.global().acquire(url, "admin", "admin");
    p = database.newInstance(JavaComplexTestClass.class);
    byte[] thumbnailImageBytes = "this is a bytearray test. if you read this Object database has stored it correctlyVERSION2"
        .getBytes();
    ORecordBytes oRecordBytes = new ORecordBytes(database.getUnderlying(), thumbnailImageBytes);
    oRecordBytes.save();
    p.setByteArray(oRecordBytes);
    p = database.save(p);
    Assert.assertTrue(p.getByteArray() instanceof ORecordBytes);
    try {
      ByteArrayOutputStream out = new ByteArrayOutputStream();
      try {
        p.getByteArray().toOutputStream(out);
        Assert.assertEquals(
            "this is a bytearray test. if you read this Object database has stored it correctlyVERSION2".getBytes(),
            out.toByteArray());
        Assert.assertEquals("this is a bytearray test. if you read this Object database has stored it correctlyVERSION2",
            new String(out.toByteArray()));
      } finally {
        out.close();
      }
    } catch (IOException ioe) {
      Assert.assertTrue(false);
      OLogManager.instance().error(this, "Error reading byte[]", ioe);
    }
    rid = database.getIdentity(p);

    database.close();

    database = OObjectDatabasePool.global().acquire(url, "admin", "admin");
    loaded = database.load(rid);

    Assert.assertTrue(loaded.getByteArray() instanceof ORecordBytes);
    try {
      ByteArrayOutputStream out = new ByteArrayOutputStream();
      try {
        loaded.getByteArray().toOutputStream(out);
        Assert.assertEquals(
            "this is a bytearray test. if you read this Object database has stored it correctlyVERSION2".getBytes(),
            out.toByteArray());
        Assert.assertEquals("this is a bytearray test. if you read this Object database has stored it correctlyVERSION2",
            new String(out.toByteArray()));
      } finally {
        out.close();
      }
    } catch (IOException ioe) {
      Assert.assertTrue(false);
      OLogManager.instance().error(this, "Error reading byte[]", ioe);
    }
    database.close();
    database = OObjectDatabasePool.global().acquire(url, "admin", "admin");
    p = new JavaComplexTestClass();
    thumbnailImageBytes = "this is a bytearray test. if you read this Object database has stored it correctlyVERSION2".getBytes();
    oRecordBytes = new ORecordBytes(database.getUnderlying(), thumbnailImageBytes);
    oRecordBytes.save();
    p.setByteArray(oRecordBytes);
    p = database.save(p);
    Assert.assertTrue(p.getByteArray() instanceof ORecordBytes);
    try {
      ByteArrayOutputStream out = new ByteArrayOutputStream();
      try {
        p.getByteArray().toOutputStream(out);
        Assert.assertEquals(
            "this is a bytearray test. if you read this Object database has stored it correctlyVERSION2".getBytes(),
            out.toByteArray());
        Assert.assertEquals("this is a bytearray test. if you read this Object database has stored it correctlyVERSION2",
            new String(out.toByteArray()));
      } finally {
        out.close();
      }
    } catch (IOException ioe) {
      Assert.assertTrue(false);
      OLogManager.instance().error(this, "Error reading byte[]", ioe);
    }
    rid = database.getIdentity(p);

    database.close();

    database = OObjectDatabasePool.global().acquire(url, "admin", "admin");
    loaded = database.load(rid);

    Assert.assertTrue(loaded.getByteArray() instanceof ORecordBytes);
    try {
      ByteArrayOutputStream out = new ByteArrayOutputStream();
      try {
        loaded.getByteArray().toOutputStream(out);
        Assert.assertEquals(
            "this is a bytearray test. if you read this Object database has stored it correctlyVERSION2".getBytes(),
            out.toByteArray());
        Assert.assertEquals("this is a bytearray test. if you read this Object database has stored it correctlyVERSION2",
            new String(out.toByteArray()));
      } finally {
        out.close();
      }
    } catch (IOException ioe) {
      Assert.assertTrue(false);
      OLogManager.instance().error(this, "Error reading byte[]", ioe);
    }
  }

  @Test(dependsOnMethods = "oidentifableFieldsTest")
  public void oRecordBytesFieldsTest() {
    try {
      OObjectIteratorClass<JavaComplexTestClass> browseClass = database.browseClass(JavaComplexTestClass.class);
      for (JavaComplexTestClass ebookPropertyItem : browseClass) {
        ORecordBytes coverThumbnail = ebookPropertyItem.getByteArray(); // The IllegalArgumentException is thrown here.
      }
    } catch (IllegalArgumentException iae) {
      Assert.fail("ORecordBytes field getter should not throw this exception", iae);
    }
  }

  @Test(dependsOnMethods = "oRecordBytesFieldsTest")
  public void testAddingORecordBytesAfterParentCreation() throws IOException {
    ORID rid;
    Media media = new Media();
    media.setName("TestMedia");
    media = database.save(media);

    // Add ORecordBytes after
    database.begin();
    media.setContent("This is a test".getBytes());
    media = database.save(media);
    database.commit();
    rid = database.getIdentity(media);
    database.close();

    database = OObjectDatabasePool.global().acquire(url, "admin", "admin");
    media = database.load(rid);
    Assert.assertTrue(media.getContent() == null);
    database.delete(media);
  }

  @Test(dependsOnMethods = "testAddingORecordBytesAfterParentCreation")
  public void testObjectDelete() {
    Media media = new Media();
    ORecordBytes testRecord = new ORecordBytes("This is a test".getBytes());
    media.setContent(testRecord);
    media = database.save(media);

    Assert.assertEquals(new String(media.getContent().toStream()), "This is a test");

    // try to delete
    database.delete(media);
  }

  @Test(dependsOnMethods = "testObjectDelete")
  public void testOrphanDelete() {
    Media media = new Media();
    ORecordBytes testRecord = new ORecordBytes("This is a test".getBytes());
    media.setContent(testRecord);
    media = database.save(media);

    Assert.assertEquals(new String(media.getContent().toStream()), "This is a test");

    // try to delete
    database.delete(media);
  }

  @Test(dependsOnMethods = "mapEnumAndInternalObjects")
  public void update() {
    int i = 0;
    Account a;
    for (Object o : database.browseCluster("Account").setFetchPlan("*:1")) {
      a = (Account) o;

      if (i % 2 == 0)
        a.getAddresses().set(0, new Address("work", new City(new Country("Spain"), "Madrid"), "Plaza central"));

      a.setSalary(i + 500.10f);

      database.save(a);

      i++;
    }
  }

  @Test(dependsOnMethods = "update")
  public void testUpdate() {
    int i = 0;
    Account a;
    for (OObjectIteratorCluster<Account> iterator = database.browseCluster("Account"); iterator.hasNext();) {
      iterator.setFetchPlan("*:1");
      a = iterator.next();

      if (i % 2 == 0)
        Assert.assertEquals(a.getAddresses().get(0).getCity().getCountry().getName(), "Spain");
      else
        Assert.assertEquals(a.getAddresses().get(0).getCity().getCountry().getName(), "Italy");

      Assert.assertEquals(a.getSalary(), i + 500.1f);

      i++;
    }
  }

  @Test(dependsOnMethods = "testUpdate")
  public void createLinked() {
    long profiles = database.countClass("Profile");

    Profile neo = new Profile("Neo").setValue("test").setLocation(
        new Address("residence", new City(new Country("Spain"), "Madrid"), "Rio de Castilla"));
    neo.addFollowing(new Profile("Morpheus"));
    neo.addFollowing(new Profile("Trinity"));

    database.save(neo);

    Assert.assertEquals(database.countClass("Profile"), profiles + 3);
  }

  @Test(dependsOnMethods = "createLinked")
  public void browseLinked() {
    for (Profile obj : database.browseClass(Profile.class).setFetchPlan("*:1")) {
      if (obj.getNick().equals("Neo")) {
        Assert.assertEquals(obj.getFollowers().size(), 0);
        Assert.assertEquals(obj.getFollowings().size(), 2);
      } else if (obj.getNick().equals("Morpheus") || obj.getNick().equals("Trinity")) {
        Assert.assertEquals(obj.getFollowers().size(), 1);
        Assert.assertEquals(obj.getFollowings().size(), 0);
      }
    }
  }

  @Test(dependsOnMethods = "createLinked")
  public void checkLazyLoadingOff() {
    database.setLazyLoading(false);
    for (Profile obj : database.browseClass(Profile.class).setFetchPlan("*:1")) {
      Assert.assertTrue(!(obj.getFollowings() instanceof OLazyObjectSetInterface)
          || ((OLazyObjectSetInterface<Profile>) obj.getFollowings()).isConverted());
      Assert.assertTrue(!(obj.getFollowers() instanceof OLazyObjectSetInterface)
          || ((OLazyObjectSetInterface<Profile>) obj.getFollowers()).isConverted());
      if (obj.getNick().equals("Neo")) {
        Assert.assertEquals(obj.getFollowers().size(), 0);
        Assert.assertEquals(obj.getFollowings().size(), 2);
      } else if (obj.getNick().equals("Morpheus") || obj.getNick().equals("Trinity")) {
        Assert.assertEquals(obj.getFollowings().size(), 0);
        Assert.assertEquals(obj.getFollowers().size(), 1);
        Assert.assertTrue(obj.getFollowers().iterator().next() instanceof Profile);
      }
    }
  }

  @Test(dependsOnMethods = "checkLazyLoadingOff")
  public void queryPerFloat() {
    final List<Account> result = database.query(new OSQLSynchQuery<ODocument>("select * from Account where salary = 500.10"));

    Assert.assertTrue(result.size() > 0);

    Account account;
    for (int i = 0; i < result.size(); ++i) {
      account = result.get(i);

      Assert.assertEquals(account.getSalary(), 500.10f);
    }
  }

  @Test(dependsOnMethods = "queryPerFloat")
  public void queryCross3Levels() {
    database.getMetadata().getSchema().reload();

    final List<Profile> result = database.query(new OSQLSynchQuery<Profile>(
        "select from Profile where location.city.country.name = 'Spain'"));

    Assert.assertTrue(result.size() > 0);

    Profile profile;
    for (int i = 0; i < result.size(); ++i) {
      profile = result.get(i);

      Assert.assertEquals(profile.getLocation().getCity().getCountry().getName(), "Spain");
    }
  }

  @Test(dependsOnMethods = "queryCross3Levels")
  public void deleteFirst() {
    database.getMetadata().getSchema().reload();

    startRecordNumber = database.countClusterElements("Account");

    // DELETE ALL THE RECORD IN THE CLUSTER
    for (Object obj : database.browseCluster("Account")) {
      database.delete(obj);
      break;
    }

    Assert.assertEquals(database.countClusterElements("Account"), startRecordNumber - 1);
  }

  @Test
  public void commandWithPositionalParameters() {
    database.getMetadata().getSchema().reload();

    final OSQLSynchQuery<Profile> query = new OSQLSynchQuery<Profile>("select from Profile where name = ? and surname = ?");
    List<Profile> result = database.command(query).execute("Barack", "Obama");

    Assert.assertTrue(result.size() != 0);
  }

  @Test
  public void queryWithPositionalParameters() {
    database.getMetadata().getSchema().reload();

    final OSQLSynchQuery<Profile> query = new OSQLSynchQuery<Profile>("select from Profile where name = ? and surname = ?");
    List<Profile> result = database.query(query, "Barack", "Obama");

    Assert.assertTrue(result.size() != 0);
  }

  @Test
  public void queryWithRidAsParameters() {
    database.getMetadata().getSchema().reload();

    Profile profile = (Profile) database.browseClass("Profile").next();

    final OSQLSynchQuery<Profile> query = new OSQLSynchQuery<Profile>("select from Profile where @rid = ?");
    List<Profile> result = database.query(query, new ORecordId(profile.getId()));

    Assert.assertEquals(result.size(), 1);
  }

  @Test
  public void queryWithRidStringAsParameters() {
    database.getMetadata().getSchema().reload();

    Profile profile = (Profile) database.browseClass("Profile").next();

    OSQLSynchQuery<Profile> query = new OSQLSynchQuery<Profile>("select from Profile where @rid = ?");
    List<Profile> result = database.query(query, profile.getId());

    Assert.assertEquals(result.size(), 1);

    // TEST WITHOUT # AS PREFIX
    query = new OSQLSynchQuery<Profile>("select from Profile where @rid = ?");
    result = database.query(query, profile.getId().substring(1));

    Assert.assertEquals(result.size(), 1);
  }

  @Test
  public void commandWithNamedParameters() {
    database.getMetadata().getSchema().reload();

    final OSQLSynchQuery<Profile> query = new OSQLSynchQuery<Profile>(
        "select from Profile where name = :name and surname = :surname");

    HashMap<String, String> params = new HashMap<String, String>();
    params.put("name", "Barack");
    params.put("surname", "Obama");

    List<Profile> result = database.command(query).execute(params);
    Assert.assertTrue(result.size() != 0);
  }

  @Test
  public void commandWithWrongNamedParameters() {
    try {
      database.getMetadata().getSchema().reload();

      final OSQLSynchQuery<Profile> query = new OSQLSynchQuery<Profile>(
          "select from Profile where name = :name and surname = :surname%");

      HashMap<String, String> params = new HashMap<String, String>();
      params.put("name", "Barack");
      params.put("surname", "Obama");

      List<Profile> result = database.command(query).execute(params);
      Assert.fail();
    } catch (OResponseProcessingException e) {
      Assert.assertTrue(e.getCause() instanceof OQueryParsingException);
    } catch (OQueryParsingException e) {
      Assert.assertTrue(true);
    }
  }

  @Test
  public void queryWithNamedParameters() {
    database.getMetadata().getSchema().reload();

    final OSQLSynchQuery<Profile> query = new OSQLSynchQuery<Profile>(
        "select from Profile where name = :name and surname = :surname");

    HashMap<String, String> params = new HashMap<String, String>();
    params.put("name", "Barack");
    params.put("surname", "Obama");

    List<Profile> result = database.query(query, params);
    Assert.assertTrue(result.size() != 0);
  }

  @Test
  public void queryWithObjectAsParameter() {
    database.getMetadata().getSchema().reload();

    final OSQLSynchQuery<Profile> query = new OSQLSynchQuery<Profile>(
        "select from Profile where name = :name and surname = :surname");

    HashMap<String, String> params = new HashMap<String, String>();
    params.put("name", "Barack");
    params.put("surname", "Obama");

    List<Profile> result = database.query(query, params);
    Assert.assertTrue(result.size() != 0);

    Profile obama = result.get(0);

    result = database.query(new OSQLSynchQuery<Profile>("select from Profile where followings contains ( @Rid = :who )"), obama);
    Assert.assertTrue(result.size() != 0);
  }

  @Test
  public void queryWithListOfObjectAsParameter() {
    database.getMetadata().getSchema().reload();

    final OSQLSynchQuery<Profile> query = new OSQLSynchQuery<Profile>(
        "select from Profile where name = :name and surname = :surname");

    HashMap<String, String> params = new HashMap<String, String>();
    params.put("name", "Barack");
    params.put("surname", "Obama");

    List<Profile> result = database.query(query, params);
    Assert.assertTrue(result.size() != 0);

    result = database.query(new OSQLSynchQuery<Profile>("select from Profile where followings in (:who)"), result);
    Assert.assertTrue(result.size() != 0);
  }

  @Test
  public void queryConcatAttrib() {
    database.getMetadata().getSchema().reload();

    Assert.assertTrue(database.query(new OSQLSynchQuery<Profile>("select from City where country.@class = 'Country'")).size() > 0);
    Assert.assertEquals(database.query(new OSQLSynchQuery<Profile>("select from City where country.@class = 'Country22'")).size(),
        0);

  }

  @Test
  public void queryPreparredTwice() {
    database.getMetadata().getSchema().reload();

    final OSQLSynchQuery<Profile> query = new OSQLSynchQuery<Profile>(
        "select from Profile where name = :name and surname = :surname");

    HashMap<String, String> params = new HashMap<String, String>();
    params.put("name", "Barack");
    params.put("surname", "Obama");

    List<Profile> result = database.query(query, params);
    Assert.assertTrue(result.size() != 0);

    result = database.query(query, params);
    Assert.assertTrue(result.size() != 0);
  }

  @Test
  public void commandPreparredTwice() {
    database.getMetadata().getSchema().reload();

    final OSQLSynchQuery<Profile> query = new OSQLSynchQuery<Profile>(
        "select from Profile where name = :name and surname = :surname");

    HashMap<String, String> params = new HashMap<String, String>();
    params.put("name", "Barack");
    params.put("surname", "Obama");

    List<Profile> result = database.command(query).execute(params);
    Assert.assertTrue(result.size() != 0);

    result = database.command(query).execute(params);
    Assert.assertTrue(result.size() != 0);
  }

  @Test(dependsOnMethods = "oidentifableFieldsTest")
  public void testEmbeddedDeletion() throws Exception {
    Parent parent = database.newInstance(Parent.class);
    parent.setName("Big Parent");

    EmbeddedChild embedded = database.newInstance(EmbeddedChild.class);
    embedded.setName("Little Child");

    parent.setEmbeddedChild(embedded);

    parent = database.save(parent);

    List<Parent> presult = database.query(new OSQLSynchQuery<Parent>("select from Parent"));
    List<EmbeddedChild> cresult = database.query(new OSQLSynchQuery<EmbeddedChild>("select from EmbeddedChild"));
    Assert.assertEquals(presult.size(), 1);
    Assert.assertEquals(cresult.size(), 0);

    EmbeddedChild child = database.newInstance(EmbeddedChild.class);
    child.setName("Little Child");
    parent.setChild(child);

    parent = database.save(parent);

    presult = database.query(new OSQLSynchQuery<Parent>("select from Parent"));
    cresult = database.query(new OSQLSynchQuery<EmbeddedChild>("select from EmbeddedChild"));
    Assert.assertEquals(presult.size(), 1);
    Assert.assertEquals(cresult.size(), 1);

    database.delete(parent);

    presult = database.query(new OSQLSynchQuery<Parent>("select * from Parent"));
    cresult = database.query(new OSQLSynchQuery<EmbeddedChild>("select * from EmbeddedChild"));

    Assert.assertEquals(presult.size(), 0);
    Assert.assertEquals(cresult.size(), 1);

    database.delete(child);

    presult = database.query(new OSQLSynchQuery<Parent>("select * from Parent"));
    cresult = database.query(new OSQLSynchQuery<EmbeddedChild>("select * from EmbeddedChild"));

    Assert.assertEquals(presult.size(), 0);
    Assert.assertEquals(cresult.size(), 0);
  }

  public void testEmbeddedBinary() {
    database.getMetadata().getSchema().reload();

    Account a = new Account(0, "Chris", "Martin");
    a.setThumbnail(new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 });
    a = database.save(a);
    database.close();

    database = OObjectDatabasePool.global().acquire(url, "admin", "admin");
    Account aa = (Account) database.load((ORID) a.getRid());
    Assert.assertNotNull(a.getThumbnail());
    Assert.assertNotNull(aa.getThumbnail());
    byte[] b = aa.getThumbnail();
    for (int i = 0; i < 10; ++i)
      Assert.assertEquals(b[i], i);
  }

  @Test
  public void queryById() {
    List<Profile> result1 = database.query(new OSQLSynchQuery<Profile>("select from Profile limit 1"));

    List<Profile> result2 = database.query(new OSQLSynchQuery<Profile>("select from Profile where @rid = ?"), result1.get(0)
        .getId());

    Assert.assertTrue(result2.size() != 0);
  }
}
TOP

Related Classes of com.orientechnologies.orient.test.database.auto.CRUDObjectPhysicalTest

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.