diff --git a/dao-impl/ebean-dao/src/main/java/com/linkedin/metadata/dao/EbeanLocalDAO.java b/dao-impl/ebean-dao/src/main/java/com/linkedin/metadata/dao/EbeanLocalDAO.java index 6b8007c4a..aaa163bdc 100644 --- a/dao-impl/ebean-dao/src/main/java/com/linkedin/metadata/dao/EbeanLocalDAO.java +++ b/dao-impl/ebean-dao/src/main/java/com/linkedin/metadata/dao/EbeanLocalDAO.java @@ -892,6 +892,8 @@ private List batchGetUnion(@Nonnull List query = _server.findNative(EbeanMetadataAspect.class, sb.toString()); for (int i = 1; i <= params.size(); i++) { diff --git a/dao-impl/ebean-dao/src/test/java/com/linkedin/metadata/dao/EbeanLocalDAOTest.java b/dao-impl/ebean-dao/src/test/java/com/linkedin/metadata/dao/EbeanLocalDAOTest.java index 84c3764e0..99020dc87 100644 --- a/dao-impl/ebean-dao/src/test/java/com/linkedin/metadata/dao/EbeanLocalDAOTest.java +++ b/dao-impl/ebean-dao/src/test/java/com/linkedin/metadata/dao/EbeanLocalDAOTest.java @@ -3094,6 +3094,28 @@ public void testNewSchemaExactMatchEmptyArray() { } } + @Test + public void testDuplicityOrdering() { + if (_schemaConfig == SchemaConfig.OLD_SCHEMA_ONLY) { + _server.execute(Ebean.createSqlUpdate(readSQLfromFile(GMA_DROP_ALL_SQL))); + _server.execute(Ebean.createSqlUpdate(readSQLfromFile("gma-create-all-duplicity.sql"))); + + EbeanLocalDAO dao = createDao(FooUrn.class); + FooUrn urn = makeFooUrn(1); + String aspectName = ModelUtils.getAspectName(AspectFoo.class); + AspectFoo v1 = new AspectFoo().setValue("foo"); + AspectFoo v0 = new AspectFoo().setValue("bar"); + + // introduce two v0's + addMetadataWithAuditStamp(urn, aspectName, 0, v1, 1234L, "fakeCreator", "fakeImpersonator"); + addMetadataWithAuditStamp(urn, aspectName, 0, v0, 0L, "fakeCreator", "fakeImpersonator"); + + // when retrieving a v0-duplicate record, the returned value should be the LATEST (timestamp=1234L) + AspectFoo actual = dao.get(AspectFoo.class, urn).get(); + assertEquals(actual, v1); + } + } + @Nonnull private EbeanMetadataAspect getMetadata(Urn urn, String aspectName, long version, @Nullable RecordTemplate metadata) { EbeanMetadataAspect aspect = new EbeanMetadataAspect(); diff --git a/dao-impl/ebean-dao/src/test/resources/gma-create-all-duplicity.sql b/dao-impl/ebean-dao/src/test/resources/gma-create-all-duplicity.sql new file mode 100644 index 000000000..ceed2a167 --- /dev/null +++ b/dao-impl/ebean-dao/src/test/resources/gma-create-all-duplicity.sql @@ -0,0 +1,32 @@ +create table metadata_id ( + namespace varchar(255) not null, + id bigint not null, + constraint uq_metadata_id_namespace_id unique (namespace,id) +); + +create table metadata_aspect ( + urn varchar(500) not null, + aspect varchar(200) not null, + version bigint not null, + metadata clob not null, + createdon timestamp not null, + createdby varchar(255) not null, + createdfor varchar(255), + constraint pk_metadata_aspect primary key (urn,aspect,version,createdon) +); + +create table metadata_index ( + id bigint auto_increment not null, + urn varchar(500) not null, + aspect varchar(200) not null, + path varchar(200) not null, + longval bigint, + stringval varchar(500), + doubleval double, + constraint pk_metadata_index primary key (id) +); + +create index idx_long_val on metadata_index (aspect,path,longval,urn); +create index idx_string_val on metadata_index (aspect,path,stringval,urn); +create index idx_double_val on metadata_index (aspect,path,doubleval,urn); +create index idx_urn on metadata_index (urn);