This is an automated email from the ASF dual-hosted git repository. ntimofeev pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/cayenne.git
The following commit(s) were added to refs/heads/master by this push: new b6000d6d9 CAY-2859 Redesign SelectById factory methods b6000d6d9 is described below commit b6000d6d9aa0fcbc6ee659a4364ddd0b2ddf338b Author: Nikita Timofeev <stari...@gmail.com> AuthorDate: Tue Nov 5 20:10:20 2024 +0400 CAY-2859 Redesign SelectById factory methods --- RELEASE-NOTES.txt | 1 + UPGRADE.txt | 5 + .../java/org/apache/cayenne/query/SelectById.java | 301 ++++++++++++++++++- .../org/apache/cayenne/query/SelectById_RunIT.java | 320 ++++++++++++++++++--- 4 files changed, 574 insertions(+), 53 deletions(-) diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt index e4f34f787..51ebf70d6 100644 --- a/RELEASE-NOTES.txt +++ b/RELEASE-NOTES.txt @@ -13,6 +13,7 @@ Date: ---------------------------------- Changes/New Features: +CAY-2859 Redesign SelectById factory methods CAY-2871 QualifierTranslator breaks on a relationship with a compound FK CAY-2872 CayenneModeler "Documentation" link is broken CAY-2873 Change Orderings.orderedList() to accept a Collection rather than a List diff --git a/UPGRADE.txt b/UPGRADE.txt index fd6bf83b4..95bccd5f9 100644 --- a/UPGRADE.txt +++ b/UPGRADE.txt @@ -5,6 +5,11 @@ IMPORTANT: be sure to read all notes for the intermediate releases between your current release and the release you are upgrading to. ------------------------------------------------------------------------------- +UPGRADING TO 5.0.M2 + +* Per CAY-2859 SelectById query factory methods are redesigned with a bunch of old methods deprecated, +so you should update your calls accordingly. + UPGRADING TO 5.0.M1 * Per CAY-2737 All code deprecated in Cayenne 4.1 and 4.2 was deleted, please review your code before upgrading. diff --git a/cayenne/src/main/java/org/apache/cayenne/query/SelectById.java b/cayenne/src/main/java/org/apache/cayenne/query/SelectById.java index 1659ea8d4..ebffd4434 100644 --- a/cayenne/src/main/java/org/apache/cayenne/query/SelectById.java +++ b/cayenne/src/main/java/org/apache/cayenne/query/SelectById.java @@ -31,6 +31,7 @@ import org.apache.cayenne.map.ObjEntity; import java.io.Serializable; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.List; import java.util.Map; @@ -55,28 +56,141 @@ public class SelectById<T> extends IndirectQuery implements Select<T> { String cacheGroup; PrefetchTreeNode prefetches; - public static <T> SelectById<T> query(Class<T> entityType, Object id) { + /* Object query factory methods */ + + /** + * @since 5.0 + */ + public static <T> SelectById<T> queryId(Class<T> entityType, Object id) { QueryRoot root = new ByEntityTypeResolver(entityType); IdSpec idSpec = new SingleScalarIdSpec(id); return new SelectById<>(root, idSpec); } - public static <T> SelectById<T> query(Class<T> entityType, Map<String, ?> id) { + /** + * @since 5.0 + */ + public static <T> SelectById<T> queryMap(Class<T> entityType, Map<String, ?> id) { QueryRoot root = new ByEntityTypeResolver(entityType); IdSpec idSpec = new SingleMapIdSpec(id); return new SelectById<>(root, idSpec); } - public static <T> SelectById<T> query(Class<T> entityType, ObjectId id) { + /** + * @since 5.0 + */ + public static <T> SelectById<T> queryObjectId(Class<T> entityType, ObjectId id) { checkObjectId(id); QueryRoot root = new ByEntityNameResolver(id.getEntityName()); IdSpec idSpec = new SingleMapIdSpec(id.getIdSnapshot()); return new SelectById<>(root, idSpec); } + /** + * @since 5.0 + */ + public static <T> SelectById<T> queryIds(Class<T> entityType, Object... ids) { + QueryRoot root = new ByEntityTypeResolver(entityType); + IdSpec idSpec = new MultiScalarIdSpec(Arrays.asList(ids)); + return new SelectById<>(root, idSpec); + } + + /** + * @since 5.0 + */ + public static <T> SelectById<T> queryIdsCollection(Class<T> entityType, Collection<Object> ids) { + QueryRoot root = new ByEntityTypeResolver(entityType); + IdSpec idSpec = new MultiScalarIdSpec(ids); + return new SelectById<>(root, idSpec); + } + + /** + * @since 5.0 + */ + @SafeVarargs + public static <T> SelectById<T> queryMaps(Class<T> entityType, Map<String, ?>... ids) { + QueryRoot root = new ByEntityTypeResolver(entityType); + IdSpec idSpec = MultiMapIdSpec.ofMap(ids); + return new SelectById<>(root, idSpec); + } + + /** + * @since 5.0 + */ + public static <T> SelectById<T> queryMapsCollection(Class<T> entityType, Collection<Map<String, ?>> ids) { + QueryRoot root = new ByEntityTypeResolver(entityType); + IdSpec idSpec = MultiMapIdSpec.ofMapCollection(ids); + return new SelectById<>(root, idSpec); + } + + /** + * @since 5.0 + */ + public static <T> SelectById<T> queryObjectIds(Class<T> entityType, ObjectId... ids) { + if(ids == null || ids.length == 0) { + throw new CayenneRuntimeException("Null or empty ids"); + } + String entityName = ids[0].getEntityName(); + for(ObjectId id : ids) { + checkObjectId(id, entityName); + } + + QueryRoot root = new ByEntityNameResolver(entityName); + IdSpec idSpec = MultiMapIdSpec.ofObjectId(ids); + return new SelectById<>(root, idSpec); + } + + /** + * @since 5.0 + */ + public static <T> SelectById<T> queryObjectIdsCollection(Class<T> entityType, Collection<ObjectId> ids) { + if(ids == null || ids.isEmpty()) { + throw new CayenneRuntimeException("Null or empty ids"); + } + String entityName = ids.iterator().next().getEntityName(); + for(ObjectId id : ids) { + checkObjectId(id, entityName); + } + + QueryRoot root = new ByEntityNameResolver(entityName); + IdSpec idSpec = MultiMapIdSpec.ofObjectIdCollection(ids); + return new SelectById<>(root, idSpec); + } + + /* Deprecated since 5.0 factory methods */ + /** * @since 4.2 + * @deprecated since 5.0, use {@link #queryId(Class, Object)} */ + @Deprecated(since = "5.0", forRemoval = true) + public static <T> SelectById<T> query(Class<T> entityType, Object id) { + return queryId(entityType, id); + } + + /** + * @since 4.2 + * @deprecated since 5.0, use {@link #queryMap(Class, Map)} + */ + @Deprecated(since = "5.0", forRemoval = true) + public static <T> SelectById<T> query(Class<T> entityType, Map<String, ?> id) { + return queryMap(entityType, id); + } + + /** + * @since 4.2 + * @deprecated since 5.0, use {@link #queryObjectId(Class, ObjectId)} + */ + @Deprecated(since = "5.0", forRemoval = true) + public static <T> SelectById<T> query(Class<T> entityType, ObjectId id) { + return queryObjectId(entityType, id); + } + + /** + * @since 4.2 + * @deprecated since 5.0, use {@link #queryIds(Class, Object...)} + */ + @Deprecated(since = "5.0", forRemoval = true) public static <T> SelectById<T> query(Class<T> entityType, Object firstId, Object... otherIds) { QueryRoot root = new ByEntityTypeResolver(entityType); IdSpec idSpec = new MultiScalarIdSpec(firstId, otherIds); @@ -85,7 +199,9 @@ public class SelectById<T> extends IndirectQuery implements Select<T> { /** * @since 4.2 + * @deprecated since 5.0, use {@link #queryIdsCollection(Class, Collection)} */ + @Deprecated(since = "5.0", forRemoval = true) public static <T> SelectById<T> query(Class<T> entityType, Collection<Object> ids) { QueryRoot root = new ByEntityTypeResolver(entityType); IdSpec idSpec = new MultiScalarIdSpec(ids); @@ -94,17 +210,21 @@ public class SelectById<T> extends IndirectQuery implements Select<T> { /** * @since 4.2 + * @deprecated since 5.0, use {@link #queryMaps(Class, Map[])} */ + @Deprecated(since = "5.0", forRemoval = true) @SafeVarargs public static <T> SelectById<T> query(Class<T> entityType, Map<String, ?> firstId, Map<String, ?>... otherIds) { QueryRoot root = new ByEntityTypeResolver(entityType); - IdSpec idSpec = new MultiMapIdSpec(firstId, otherIds); + IdSpec idSpec = MultiMapIdSpec.ofMap(firstId, otherIds); return new SelectById<>(root, idSpec); } /** * @since 4.2 + * @deprecated since 5.0, use {@link #queryObjectIds(Class, ObjectId...)} */ + @Deprecated(since = "5.0", forRemoval = true) public static <T> SelectById<T> query(Class<T> entityType, ObjectId firstId, ObjectId... otherIds) { checkObjectId(firstId); for(ObjectId id : otherIds) { @@ -112,32 +232,143 @@ public class SelectById<T> extends IndirectQuery implements Select<T> { } QueryRoot root = new ByEntityNameResolver(firstId.getEntityName()); - IdSpec idSpec = new MultiMapIdSpec(firstId, otherIds); + IdSpec idSpec = MultiMapIdSpec.ofObjectId(firstId, otherIds); return new SelectById<>(root, idSpec); } - public static SelectById<DataRow> dataRowQuery(Class<?> entityType, Object id) { + + /* DataRow factory methods */ + + /** + * @since 5.0 + */ + public static SelectById<DataRow> dataRowQueryId(Class<?> entityType, Object id) { QueryRoot root = new ByEntityTypeResolver(entityType); IdSpec idSpec = new SingleScalarIdSpec(id); return new SelectById<>(root, idSpec, true); } - public static SelectById<DataRow> dataRowQuery(Class<?> entityType, Map<String, ?> id) { + /** + * @since 5.0 + */ + public static SelectById<DataRow> dataRowQueryMap(Class<?> entityType, Map<String, ?> id) { QueryRoot root = new ByEntityTypeResolver(entityType); IdSpec idSpec = new SingleMapIdSpec(id); return new SelectById<>(root, idSpec, true); } - public static SelectById<DataRow> dataRowQuery(ObjectId id) { + /** + * @since 5.0 + */ + public static SelectById<DataRow> dataRowQueryObjectId(ObjectId id) { checkObjectId(id); QueryRoot root = new ByEntityNameResolver(id.getEntityName()); IdSpec idSpec = new SingleMapIdSpec(id.getIdSnapshot()); return new SelectById<>(root, idSpec, true); } + /** + * @since 5.0 + */ + public static SelectById<DataRow> dataRowQueryIds(Class<?> entityType, Object... ids) { + QueryRoot root = new ByEntityTypeResolver(entityType); + IdSpec idSpec = new MultiScalarIdSpec(Arrays.asList(ids)); + return new SelectById<>(root, idSpec, true); + } + + /** + * @since 5.0 + */ + public static SelectById<DataRow> dataRowQueryIdsCollection(Class<?> entityType, Collection<Object> ids) { + QueryRoot root = new ByEntityTypeResolver(entityType); + IdSpec idSpec = new MultiScalarIdSpec(ids); + return new SelectById<>(root, idSpec, true); + } + + /** + * @since 5.0 + */ + @SafeVarargs + public static SelectById<DataRow> dataRowQueryMaps(Class<?> entityType, Map<String, ?>... ids) { + QueryRoot root = new ByEntityTypeResolver(entityType); + IdSpec idSpec = MultiMapIdSpec.ofMap(ids); + return new SelectById<>(root, idSpec, true); + } + + /** + * @since 5.0 + */ + public static SelectById<DataRow> dataRowQueryMapsCollection(Class<?> entityType, Collection<Map<String, ?>> ids) { + QueryRoot root = new ByEntityTypeResolver(entityType); + IdSpec idSpec = MultiMapIdSpec.ofMapCollection(ids); + return new SelectById<>(root, idSpec, true); + } + + /** + * @since 5.0 + */ + public static SelectById<DataRow> dataRowQueryObjectIds(ObjectId... ids) { + if(ids == null || ids.length == 0) { + throw new CayenneRuntimeException("Null or empty ids"); + } + String entityName = ids[0].getEntityName(); + for(ObjectId id : ids) { + checkObjectId(id, entityName); + } + + QueryRoot root = new ByEntityNameResolver(entityName); + IdSpec idSpec = MultiMapIdSpec.ofObjectId(ids); + return new SelectById<>(root, idSpec, true); + } + + /** + * @since 5.0 + */ + public static SelectById<DataRow> dataRowQueryObjectIdsCollection(Collection<ObjectId> ids) { + if(ids == null || ids.isEmpty()) { + throw new CayenneRuntimeException("Null or empty ids"); + } + String entityName = ids.iterator().next().getEntityName(); + for(ObjectId id : ids) { + checkObjectId(id, entityName); + } + + QueryRoot root = new ByEntityNameResolver(entityName); + IdSpec idSpec = MultiMapIdSpec.ofObjectIdCollection(ids); + return new SelectById<>(root, idSpec, true); + } + + /* Deprecated since 5.0 DataRow factory methods */ + + /** + * @deprecated since 5.0, use {@link #dataRowQueryId(Class, Object)} + */ + @Deprecated(since = "5.0", forRemoval = true) + public static SelectById<DataRow> dataRowQuery(Class<?> entityType, Object id) { + return dataRowQueryId(entityType, id); + } + + /** + * @deprecated since 5.0, use {@link #dataRowQueryMap(Class, Map)} + */ + @Deprecated(since = "5.0", forRemoval = true) + public static SelectById<DataRow> dataRowQuery(Class<?> entityType, Map<String, ?> id) { + return dataRowQueryMap(entityType, id); + } + + /** + * @deprecated since 5.0, use {@link #dataRowQueryObjectId(ObjectId)} + */ + @Deprecated(since = "5.0", forRemoval = true) + public static SelectById<DataRow> dataRowQuery(ObjectId id) { + return dataRowQueryObjectId(id); + } + /** * @since 4.2 + * @deprecated since 5.0, use {@link #dataRowQueryIds(Class, Object...)} */ + @Deprecated(since = "5.0", forRemoval = true) public static SelectById<DataRow> dataRowQuery(Class<?> entityType, Object firstId, Object... otherIds) { QueryRoot root = new ByEntityTypeResolver(entityType); IdSpec idSpec = new MultiScalarIdSpec(firstId, otherIds); @@ -146,17 +377,21 @@ public class SelectById<T> extends IndirectQuery implements Select<T> { /** * @since 4.2 + * @deprecated since 5.0, use {@link #dataRowQueryMaps(Class, Map[])} */ + @Deprecated(since = "5.0", forRemoval = true) @SafeVarargs public static SelectById<DataRow> dataRowQuery(Class<?> entityType, Map<String, ?> firstId, Map<String, ?>... otherIds) { QueryRoot root = new ByEntityTypeResolver(entityType); - IdSpec idSpec = new MultiMapIdSpec(firstId, otherIds); + IdSpec idSpec = MultiMapIdSpec.ofMap(firstId, otherIds); return new SelectById<>(root, idSpec, true); } /** * @since 4.2 + * @deprecated since 5.0, use {@link #dataRowQueryObjectIds(ObjectId...)} */ + @Deprecated(since = "5.0", forRemoval = true) public static SelectById<DataRow> dataRowQuery(ObjectId firstId, ObjectId... otherIds) { checkObjectId(firstId); for(ObjectId id : otherIds) { @@ -164,7 +399,7 @@ public class SelectById<T> extends IndirectQuery implements Select<T> { } QueryRoot root = new ByEntityNameResolver(firstId.getEntityName()); - IdSpec idSpec = new MultiMapIdSpec(firstId, otherIds); + IdSpec idSpec = MultiMapIdSpec.ofObjectId(firstId, otherIds); return new SelectById<>(root, idSpec, true); } @@ -378,6 +613,23 @@ public class SelectById<T> extends IndirectQuery implements Select<T> { return result; } + @SafeVarargs + private static <E, R> Collection<R> foldArguments(Function<E, R> mapper, E... other) { + List<R> result = new ArrayList<>(other.length); + for(E next : other) { + result.add(mapper.apply(next)); + } + return result; + } + + private static <E, R> Collection<R> foldArguments(Function<E, R> mapper, Collection<E> other) { + List<R> result = new ArrayList<>(other.size()); + for(E next : other) { + result.add(mapper.apply(next)); + } + return result; + } + protected interface QueryRoot extends Serializable { ObjEntity resolve(EntityResolver resolver); } @@ -437,12 +689,33 @@ public class SelectById<T> extends IndirectQuery implements Select<T> { private final Collection<Map<String, ?>> ids; @SafeVarargs - protected MultiMapIdSpec(Map<String, ?> firstId, Map<String, ?>... otherIds) { - this.ids = foldArguments(Function.identity(), firstId, otherIds); + static MultiMapIdSpec ofMap(Map<String, ?> firstId, Map<String, ?>... otherIds) { + return new MultiMapIdSpec(foldArguments(Function.identity(), firstId, otherIds)); + } + + @SafeVarargs + static MultiMapIdSpec ofMap(Map<String, ?>... ids) { + return new MultiMapIdSpec(foldArguments(Function.identity(), ids)); + } + + static MultiMapIdSpec ofObjectId(ObjectId firstId, ObjectId... otherIds) { + return new MultiMapIdSpec(foldArguments(ObjectId::getIdSnapshot, firstId, otherIds)); + } + + static MultiMapIdSpec ofObjectId(ObjectId... ids) { + return new MultiMapIdSpec(foldArguments(ObjectId::getIdSnapshot, ids)); } - protected MultiMapIdSpec(ObjectId firstId, ObjectId... otherIds) { - this.ids = foldArguments(ObjectId::getIdSnapshot, firstId, otherIds); + static MultiMapIdSpec ofObjectIdCollection(Collection<ObjectId> ids) { + return new MultiMapIdSpec(foldArguments(ObjectId::getIdSnapshot, ids)); + } + + static MultiMapIdSpec ofMapCollection(Collection<Map<String, ?>> ids) { + return new MultiMapIdSpec(ids); + } + + protected MultiMapIdSpec(Collection<Map<String, ?>> ids) { + this.ids = ids; } @Override diff --git a/cayenne/src/test/java/org/apache/cayenne/query/SelectById_RunIT.java b/cayenne/src/test/java/org/apache/cayenne/query/SelectById_RunIT.java index 9d491d3b7..77ee93f5c 100644 --- a/cayenne/src/test/java/org/apache/cayenne/query/SelectById_RunIT.java +++ b/cayenne/src/test/java/org/apache/cayenne/query/SelectById_RunIT.java @@ -79,11 +79,11 @@ public class SelectById_RunIT extends RuntimeCase { public void testIntPk() throws Exception { createTwoArtists(); - Artist a3 = SelectById.query(Artist.class, 3).selectOne(context); + Artist a3 = SelectById.queryId(Artist.class, 3).selectOne(context); assertNotNull(a3); assertEquals("artist3", a3.getArtistName()); - Artist a2 = SelectById.query(Artist.class, 2).selectOne(context); + Artist a2 = SelectById.queryId(Artist.class, 2).selectOne(context); assertNotNull(a2); assertEquals("artist2", a2.getArtistName()); } @@ -92,7 +92,7 @@ public class SelectById_RunIT extends RuntimeCase { public void testIntPkMulti() throws Exception { createTwoArtists(); - List<Artist> artists = SelectById.query(Artist.class, 2, 3) + List<Artist> artists = SelectById.queryIds(Artist.class, 2, 3) .select(context); assertEquals(2, artists.size()); assertThat(artists.get(0), instanceOf(Artist.class)); @@ -102,46 +102,46 @@ public class SelectById_RunIT extends RuntimeCase { public void testIntPkCollection() throws Exception { createTwoArtists(); - List<Artist> artists = SelectById.query(Artist.class, Arrays.asList(1, 2, 3, 4, 5)) + List<Artist> artists = SelectById.queryIdsCollection(Artist.class, Arrays.asList(1, 2, 3, 4, 5)) .select(context); assertEquals(2, artists.size()); assertThat(artists.get(0), instanceOf(Artist.class)); } @Test - public void testIntPk_SelectFirst() throws Exception { + public void testMapPk() throws Exception { createTwoArtists(); - Artist a3 = SelectById.query(Artist.class, 3).selectFirst(context); + Artist a3 = SelectById.queryMap(Artist.class, singletonMap(Artist.ARTIST_ID_PK_COLUMN, 3)).selectOne(context); assertNotNull(a3); assertEquals("artist3", a3.getArtistName()); - Artist a2 = SelectById.query(Artist.class, 2).selectFirst(context); + Artist a2 = SelectById.queryMap(Artist.class, singletonMap(Artist.ARTIST_ID_PK_COLUMN, 2)).selectOne(context); assertNotNull(a2); assertEquals("artist2", a2.getArtistName()); } @Test - public void testMapPk() throws Exception { + public void testMapPkMulti() throws Exception { createTwoArtists(); - Artist a3 = SelectById.query(Artist.class, singletonMap(Artist.ARTIST_ID_PK_COLUMN, 3)).selectOne(context); - assertNotNull(a3); - assertEquals("artist3", a3.getArtistName()); + Map<String, ?> id2 = Collections.singletonMap(Artist.ARTIST_ID_PK_COLUMN, 2); + Map<String, ?> id3 = Collections.singletonMap(Artist.ARTIST_ID_PK_COLUMN, 3); - Artist a2 = SelectById.query(Artist.class, singletonMap(Artist.ARTIST_ID_PK_COLUMN, 2)).selectOne(context); - assertNotNull(a2); - assertEquals("artist2", a2.getArtistName()); + List<Artist> artists = SelectById.queryMaps(Artist.class, id2, id3) + .select(context); + assertEquals(2, artists.size()); + assertThat(artists.get(0), instanceOf(Artist.class)); } @Test - public void testMapPkMulti() throws Exception { + public void testMapPkCollection() throws Exception { createTwoArtists(); Map<String, ?> id2 = Collections.singletonMap(Artist.ARTIST_ID_PK_COLUMN, 2); Map<String, ?> id3 = Collections.singletonMap(Artist.ARTIST_ID_PK_COLUMN, 3); - List<Artist> artists = SelectById.query(Artist.class, id2, id3) + List<Artist> artists = SelectById.queryMapsCollection(Artist.class, Arrays.asList(id2, id3)) .select(context); assertEquals(2, artists.size()); assertThat(artists.get(0), instanceOf(Artist.class)); @@ -152,12 +152,12 @@ public class SelectById_RunIT extends RuntimeCase { createTwoArtists(); ObjectId oid3 = ObjectId.of("Artist", Artist.ARTIST_ID_PK_COLUMN, 3); - Artist a3 = SelectById.query(Artist.class, oid3).selectOne(context); + Artist a3 = SelectById.queryObjectId(Artist.class, oid3).selectOne(context); assertNotNull(a3); assertEquals("artist3", a3.getArtistName()); ObjectId oid2 = ObjectId.of("Artist", Artist.ARTIST_ID_PK_COLUMN, 2); - Artist a2 = SelectById.query(Artist.class, oid2).selectOne(context); + Artist a2 = SelectById.queryObjectId(Artist.class, oid2).selectOne(context); assertNotNull(a2); assertEquals("artist2", a2.getArtistName()); } @@ -169,7 +169,20 @@ public class SelectById_RunIT extends RuntimeCase { ObjectId oid2 = ObjectId.of("Artist", Artist.ARTIST_ID_PK_COLUMN, 2); ObjectId oid3 = ObjectId.of("Artist", Artist.ARTIST_ID_PK_COLUMN, 3); - List<Artist> artists = SelectById.query(Artist.class, oid2, oid3) + List<Artist> artists = SelectById.queryObjectIds(Artist.class, oid2, oid3) + .select(context); + assertEquals(2, artists.size()); + assertThat(artists.get(0), instanceOf(Artist.class)); + } + + @Test + public void testObjectIdPkCollection() throws Exception { + createTwoArtists(); + + ObjectId oid2 = ObjectId.of("Artist", Artist.ARTIST_ID_PK_COLUMN, 2); + ObjectId oid3 = ObjectId.of("Artist", Artist.ARTIST_ID_PK_COLUMN, 3); + + List<Artist> artists = SelectById.queryObjectIdsCollection(Artist.class, Arrays.asList(oid2, oid3)) .select(context); assertEquals(2, artists.size()); assertThat(artists.get(0), instanceOf(Artist.class)); @@ -179,11 +192,11 @@ public class SelectById_RunIT extends RuntimeCase { public void testDataRowIntPk() throws Exception { createTwoArtists(); - DataRow a3 = SelectById.dataRowQuery(Artist.class, 3).selectOne(context); + DataRow a3 = SelectById.dataRowQueryId(Artist.class, 3).selectOne(context); assertNotNull(a3); assertEquals("artist3", a3.get("ARTIST_NAME")); - DataRow a2 = SelectById.dataRowQuery(Artist.class, 2).selectOne(context); + DataRow a2 = SelectById.dataRowQueryId(Artist.class, 2).selectOne(context); assertNotNull(a2); assertEquals("artist2", a2.get("ARTIST_NAME")); } @@ -193,12 +206,12 @@ public class SelectById_RunIT extends RuntimeCase { createTwoArtists(); Map<String, ?> id3 = Collections.singletonMap(Artist.ARTIST_ID_PK_COLUMN, 3); - DataRow a3 = SelectById.dataRowQuery(Artist.class, id3).selectOne(context); + DataRow a3 = SelectById.dataRowQueryMap(Artist.class, id3).selectOne(context); assertNotNull(a3); assertEquals("artist3", a3.get("ARTIST_NAME")); Map<String, ?> id2 = Collections.singletonMap(Artist.ARTIST_ID_PK_COLUMN, 2); - DataRow a2 = SelectById.dataRowQuery(Artist.class, id2).selectOne(context); + DataRow a2 = SelectById.dataRowQueryMap(Artist.class, id2).selectOne(context); assertNotNull(a2); assertEquals("artist2", a2.get("ARTIST_NAME")); } @@ -208,12 +221,12 @@ public class SelectById_RunIT extends RuntimeCase { createTwoArtists(); ObjectId oid3 = ObjectId.of("Artist", Artist.ARTIST_ID_PK_COLUMN, 3); - DataRow a3 = SelectById.dataRowQuery(oid3).selectOne(context); + DataRow a3 = SelectById.dataRowQueryObjectId(oid3).selectOne(context); assertNotNull(a3); assertEquals("artist3", a3.get("ARTIST_NAME")); ObjectId oid2 = ObjectId.of("Artist", Artist.ARTIST_ID_PK_COLUMN, 2); - DataRow a2 = SelectById.dataRowQuery(oid2).selectOne(context); + DataRow a2 = SelectById.dataRowQueryObjectId(oid2).selectOne(context); assertNotNull(a2); assertEquals("artist2", a2.get("ARTIST_NAME")); } @@ -222,7 +235,20 @@ public class SelectById_RunIT extends RuntimeCase { public void testDataRowIntPkMulti() throws Exception { createTwoArtists(); - List<DataRow> artists = SelectById.dataRowQuery(Artist.class, 2, 3) + List<DataRow> artists = SelectById.dataRowQueryIds(Artist.class, 2, 3) + .select(context); + assertEquals(2, artists.size()); + assertThat(artists.get(0), instanceOf(DataRow.class)); + } + + @Test + public void testDataRowObjectIdPkMulti() throws Exception { + createTwoArtists(); + + ObjectId oid2 = ObjectId.of("Artist", Artist.ARTIST_ID_PK_COLUMN, 2); + ObjectId oid3 = ObjectId.of("Artist", Artist.ARTIST_ID_PK_COLUMN, 3); + + List<DataRow> artists = SelectById.dataRowQueryObjectIds(oid2, oid3) .select(context); assertEquals(2, artists.size()); assertThat(artists.get(0), instanceOf(DataRow.class)); @@ -232,37 +258,72 @@ public class SelectById_RunIT extends RuntimeCase { public void testDataRowMapPkMulti() throws Exception { createTwoArtists(); + Map<String, ?> id2 = Collections.singletonMap(Artist.ARTIST_ID_PK_COLUMN, 2); + Map<String, ?> id3 = Collections.singletonMap(Artist.ARTIST_ID_PK_COLUMN, 3); + + List<DataRow> artists = SelectById.dataRowQueryMaps(Artist.class, id2, id3) + .select(context); + assertEquals(2, artists.size()); + assertThat(artists.get(0), instanceOf(DataRow.class)); + } + + @Test + public void testDataRowIntPkCollection() throws Exception { + createTwoArtists(); + + List<DataRow> artists = SelectById.dataRowQueryIdsCollection(Artist.class, Arrays.asList(2, 3)) + .select(context); + assertEquals(2, artists.size()); + assertThat(artists.get(0), instanceOf(DataRow.class)); + } + + @Test + public void testDataRowObjectIdPkCollection() throws Exception { + createTwoArtists(); + ObjectId oid2 = ObjectId.of("Artist", Artist.ARTIST_ID_PK_COLUMN, 2); ObjectId oid3 = ObjectId.of("Artist", Artist.ARTIST_ID_PK_COLUMN, 3); - List<DataRow> artists = SelectById.dataRowQuery(oid2, oid3) + List<DataRow> artists = SelectById.dataRowQueryObjectIdsCollection(Arrays.asList(oid2, oid3)) .select(context); assertEquals(2, artists.size()); assertThat(artists.get(0), instanceOf(DataRow.class)); } @Test - public void testDataRowObjectIdPkMulti() throws Exception { + public void testDataRowMapPkCollection() throws Exception { createTwoArtists(); Map<String, ?> id2 = Collections.singletonMap(Artist.ARTIST_ID_PK_COLUMN, 2); Map<String, ?> id3 = Collections.singletonMap(Artist.ARTIST_ID_PK_COLUMN, 3); - List<DataRow> artists = SelectById.dataRowQuery(Artist.class, id2, id3) + List<DataRow> artists = SelectById.dataRowQueryMapsCollection(Artist.class, Arrays.asList(id2, id3)) .select(context); assertEquals(2, artists.size()); assertThat(artists.get(0), instanceOf(DataRow.class)); } + @Test + public void testIntPk_SelectFirst() throws Exception { + createTwoArtists(); + + Artist a3 = SelectById.queryId(Artist.class, 3).selectFirst(context); + assertNotNull(a3); + assertEquals("artist3", a3.getArtistName()); + + Artist a2 = SelectById.queryId(Artist.class, 2).selectFirst(context); + assertNotNull(a2); + assertEquals("artist2", a2.getArtistName()); + } @Test - public void testMetadataCacheKey() throws Exception { - SelectById<Painting> q1 = SelectById.query(Painting.class, 4).localCache(); + public void testMetadataCacheKey() { + SelectById<Painting> q1 = SelectById.queryId(Painting.class, 4).localCache(); QueryMetadata md1 = q1.getMetaData(resolver); assertNotNull(md1); assertNotNull(md1.getCacheKey()); - SelectById<Painting> q2 = SelectById.query(Painting.class, singletonMap(Painting.PAINTING_ID_PK_COLUMN, 4)) + SelectById<Painting> q2 = SelectById.queryId(Painting.class, singletonMap(Painting.PAINTING_ID_PK_COLUMN, 4)) .localCache(); QueryMetadata md2 = q2.getMetaData(resolver); assertNotNull(md2); @@ -272,20 +333,20 @@ public class SelectById_RunIT extends RuntimeCase { // cache entry assertEquals(md1.getCacheKey(), md2.getCacheKey()); - SelectById<Painting> q3 = SelectById.query(Painting.class, 5).localCache(); + SelectById<Painting> q3 = SelectById.queryId(Painting.class, 5).localCache(); QueryMetadata md3 = q3.getMetaData(resolver); assertNotNull(md3); assertNotNull(md3.getCacheKey()); assertNotEquals(md1.getCacheKey(), md3.getCacheKey()); - SelectById<Artist> q4 = SelectById.query(Artist.class, 4).localCache(); + SelectById<Artist> q4 = SelectById.queryId(Artist.class, 4).localCache(); QueryMetadata md4 = q4.getMetaData(resolver); assertNotNull(md4); assertNotNull(md4.getCacheKey()); assertNotEquals(md1.getCacheKey(), md4.getCacheKey()); SelectById<Painting> q5 = SelectById - .query(Painting.class, ObjectId.of("Painting", Painting.PAINTING_ID_PK_COLUMN, 4)) + .queryId(Painting.class, ObjectId.of("Painting", Painting.PAINTING_ID_PK_COLUMN, 4)) .localCache(); QueryMetadata md5 = q5.getMetaData(resolver); assertNotNull(md5); @@ -302,20 +363,20 @@ public class SelectById_RunIT extends RuntimeCase { final Artist[] a3 = new Artist[1]; assertEquals(1, interceptor.runWithQueryCounter(() -> { - a3[0] = SelectById.query(Artist.class, 3).localCache("g1").selectOne(context); + a3[0] = SelectById.queryId(Artist.class, 3).localCache("g1").selectOne(context); assertNotNull(a3[0]); assertEquals("artist3", a3[0].getArtistName()); })); interceptor.runWithQueriesBlocked(() -> { - Artist a3cached = SelectById.query(Artist.class, 3).localCache("g1").selectOne(context); + Artist a3cached = SelectById.queryId(Artist.class, 3).localCache("g1").selectOne(context); assertSame(a3[0], a3cached); }); context.performGenericQuery(new RefreshQuery("g1")); assertEquals(1, interceptor.runWithQueryCounter(() -> - SelectById.query(Artist.class, 3).localCache("g1").selectOne(context))); + SelectById.queryId(Artist.class, 3).localCache("g1").selectOne(context))); } @Test @@ -324,7 +385,7 @@ public class SelectById_RunIT extends RuntimeCase { tPainting.insert(45, 3, "One"); tPainting.insert(48, 3, "Two"); - final Artist a3 = SelectById.query(Artist.class, 3) + final Artist a3 = SelectById.queryId(Artist.class, 3) .prefetch(Artist.PAINTING_ARRAY.joint()) .selectOne(context); @@ -337,4 +398,185 @@ public class SelectById_RunIT extends RuntimeCase { a3.getPaintingArray().get(1).getPaintingTitle(); }); } + + /* deprecated methods tests */ + + @SuppressWarnings("removal") + @Test + public void testIntPkDeprecated() throws Exception { + createTwoArtists(); + + Artist a3 = SelectById.query(Artist.class, 3).selectOne(context); + assertNotNull(a3); + assertEquals("artist3", a3.getArtistName()); + + Artist a2 = SelectById.query(Artist.class, 2).selectOne(context); + assertNotNull(a2); + assertEquals("artist2", a2.getArtistName()); + } + + @SuppressWarnings("removal") + @Test + public void testIntPkMultiDeprecated() throws Exception { + createTwoArtists(); + + List<Artist> artists = SelectById.query(Artist.class, 2, 3) + .select(context); + assertEquals(2, artists.size()); + assertThat(artists.get(0), instanceOf(Artist.class)); + } + + @SuppressWarnings("removal") + @Test + public void testIntPkCollectionDeprecation() throws Exception { + createTwoArtists(); + + List<Artist> artists = SelectById.query(Artist.class, Arrays.asList(1, 2, 3, 4, 5)) + .select(context); + assertEquals(2, artists.size()); + assertThat(artists.get(0), instanceOf(Artist.class)); + } + + @SuppressWarnings("removal") + @Test + public void testMapPkDeprecation() throws Exception { + createTwoArtists(); + + Artist a3 = SelectById.query(Artist.class, singletonMap(Artist.ARTIST_ID_PK_COLUMN, 3)).selectOne(context); + assertNotNull(a3); + assertEquals("artist3", a3.getArtistName()); + + Artist a2 = SelectById.query(Artist.class, singletonMap(Artist.ARTIST_ID_PK_COLUMN, 2)).selectOne(context); + assertNotNull(a2); + assertEquals("artist2", a2.getArtistName()); + } + + @SuppressWarnings("removal") + @Test + public void testMapPkMultiDeprecation() throws Exception { + createTwoArtists(); + + Map<String, ?> id2 = Collections.singletonMap(Artist.ARTIST_ID_PK_COLUMN, 2); + Map<String, ?> id3 = Collections.singletonMap(Artist.ARTIST_ID_PK_COLUMN, 3); + + List<Artist> artists = SelectById.query(Artist.class, id2, id3) + .select(context); + assertEquals(2, artists.size()); + assertThat(artists.get(0), instanceOf(Artist.class)); + } + + @SuppressWarnings("removal") + @Test + public void testObjectIdPkDeprecation() throws Exception { + createTwoArtists(); + + ObjectId oid3 = ObjectId.of("Artist", Artist.ARTIST_ID_PK_COLUMN, 3); + Artist a3 = SelectById.query(Artist.class, oid3).selectOne(context); + assertNotNull(a3); + assertEquals("artist3", a3.getArtistName()); + + ObjectId oid2 = ObjectId.of("Artist", Artist.ARTIST_ID_PK_COLUMN, 2); + Artist a2 = SelectById.query(Artist.class, oid2).selectOne(context); + assertNotNull(a2); + assertEquals("artist2", a2.getArtistName()); + } + + @SuppressWarnings("removal") + @Test + public void testObjectIdPkMultiDeprecation() throws Exception { + createTwoArtists(); + + ObjectId oid2 = ObjectId.of("Artist", Artist.ARTIST_ID_PK_COLUMN, 2); + ObjectId oid3 = ObjectId.of("Artist", Artist.ARTIST_ID_PK_COLUMN, 3); + + List<Artist> artists = SelectById.query(Artist.class, oid2, oid3) + .select(context); + assertEquals(2, artists.size()); + assertThat(artists.get(0), instanceOf(Artist.class)); + } + + @SuppressWarnings("removal") + @Test + public void testDataRowIntPkDeprecation() throws Exception { + createTwoArtists(); + + DataRow a3 = SelectById.dataRowQuery(Artist.class, 3).selectOne(context); + assertNotNull(a3); + assertEquals("artist3", a3.get("ARTIST_NAME")); + + DataRow a2 = SelectById.dataRowQuery(Artist.class, 2).selectOne(context); + assertNotNull(a2); + assertEquals("artist2", a2.get("ARTIST_NAME")); + } + + @SuppressWarnings("removal") + @Test + public void testDataRowMapPkDeprecation() throws Exception { + createTwoArtists(); + + Map<String, ?> id3 = Collections.singletonMap(Artist.ARTIST_ID_PK_COLUMN, 3); + DataRow a3 = SelectById.dataRowQuery(Artist.class, id3).selectOne(context); + assertNotNull(a3); + assertEquals("artist3", a3.get("ARTIST_NAME")); + + Map<String, ?> id2 = Collections.singletonMap(Artist.ARTIST_ID_PK_COLUMN, 2); + DataRow a2 = SelectById.dataRowQuery(Artist.class, id2).selectOne(context); + assertNotNull(a2); + assertEquals("artist2", a2.get("ARTIST_NAME")); + } + + @SuppressWarnings("removal") + @Test + public void testDataRowObjectIdPkDeprecation() throws Exception { + createTwoArtists(); + + ObjectId oid3 = ObjectId.of("Artist", Artist.ARTIST_ID_PK_COLUMN, 3); + DataRow a3 = SelectById.dataRowQuery(oid3).selectOne(context); + assertNotNull(a3); + assertEquals("artist3", a3.get("ARTIST_NAME")); + + ObjectId oid2 = ObjectId.of("Artist", Artist.ARTIST_ID_PK_COLUMN, 2); + DataRow a2 = SelectById.dataRowQuery(oid2).selectOne(context); + assertNotNull(a2); + assertEquals("artist2", a2.get("ARTIST_NAME")); + } + + @SuppressWarnings("removal") + @Test + public void testDataRowIntPkMultiDeprecation() throws Exception { + createTwoArtists(); + + List<DataRow> artists = SelectById.dataRowQuery(Artist.class, 2, 3) + .select(context); + assertEquals(2, artists.size()); + assertThat(artists.get(0), instanceOf(DataRow.class)); + } + + @SuppressWarnings("removal") + @Test + public void testDataRowMapPkMultiDeprecation() throws Exception { + createTwoArtists(); + + ObjectId oid2 = ObjectId.of("Artist", Artist.ARTIST_ID_PK_COLUMN, 2); + ObjectId oid3 = ObjectId.of("Artist", Artist.ARTIST_ID_PK_COLUMN, 3); + + List<DataRow> artists = SelectById.dataRowQuery(oid2, oid3) + .select(context); + assertEquals(2, artists.size()); + assertThat(artists.get(0), instanceOf(DataRow.class)); + } + + @SuppressWarnings("removal") + @Test + public void testDataRowObjectIdPkMultiDeprecation() throws Exception { + createTwoArtists(); + + Map<String, ?> id2 = Collections.singletonMap(Artist.ARTIST_ID_PK_COLUMN, 2); + Map<String, ?> id3 = Collections.singletonMap(Artist.ARTIST_ID_PK_COLUMN, 3); + + List<DataRow> artists = SelectById.dataRowQuery(Artist.class, id2, id3) + .select(context); + assertEquals(2, artists.size()); + assertThat(artists.get(0), instanceOf(DataRow.class)); + } }