use of org.apache.cayenne.query.Query in project cayenne by apache.
the class DataContextDelegateIT method testWillPerformQuery.
@Test
public void testWillPerformQuery() throws Exception {
final List<Query> queriesPerformed = new ArrayList<Query>(1);
DataContextDelegate delegate = new MockDataContextDelegate() {
@Override
public Query willPerformQuery(DataContext context, Query query) {
queriesPerformed.add(query);
return query;
}
};
context.setDelegate(delegate);
// test that delegate is consulted before select
SelectQuery query = new SelectQuery(Gallery.class);
List<?> results = context.performQuery(query);
assertTrue("Delegate is not notified of a query being run.", queriesPerformed.contains(query));
assertEquals(1, queriesPerformed.size());
assertNotNull(results);
}
use of org.apache.cayenne.query.Query in project cayenne by apache.
the class JdbcPkGenerator method longPkFromDatabase.
/**
* Performs primary key generation ignoring cache. Generates a range of
* primary keys as specified by "pkCacheSize" bean property.
* <p>
* This method is called internally from "generatePkForDbEntity" and then
* generated range of key values is saved in cache for performance.
* Subclasses that implement different primary key generation solutions
* should override this method, not "generatePkForDbEntity".
* </p>
*
* @since 3.0
*/
protected long longPkFromDatabase(DataNode node, DbEntity entity) throws Exception {
String select = "SELECT #result('NEXT_ID' 'long' 'NEXT_ID') FROM AUTO_PK_SUPPORT " + "WHERE TABLE_NAME = '" + entity.getName() + '\'';
// run queries via DataNode to utilize its transactional behavior
List<Query> queries = new ArrayList<>(2);
queries.add(new SQLTemplate(entity, select));
queries.add(new SQLTemplate(entity, pkUpdateString(entity.getName())));
PkRetrieveProcessor observer = new PkRetrieveProcessor(entity.getName());
node.performQueries(queries, observer);
return observer.getId();
}
use of org.apache.cayenne.query.Query in project cayenne by apache.
the class FrontBasePkGenerator method longPkFromDatabase.
/**
* @since 3.0
*/
@Override
protected long longPkFromDatabase(DataNode node, DbEntity entity) throws Exception {
String template = "SELECT #result('UNIQUE' 'long') FROM " + entity.getName();
final long[] pkHolder = new long[1];
SQLTemplate query = new SQLTemplate(entity, template);
OperationObserver observer = new DoNothingOperationObserver() {
@Override
public void nextRows(Query query, List<?> dataRows) {
if (dataRows.size() != 1) {
throw new CayenneRuntimeException("Error fetching PK. Expected one row, got %d", dataRows.size());
}
DataRow row = (DataRow) dataRows.get(0);
Number pk = (Number) row.get("UNIQUE");
pkHolder[0] = pk.longValue();
}
};
node.performQueries(Collections.singleton((Query) query), observer);
return pkHolder[0];
}
use of org.apache.cayenne.query.Query in project cayenne by apache.
the class CayenneContextIT method testBeforePropertyReadShouldInflateHollow.
@Test
public void testBeforePropertyReadShouldInflateHollow() {
ObjectId gid = new ObjectId("MtTable1", "a", "b");
final ClientMtTable1 inflated = new ClientMtTable1();
inflated.setPersistenceState(PersistenceState.COMMITTED);
inflated.setObjectId(gid);
inflated.setGlobalAttribute1("abc");
ClientConnection connection = mock(ClientConnection.class);
when(connection.sendMessage((ClientMessage) any())).thenAnswer(new Answer<Object>() {
public Object answer(InvocationOnMock invocation) {
ClientMessage arg = (ClientMessage) invocation.getArguments()[0];
if (arg instanceof BootstrapMessage) {
return new EntityResolver();
} else {
return new GenericResponse(Arrays.asList(inflated));
}
}
});
ClientChannel channel = new ClientChannel(connection, false, new MockEventManager(), false);
// check that a HOLLOW object is infalted on "beforePropertyRead"
ClientMtTable1 hollow = new ClientMtTable1();
hollow.setPersistenceState(PersistenceState.HOLLOW);
hollow.setObjectId(gid);
final boolean[] selectExecuted = new boolean[1];
CayenneContext context = new CayenneContext(channel) {
@Override
public List<?> performQuery(Query query) {
selectExecuted[0] = true;
return super.performQuery(query);
}
};
context.setEntityResolver(serverContext.getEntityResolver().getClientEntityResolver());
context.graphManager.registerNode(hollow.getObjectId(), hollow);
// testing this...
context.prepareForAccess(hollow, ClientMtTable1.GLOBAL_ATTRIBUTE1_PROPERTY, false);
assertTrue(selectExecuted[0]);
assertSame(hollow, context.getGraphManager().getNode(gid));
assertEquals(inflated.getGlobalAttribute1Direct(), hollow.getGlobalAttribute1Direct());
assertEquals(PersistenceState.COMMITTED, hollow.getPersistenceState());
}
use of org.apache.cayenne.query.Query in project cayenne by apache.
the class MockDataNode method initWithPresetResults.
private void initWithPresetResults(Collection queries, OperationObserver resultConsumer) {
// stick preset results to the consumer
Iterator it = queries.iterator();
while (it.hasNext()) {
Query query = (Query) it.next();
resultConsumer.nextRows(query, (List) results.get(query));
}
}
Aggregations