/** * Creates a SelectQuery that selects objects of a given persistent class. * * @param rootClass * the Class of objects fetched by this query. * * @since 4.0 */ public static <T> SelectQuery<T> query(Class<T> rootClass) { return new SelectQuery<T>(rootClass); }
/** * Creates a SelectQuery that selects objects of a given persistent class * that match supplied qualifier. * * @param rootClass * the Class of objects fetched by this query. * @param qualifier * an Expression indicating which objects should be fetched. * * @since 4.0 */ public static <T> SelectQuery<T> query(Class<T> rootClass, Expression qualifier) { return new SelectQuery<T>(rootClass, qualifier); }
protected Object create(String name, Object namingContext) { SelectQuery query = new SelectQuery(); query.setName(name); return query; }
/** * @since 4.0 */ public static SelectQuery<DataRow> dataRowQuery(Class<?> rootClass) { // create a query replica that would fetch DataRows SelectQuery<DataRow> query = new SelectQuery<DataRow>(); query.setRoot(rootClass); query.metaData.setFetchingDataRows(true); return query; }
/** * Get a persistent entity based on a key value pair for a specific class. */ private Object getEntity(Object objectContext, Class<?> clazz, String key, Object value) { try { ObjectContext context = objectContext == null ? this.getReadOnlyObjectContext() : (ObjectContext) objectContext; Expression exp = ExpressionFactory.matchExp(key, value); SelectQuery query = new SelectQuery(clazz, exp); List<?> list = context.performQuery(query); return list.size() == 0 ? null : list.get(0); } catch (Exception e) { return null; } }
SelectQuery<Persistent> createSelectQuery(ObjEntity entity, List<Expression> expressions) { SelectQuery<Persistent> query = new SelectQuery<>(entity, ExpressionFactory.joinExp(Expression.OR, expressions)); if (entity.equals(rootEntity)) { query.setPrefetchTree(internalQuery.getPrefetchTree()); } return query; }
public SelectQuery getSelectQuery() { SelectQuery query = new SelectQuery(queryTarget.getObjEntity()); if (!conditions.isEmpty()) { Expression qualifier = ExpressionFactory.joinExp(Expression.AND, conditions); query.setQualifier(qualifier); } return query; } }
/** * Creates and returns a select query that can be used to fetch an object given an * ObjectId. */ public static SelectQuery selectObjectForId(ObjectId oid) { return new SelectQuery(oid.getEntityName(), ExpressionFactory.matchAllDbExp(oid .getIdSnapshot(), Expression.EQUAL_TO)); }
<T> SelectQuery<T> basicSelect(SelectContext<T> context) { // selecting by ID overrides any explicit SelectQuery... if (context.isById()) { Class<T> root = context.getType(); SelectQuery<T> query = new SelectQuery<>(root); query.andQualifier(buildIdQualifer(context.getEntity().getAgEntity(), context.getId())); return query; } return context.getSelect() != null ? context.getSelect() : new SelectQuery<>(context.getType()); }
SelectQuery<Object> createSelectQuery(List<Expression> expressions) { SelectQuery<Object> query = new SelectQuery<>(rootEntity, ExpressionFactory.joinExp(Expression.OR, expressions)); query.setFetchingDataRows(internalQuery.isFetchingDataRows()); if (!query.isFetchingDataRows()) { query.setPrefetchTree(internalQuery.getPrefetchTree()); } return query; }
@Test public void testPost_ToOne_BadFK() { insert("e2", "id, name", "1, 'xxx'"); insert("e2", "id, name", "8, 'yyy'"); Response response1 = target("/e3").request() .post(Entity.json("{\"e2\":15,\"name\":\"MM\"}")); assertEquals(Status.NOT_FOUND.getStatusCode(), response1.getStatus()); assertEquals(0, newContext().select(new SelectQuery<E3>(E3.class)).size()); }
@Test public void testPost_Default_NoData() { ObjectContext context = newContext(); Response response1 = target("/e4/defaultdata").request() .post(Entity.json("{\"cVarchar\":\"zzz\"}")); assertEquals(Status.CREATED.getStatusCode(), response1.getStatus()); assertEquals("{\"success\":true}", response1.readEntity(String.class)); E4 e41 = (E4) Cayenne.objectForQuery(context, new SelectQuery<E4>(E4.class)); Assert.assertEquals("zzz", e41.getCVarchar()); }
@Override protected Query createReplacementQuery(EntityResolver resolver) { if (objectId == null) { throw new CayenneRuntimeException("Can't resolve query - objectId is null."); } if (objectId.isTemporary() && !objectId.isReplacementIdAttached()) { throw new CayenneRuntimeException("Can't build a query for temporary id: %s", objectId); } SelectQuery<Object> query = new SelectQuery<>(objectId.getEntityName(), ExpressionFactory .matchAllDbExp(objectId.getIdSnapshot(), Expression.EQUAL_TO)); // if we got to the point of fetch, always force refresh.... query.setFetchingDataRows(fetchingDataRows); return query; }
@Override protected Query createReplacementQuery(EntityResolver resolver) { if (objectId.isTemporary() && !objectId.isReplacementIdAttached()) { throw new CayenneRuntimeException("Can't build a query for relationship '%s' for temporary id: %s" , relationshipName, objectId); } ObjRelationship relationship = getRelationship(resolver); // build executable select... Expression qualifier = ExpressionFactory.matchDbExp(relationship .getReverseDbRelationshipPath(), objectId); SelectQuery<Object> query = new SelectQuery<Object>( (ObjEntity) relationship.getTargetEntity(), qualifier); query.setStatementFetchSize(statementFetchSize); return query; }
protected Query createReplacementQuery(EntityResolver resolver) { if (objectId.isTemporary() && !objectId.isReplacementIdAttached()) { throw new CayenneRuntimeException("Can't build a query for relationship '" + relationshipName + "' for temporary id: " + objectId); } ObjRelationship relationship = getRelationship(resolver); // build executable select... Expression qualifier = ExpressionFactory.matchDbExp(relationship .getReverseDbRelationshipPath(), objectId); SelectQuery query = new SelectQuery( (ObjEntity) relationship.getTargetEntity(), qualifier); query.setRefreshingObjects(refreshing); return query; }
protected Query createReplacementQuery(EntityResolver resolver) { if (objectId == null) { throw new CayenneRuntimeException("Can't resolve query - objectId is null."); } if (objectId.isTemporary() && !objectId.isReplacementIdAttached()) { throw new CayenneRuntimeException("Can't build a query for temporary id: " + objectId); } SelectQuery query = new SelectQuery(objectId.getEntityName(), ExpressionFactory .matchAllDbExp(objectId.getIdSnapshot(), Expression.EQUAL_TO)); // if we got to the point of fetch, always force refresh.... query.setRefreshingObjects(true); query.setFetchingDataRows(fetchingDataRows); return query; }
@SuppressWarnings("deprecation") @Override protected Query createReplacementQuery(EntityResolver resolver) { ObjEntity entity = resolveEntity(resolver); Map<String, ?> id = resolveId(entity); SelectQuery<Object> query = new SelectQuery<>(); query.setRoot(entity); query.setFetchingDataRows(fetchingDataRows); query.setQualifier(matchAllDbExp(id, Expression.EQUAL_TO)); // note on caching... this hits query cache instead of object cache... // until we merge the two this may result in not using the cache // optimally - object cache may have an object, but query cache will not query.setCacheGroup(cacheGroup); query.setCacheStrategy(cacheStrategy); query.setPrefetchTree(prefetches); return query; }
@Test public void testPost_ToOne() { insert("e2", "id, name", "1, 'xxx'"); insert("e2", "id, name", "8, 'yyy'"); Response response1 = target("/e3").request() .post(Entity.json("{\"e2\":8,\"name\":\"MM\"}")); assertEquals(Status.CREATED.getStatusCode(), response1.getStatus()); E3 e3 = (E3) Cayenne.objectForQuery(newContext(), new SelectQuery<>(E3.class)); int id = Cayenne.intPKForObject(e3); assertEquals("{\"data\":[{\"id\":" + id + ",\"name\":\"MM\",\"phoneNumber\":null}],\"total\":1}", response1.readEntity(String.class)); newContext().invalidateObjects(e3); assertEquals("MM", e3.getName()); assertEquals(8, Cayenne.intPKForObject(e3.getE2())); }
@Test public void testPost_ToMany() { insert("e3", "id, name", "1, 'xxx'"); insert("e3", "id, name", "8, 'yyy'"); Response response = target("/e2") .queryParam("include", E2.E3S.getName()) .queryParam("exclude", E2.ADDRESS.getName(), E2.E3S.dot(E3.NAME).getName(), E2.E3S.dot(E3.PHONE_NUMBER).getName()) .request() .post(Entity.json("{\"e3s\":[1,8],\"name\":\"MM\"}")); E2 e2 = (E2) Cayenne.objectForQuery(newContext(), new SelectQuery<>(E2.class)); int id = Cayenne.intPKForObject(e2); onResponse(response) .statusEquals(Status.CREATED) .bodyEquals(1, "{\"id\":" + id + ",\"e3s\":[{\"id\":1},{\"id\":8}],\"name\":\"MM\"}"); assertEquals(2, intForQuery("SELECT COUNT(1) FROM utest.e3 WHERE e2_id = " + id)); }
@Test public void testById_WithQuery() { SelectQuery<E1> select = new SelectQuery<E1>(E1.class); SelectContext<E1> c = new SelectContext<>(E1.class); c.setId(1); c.setSelect(select); c.setEntity(getResourceEntity(E1.class)); SelectQuery<E1> s2 = makeQueryStage.basicSelect(c); assertNotNull(s2); assertNotSame(select, s2); assertSame(E1.class, s2.getRoot()); } }