From 987bd9c2043761d21aeac4f53b2cb32294dac0ee Mon Sep 17 00:00:00 2001 From: Jonathan Miller Date: Wed, 5 Aug 2026 15:48:50 -0400 Subject: [PATCH 1/2] MLE-31642 fromLexicons Test fix propertiesFragmentShouldNotBeReturnedByFromLexicons() was failing against ML12.1 due to intended behavior change, validated in MLE-31757. The test has been updated to only run on ML version >12.0. A new test has been added to validate the new ML 12.1 fromLexicons behavior. --- .../test/junit5/RequiresML12Dot0OrLower.java | 27 ++++++++++++++++++ .../client/test/rows/JoinDocTest.java | 28 ++++++++++++++++++- 2 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 marklogic-client-api/src/test/java/com/marklogic/client/test/junit5/RequiresML12Dot0OrLower.java diff --git a/marklogic-client-api/src/test/java/com/marklogic/client/test/junit5/RequiresML12Dot0OrLower.java b/marklogic-client-api/src/test/java/com/marklogic/client/test/junit5/RequiresML12Dot0OrLower.java new file mode 100644 index 0000000000..d0ef49239f --- /dev/null +++ b/marklogic-client-api/src/test/java/com/marklogic/client/test/junit5/RequiresML12Dot0OrLower.java @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2010-2026 Progress Software Corporation and/or its subsidiaries or affiliates. All Rights Reserved. + */ +package com.marklogic.client.test.junit5; + +import com.marklogic.client.test.Common; +import com.marklogic.client.test.MarkLogicVersion; +import org.junit.jupiter.api.extension.ConditionEvaluationResult; +import org.junit.jupiter.api.extension.ExecutionCondition; +import org.junit.jupiter.api.extension.ExtensionContext; + +public class RequiresML12Dot0OrLower implements ExecutionCondition { + + private static MarkLogicVersion markLogicVersion; + + @Override + public ConditionEvaluationResult evaluateExecutionCondition(ExtensionContext context) { + if (markLogicVersion == null) { + markLogicVersion = Common.getMarkLogicVersion(); + } + boolean isML12Dot0OrLower = markLogicVersion.getMajor() < 12 || + (markLogicVersion.getMajor() == 12 && (markLogicVersion.getMinor() == null || markLogicVersion.getMinor() == 0)); + return isML12Dot0OrLower ? + ConditionEvaluationResult.enabled("MarkLogic is version 12.0 or lower") : + ConditionEvaluationResult.disabled("MarkLogic is version 12.1 or higher"); + } +} diff --git a/marklogic-client-api/src/test/java/com/marklogic/client/test/rows/JoinDocTest.java b/marklogic-client-api/src/test/java/com/marklogic/client/test/rows/JoinDocTest.java index 7fce29b3d7..779b458989 100644 --- a/marklogic-client-api/src/test/java/com/marklogic/client/test/rows/JoinDocTest.java +++ b/marklogic-client-api/src/test/java/com/marklogic/client/test/rows/JoinDocTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2025 Progress Software Corporation and/or its subsidiaries or affiliates. All Rights Reserved. + * Copyright (c) 2010-2026 Progress Software Corporation and/or its subsidiaries or affiliates. All Rights Reserved. */ package com.marklogic.client.test.rows; @@ -9,6 +9,8 @@ import com.marklogic.client.row.RowRecord; import com.marklogic.client.test.Common; import com.marklogic.client.test.junit5.RequiresML11; +import com.marklogic.client.test.junit5.RequiresML12Dot0OrLower; +import com.marklogic.client.test.junit5.RequiresML12Dot1; import com.marklogic.client.type.CtsReferenceExpr; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -40,6 +42,7 @@ public void propertiesFragmentsShouldNotBeReturned() { * 2022-12-12 This is now running only on ML 11, as it's consistently failing on ML 10. We have a fix slated for * 11.x, and it's not clear yet if it'll be backported to ML 10. */ + @ExtendWith(RequiresML12Dot0OrLower.class) @Test public void propertiesFragmentShouldNotBeReturnedByFromLexicons() { Map lexicons = new HashMap<>(); @@ -52,6 +55,29 @@ public void propertiesFragmentShouldNotBeReturnedByFromLexicons() { verifyPropertiesFragmentsAreNotReturned(plan); } + /** + * In ML 12.1+, fromLexicons enumerates both content fragments and properties fragments, so joinDoc + * returns twice as many rows as written documents. + */ + @ExtendWith(RequiresML12Dot1.class) + @Test + public void propertiesFragmentShouldBeReturnedByFromLexicons() { + Map lexicons = new HashMap<>(); + lexicons.put("uri", op.cts.uriReference()); + + PlanBuilder.ModifyPlan plan = op.fromLexicons(lexicons, "", op.fragmentIdCol("fragmentId")) + .where(op.cts.directoryQuery("/acme/")) + .joinDoc(op.col("doc"), op.col("uri")); + + final int docCount = 50; + writeDocs(docCount); + + List rows = resultRows(plan); + assertEquals(docCount * 2, rows.size(), + "In ML 12.1+, fromLexicons returns both content fragments and properties fragments, so the row " + + "count should be twice the number of written documents."); + } + private void verifyPropertiesFragmentsAreNotReturned(PlanBuilder.ModifyPlan plan) { final int docCount = 50; writeDocs(docCount); From 676df52921f88c279126dfa310fa070c11ed1f82 Mon Sep 17 00:00:00 2001 From: Jonathan Miller Date: Thu, 6 Aug 2026 09:55:18 -0400 Subject: [PATCH 2/2] MLE-31642 Updated comment --- .../test/java/com/marklogic/client/test/rows/JoinDocTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/marklogic-client-api/src/test/java/com/marklogic/client/test/rows/JoinDocTest.java b/marklogic-client-api/src/test/java/com/marklogic/client/test/rows/JoinDocTest.java index 779b458989..6ba61bbd4f 100644 --- a/marklogic-client-api/src/test/java/com/marklogic/client/test/rows/JoinDocTest.java +++ b/marklogic-client-api/src/test/java/com/marklogic/client/test/rows/JoinDocTest.java @@ -57,7 +57,8 @@ public void propertiesFragmentShouldNotBeReturnedByFromLexicons() { /** * In ML 12.1+, fromLexicons enumerates both content fragments and properties fragments, so joinDoc - * returns twice as many rows as written documents. + * returns twice as many rows as written documents. This behavior was introduced in ML 12.1 as part of + * MLE-27052 and intended behavior was validated in MLE-31757 comments. */ @ExtendWith(RequiresML12Dot1.class) @Test