*/
public void testReadCachedAssoc()
{
Metaclass clazz = m_metadata.getMetaclass("CachedVirtual");
InstanceList list;
Instance inst;
Instance assoc;
m_context.getGlobalCache().clear();
clazz.setValue("readCount", Primitive.ZERO_INTEGER);
// This query fills the cache with key (CachedVirtual . OID:1:I1:3)
list = Query.createRead(clazz, parse("(x (assoc x))"), parseEval("`(= (@) ,(oid 3))"), null, -1, 0, false, Query.SEC_ALL, m_context).read();
assertEquals(Primitive.createInteger(1), clazz.getValue("readCount")); // verify that the read was executed
assertEquals(1, list.size());
inst = list.getInstance(0);
assertEquals("303", inst.getValue("x"));
assertNull(inst.getValue("assoc"));
assertEquals(Primitive.createInteger(1), clazz.getValue("readCount")); // no lazy
m_context.removeInstance(inst);
inst = null;
list = null;
// The association query does not hit the cache because key is (:class CachedVirtual "(= (@ <"<OID_TYPE>">) #<OID:1:I1:3>)")
list = Query.createRead(clazz, parse("(x (assoc x))"), parseEval("`(= (@) ,(oid 2))"), null, -1, 0, false, Query.SEC_ALL, m_context).read();
assertEquals(Primitive.createInteger(3), clazz.getValue("readCount")); // reads both again
assertEquals(1, list.size());
inst = list.getInstance(0);
assertEquals("202", inst.getValue("x"));
assoc = (Instance)inst.getValue("assoc");
assertEquals("303", assoc.getValue("x"));
assertEquals(Primitive.createInteger(3), clazz.getValue("readCount")); // no lazy
m_context.removeInstance(inst);
m_context.removeInstance(assoc);
assoc = inst = null;
list = null;
// The association query does hit the cache because the where clause cache key is now known (from the previous read)
list = Query.createRead(clazz, parse("(x (assoc x))"), parseEval("`(= (@) ,(oid 4))"), null, -1, 0, false, Query.SEC_ALL, m_context).read();
assertEquals(Primitive.createInteger(4), clazz.getValue("readCount")); // reads (oid 4), but (oid 3) is taken from cache
assertEquals(1, list.size());
inst = list.getInstance(0);
assertEquals("404", inst.getValue("x"));
assoc = (Instance)inst.getValue("assoc");
assertEquals("303", assoc.getValue("x"));
assertEquals(Primitive.createInteger(4), clazz.getValue("readCount")); // no lazy
m_context.removeInstance(inst);
m_context.removeInstance(assoc);
assoc = inst = null;
list = null;
// Clear caches
m_context.getUnitOfWork().rollback();
m_context.getGlobalCache().clear();
// This query should miss the cache
list = Query.createRead(clazz, parse("(x (assoc x))"), parseEval("`(= (@) ,(oid 2))"), null, -1, 0, false, Query.SEC_ALL, m_context).read();
assertEquals(Primitive.createInteger(6), clazz.getValue("readCount")); // cache miss
assertEquals(1, list.size());
inst = list.getInstance(0);
assertEquals("202", inst.getValue("x"));
assoc = (Instance)inst.getValue("assoc");
assertEquals("303", assoc.getValue("x"));
assertEquals(Primitive.createInteger(6), clazz.getValue("readCount")); // no lazy
}