Skip to content

Commit e6a18e4

Browse files
authored
EPMRPP-118955 || Fix path cast in jooq queries for correct index usage (#2803)
1 parent 675124c commit e6a18e4

4 files changed

Lines changed: 36 additions & 25 deletions

File tree

src/main/java/com/epam/reportportal/base/infrastructure/persistence/commons/querygen/Condition.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,8 @@ public Object castValue(CriteriaHolder criteriaHolder, String values, ErrorType
153153
@Override
154154
public org.jooq.Condition toCondition(FilterCondition filter, CriteriaHolder criteriaHolder) {
155155
validate(criteriaHolder, filter.getValue(), false, INCORRECT_FILTER_PARAMETERS);
156-
Field<String> aggregateField = DSL.field(criteriaHolder.getAggregateCriteria()).cast(String.class);
156+
Field<String> aggregateField = DSL.field("{0}::text", String.class,
157+
DSL.field(criteriaHolder.getAggregateCriteria()));
157158
return aggregateField.eq(filter.getValue())
158159
.or(aggregateField.like(filter.getValue() + ".%"));
159160
}

src/main/java/com/epam/reportportal/base/infrastructure/persistence/dao/LogRepositoryCustomImpl.java

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import static com.epam.reportportal.base.infrastructure.persistence.dao.constant.LogRepositoryConstants.TYPE;
2929
import static com.epam.reportportal.base.infrastructure.persistence.dao.constant.TestItemRepositoryConstants.NESTED;
3030
import static com.epam.reportportal.base.infrastructure.persistence.dao.constant.WidgetRepositoryConstants.ID;
31+
import static com.epam.reportportal.base.infrastructure.persistence.dao.util.JooqFieldNameTransformer.castToText;
3132
import static com.epam.reportportal.base.infrastructure.persistence.dao.util.JooqFieldNameTransformer.fieldName;
3233
import static com.epam.reportportal.base.infrastructure.persistence.dao.util.RecordMappers.ATTACHMENT_MAPPER;
3334
import static com.epam.reportportal.base.infrastructure.persistence.dao.util.RecordMappers.INDEX_LOG_FETCHER;
@@ -288,9 +289,10 @@ public List<Long> findIdsUnderTestItemByLaunchIdAndTestItemIdsAndLogLevelGte(Lon
288289
.join(childItemTable)
289290
.on(LOG.ITEM_ID.eq(childItemTable.ITEM_ID))
290291
.join(parentItemTable)
291-
.on(childItemTable.PATH.cast(String.class).eq(parentItemTable.PATH.cast(String.class))
292-
.or(childItemTable.PATH.cast(String.class)
293-
.like(parentItemTable.PATH.cast(String.class).concat(".%")))
292+
.on(castToText(fieldName(childItemTable.getName(), TEST_ITEM.PATH.getName()))
293+
.eq(castToText(fieldName(parentItemTable.getName(), TEST_ITEM.PATH.getName())))
294+
.or(castToText(fieldName(childItemTable.getName(), TEST_ITEM.PATH.getName()))
295+
.like(castToText(fieldName(parentItemTable.getName(), TEST_ITEM.PATH.getName())).concat(".%")))
294296
)
295297
.where(childItemTable.LAUNCH_ID.eq(launchId))
296298
.and(parentItemTable.LAUNCH_ID.eq(launchId))
@@ -490,8 +492,8 @@ public List<String> findMessagesByLaunchIdAndItemIdAndPathAndLevelGte(Long launc
490492
.and(TEST_ITEM.LAUNCH_ID.eq(launchId))
491493
.and(TEST_ITEM.ITEM_ID.eq(itemId)
492494
.or(TEST_ITEM.HAS_STATS.eq(false)
493-
.and(TEST_ITEM.PATH.cast(String.class).eq(path)
494-
.or(TEST_ITEM.PATH.cast(String.class).like(path + ".%"))
495+
.and(castToText(fieldName(TEST_ITEM.getName(), TEST_ITEM.PATH.getName())).eq(path)
496+
.or(castToText(fieldName(TEST_ITEM.getName(), TEST_ITEM.PATH.getName())).like(path + ".%"))
495497
))))
496498
.fetch(LOG.LOG_MESSAGE);
497499
}
@@ -507,8 +509,8 @@ public List<Long> findIdsByLaunchIdAndItemIdAndPathAndLevelGte(Long launchId, Lo
507509
.and(TEST_ITEM.LAUNCH_ID.eq(launchId))
508510
.and(TEST_ITEM.ITEM_ID.eq(itemId)
509511
.or(TEST_ITEM.HAS_STATS.eq(false)
510-
.and(TEST_ITEM.PATH.cast(String.class).eq(path)
511-
.or(TEST_ITEM.PATH.cast(String.class).like(path + ".%"))
512+
.and(castToText(fieldName(TEST_ITEM.getName(), TEST_ITEM.PATH.getName())).eq(path)
513+
.or(castToText(fieldName(TEST_ITEM.getName(), TEST_ITEM.PATH.getName())).like(path + ".%"))
512514
))))
513515
.fetch(LOG.ID);
514516
}
@@ -563,9 +565,10 @@ private SelectConditionStep<? extends Record> buildLogsUnderItemsQuery(Long laun
563565
.join(childItemTable)
564566
.on(LOG.ITEM_ID.eq(childItemTable.ITEM_ID))
565567
.join(parentItemTable)
566-
.on(childItemTable.PATH.cast(String.class).eq(parentItemTable.PATH.cast(String.class))
567-
.or(childItemTable.PATH.cast(String.class)
568-
.like(parentItemTable.PATH.cast(String.class).concat(".%")))
568+
.on(castToText(fieldName(childItemTable.getName(), TEST_ITEM.PATH.getName()))
569+
.eq(castToText(fieldName(parentItemTable.getName(), TEST_ITEM.PATH.getName())))
570+
.or(castToText(fieldName(childItemTable.getName(), TEST_ITEM.PATH.getName()))
571+
.like(castToText(fieldName(parentItemTable.getName(), TEST_ITEM.PATH.getName())).concat(".%")))
569572
);
570573

571574
if (includeAttachments) {

src/main/java/com/epam/reportportal/base/infrastructure/persistence/dao/TestItemRepositoryCustomImpl.java

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import static com.epam.reportportal.base.infrastructure.persistence.dao.constant.WidgetContentRepositoryConstants.ITEMS;
3434
import static com.epam.reportportal.base.infrastructure.persistence.dao.constant.WidgetContentRepositoryConstants.LAUNCHES;
3535
import static com.epam.reportportal.base.infrastructure.persistence.dao.constant.WidgetRepositoryConstants.ID;
36+
import static com.epam.reportportal.base.infrastructure.persistence.dao.util.JooqFieldNameTransformer.castToText;
3637
import static com.epam.reportportal.base.infrastructure.persistence.dao.util.JooqFieldNameTransformer.fieldName;
3738
import static com.epam.reportportal.base.infrastructure.persistence.dao.util.QueryUtils.collectJoinFields;
3839
import static com.epam.reportportal.base.infrastructure.persistence.dao.util.RecordMappers.INDEX_TEST_ITEM_RECORD_MAPPER;
@@ -921,10 +922,10 @@ public List<Long> selectIdsByAnalyzedWithLevelGteExcludingIssueTypes(boolean aut
921922
.andNot(nestedItemTable.HAS_STATS)
922923
.and(LOG.LOG_LEVEL.greaterOrEqual(logLevel))
923924
.and(LOG.LOG_LEVEL.lessOrEqual(LogLevel.UNKNOWN_INT))
924-
.and(nestedItemTable.PATH.cast(String.class)
925-
.eq(outerItemTable.PATH.cast(String.class))
926-
.or(nestedItemTable.PATH.cast(String.class)
927-
.like(outerItemTable.PATH.cast(String.class).concat(".%"))))
925+
.and(castToText(fieldName(nestedItemTable.getName(), TEST_ITEM.PATH.getName()))
926+
.eq(castToText(fieldName(outerItemTable.getName(), TEST_ITEM.PATH.getName())))
927+
.or(castToText(fieldName(nestedItemTable.getName(), TEST_ITEM.PATH.getName()))
928+
.like(castToText(fieldName(outerItemTable.getName(), TEST_ITEM.PATH.getName())).concat(".%"))))
928929
)
929930
)
930931
.unionAll(DSL.selectDistinct(TEST_ITEM.ITEM_ID.as(ID))
@@ -1056,8 +1057,8 @@ public List<Long> selectIdsUnderByStringLogMessage(Long launchId, Collection<Lon
10561057
return dsl.selectDistinct(TEST_ITEM.ITEM_ID)
10571058
.from(TEST_ITEM)
10581059
.join(child)
1059-
.on(child.PATH.cast(String.class)
1060-
.like(TEST_ITEM.PATH.cast(String.class).concat(".%")))
1060+
.on(castToText(fieldName(child.getName(), TEST_ITEM.PATH.getName()))
1061+
.like(castToText(fieldName(TEST_ITEM.getName(), TEST_ITEM.PATH.getName())).concat(".%")))
10611062
.and(TEST_ITEM.ITEM_ID.notEqual(child.ITEM_ID))
10621063
.join(LOG)
10631064
.on(child.ITEM_ID.eq(LOG.ITEM_ID))
@@ -1078,8 +1079,8 @@ public List<Long> selectLogIdsUnderWithLogLevelCondition(Long launchId, Collecti
10781079
return dsl.selectDistinct(LOG.ID)
10791080
.from(TEST_ITEM)
10801081
.join(child)
1081-
.on(child.PATH.cast(String.class)
1082-
.like(TEST_ITEM.PATH.cast(String.class).concat(".%")))
1082+
.on(castToText(fieldName(child.getName(), TEST_ITEM.PATH.getName()))
1083+
.like(castToText(fieldName(TEST_ITEM.getName(), TEST_ITEM.PATH.getName())).concat(".%")))
10831084
.and(TEST_ITEM.ITEM_ID.notEqual(child.ITEM_ID))
10841085
.join(LOG)
10851086
.on(child.ITEM_ID.eq(LOG.ITEM_ID))
@@ -1098,8 +1099,8 @@ public List<Long> selectIdsUnderByRegexLogMessage(Long launchId, Collection<Long
10981099
return dsl.selectDistinct(TEST_ITEM.ITEM_ID)
10991100
.from(TEST_ITEM)
11001101
.join(child)
1101-
.on(child.PATH.cast(String.class)
1102-
.like(TEST_ITEM.PATH.cast(String.class).concat(".%")))
1102+
.on(castToText(fieldName(child.getName(), TEST_ITEM.PATH.getName()))
1103+
.like(castToText(fieldName(TEST_ITEM.getName(), TEST_ITEM.PATH.getName())).concat(".%")))
11031104
.and(TEST_ITEM.ITEM_ID.notEqual(child.ITEM_ID))
11041105
.join(LOG)
11051106
.on(child.ITEM_ID.eq(LOG.ITEM_ID))
@@ -1170,10 +1171,10 @@ public List<NestedStep> findAllNestedStepsByIds(Collection<Long> ids, Queryable
11701171
.join(ATTACHMENT)
11711172
.on(LOG.ATTACHMENT_ID.eq(ATTACHMENT.ID))
11721173
.where(nested.HAS_STATS.isFalse()
1173-
.and(fieldName(NESTED, TEST_ITEM.PATH.getName()).cast(String.class)
1174-
.eq(TEST_ITEM.PATH.cast(String.class))
1175-
.or(fieldName(NESTED, TEST_ITEM.PATH.getName()).cast(String.class)
1176-
.like(TEST_ITEM.PATH.cast(String.class).concat(".%")))
1174+
.and(castToText(fieldName(NESTED, TEST_ITEM.PATH.getName()))
1175+
.eq(castToText(fieldName(TEST_ITEM.getName(), TEST_ITEM.PATH.getName())))
1176+
.or(castToText(fieldName(NESTED, TEST_ITEM.PATH.getName()))
1177+
.like(castToText(fieldName(TEST_ITEM.getName(), TEST_ITEM.PATH.getName())).concat(".%")))
11771178
)
11781179
)
11791180
)

src/main/java/com/epam/reportportal/base/infrastructure/persistence/dao/util/JooqFieldNameTransformer.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@
3030
*/
3131
public final class JooqFieldNameTransformer {
3232

33+
private static final String TEXT_CAST_TEMPLATE = "{0}::text";
34+
3335
public static Field<?> fieldName(TableField tableField) {
3436
return field(name(tableField.getName()));
3537
}
@@ -41,4 +43,8 @@ public static Field<?> fieldName(String tableFieldName) {
4143
public static Field<?> fieldName(String... fieldQualifiers) {
4244
return field(name(fieldQualifiers));
4345
}
46+
47+
public static Field<String> castToText(Field<?> sourceField) {
48+
return field(TEXT_CAST_TEMPLATE, String.class, sourceField);
49+
}
4450
}

0 commit comments

Comments
 (0)