Skip to content

Commit 5ee85e2

Browse files
committed
use library functions
1 parent f816ff7 commit 5ee85e2

7 files changed

Lines changed: 71 additions & 89 deletions

File tree

src/main/java/org/folio/fqm/repository/IdStreamer.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
import org.folio.fqm.service.EntityTypeInitializationService;
1414
import org.folio.fqm.service.FqlToSqlConverterService;
1515
import org.folio.fqm.utils.EntityTypeUtils;
16-
import org.folio.fqm.utils.MarcFieldFactory;
16+
import org.folio.fqm.utils.MarcSqlFactory;
1717
import org.folio.fqm.utils.StreamHelper;
1818
import org.folio.fqm.utils.flattening.FromClauseUtils;
1919
import org.folio.fql.model.Fql;
@@ -100,15 +100,15 @@ private void streamIdsInBatch(EntityType entityType,
100100
Fql fql, int batchSize,
101101
int maxQuerySize, UUID queryId,
102102
List<String> tenantsToQuery, boolean ecsEnabled) {
103-
EntityType augmentedEntityType = MarcFieldFactory.addSyntheticColumns(entityType, fql.fqlCondition(), executionContext.getTenantId());
103+
EntityType augmentedEntityType = MarcSqlFactory.addSyntheticColumns(entityType, fql.fqlCondition(), executionContext.getTenantId());
104104
UUID entityTypeId = UUID.fromString(augmentedEntityType.getId());
105105
log.debug("List of tenants to query: {}", tenantsToQuery);
106106
Field<String[]> idValueGetter = EntityTypeUtils.getResultIdValueGetter(augmentedEntityType);
107107
Select<Record1<String[]>> fullQuery = null;
108108
for (String tenantId : tenantsToQuery) {
109109
EntityType entityTypeDefinition = tenantId != null && tenantId.equals(executionContext.getTenantId()) ?
110110
augmentedEntityType : entityTypeFlatteningService.getFlattenedEntityType(entityTypeId, tenantId, false);
111-
entityTypeDefinition = MarcFieldFactory.addSyntheticColumns(entityTypeDefinition, fql.fqlCondition(), tenantId);
111+
entityTypeDefinition = MarcSqlFactory.addSyntheticColumns(entityTypeDefinition, fql.fqlCondition(), tenantId);
112112
Field<String[]> currentIdValueGetter = EntityTypeUtils.getResultIdValueGetter(entityTypeDefinition);
113113

114114
// We may have joins to columns which are filtered out via essentialOnly/etc. Therefore, we must re-fetch

src/main/java/org/folio/fqm/repository/ResultSetRepository.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,9 @@
2121
import org.folio.fqm.service.EntityTypeFlatteningService;
2222
import org.folio.fqm.service.EntityTypeInitializationService;
2323
import org.folio.fqm.service.FqlToSqlConverterService;
24+
import org.folio.fql.service.MarcFieldFactory;
2425
import org.folio.fqm.utils.EntityTypeUtils;
25-
import org.folio.fqm.utils.MarcFieldFactory;
26+
import org.folio.fqm.utils.MarcSqlFactory;
2627
import org.folio.fqm.utils.SqlFieldIdentificationUtils;
2728
import org.folio.fqm.utils.flattening.FromClauseUtils;
2829
import org.folio.querytool.domain.dto.EntityDataType;
@@ -69,7 +70,7 @@ public List<Map<String, Object>> getResultSet(UUID entityTypeId,
6970
return List.of();
7071
}
7172

72-
EntityType baseEntityType = MarcFieldFactory.addSyntheticColumns(
73+
EntityType baseEntityType = MarcSqlFactory.addSyntheticColumns(
7374
getEntityType(executionContext.getTenantId(), entityTypeId),
7475
fields,
7576
executionContext.getTenantId()
@@ -80,7 +81,7 @@ public List<Map<String, Object>> getResultSet(UUID entityTypeId,
8081
for (int i = 0; i < tenantsToQuery.size(); i++) {
8182
String tenantId = tenantsToQuery.get(i);
8283
EntityType entityTypeDefinition = tenantId != null && tenantId.equals(executionContext.getTenantId()) ? baseEntityType : getEntityType(tenantId, entityTypeId);
83-
entityTypeDefinition = MarcFieldFactory.addSyntheticColumns(entityTypeDefinition, fields, tenantId);
84+
entityTypeDefinition = MarcSqlFactory.addSyntheticColumns(entityTypeDefinition, fields, tenantId);
8485
List<String> idColumnValueGetters = EntityTypeUtils.getIdColumnValueGetters(entityTypeDefinition);
8586

8687
// We may have joins to columns which are filtered out via essentialOnly/etc. Therefore, we must re-fetch
@@ -271,7 +272,7 @@ private EntityType augmentWithReferencedMarcFields(EntityType entityType,
271272
String tenantId) {
272273
Set<String> referencedFieldNames = new LinkedHashSet<>(fields);
273274
referencedFieldNames.addAll(MarcFieldFactory.getReferencedMarcFieldNames(condition));
274-
return MarcFieldFactory.addSyntheticColumns(entityType, referencedFieldNames, tenantId);
275+
return MarcSqlFactory.addSyntheticColumns(entityType, referencedFieldNames, tenantId);
275276
}
276277

277278
private Condition buildWhereClause(EntityType entityType, List<List<String>> ids, List<String> idColumnNames, List<String> idColumnValueGetters) {

src/main/java/org/folio/fqm/service/FqlToSqlConverterService.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@
1717
import org.folio.fql.service.FqlValidationService;
1818
import org.folio.fqm.exception.FieldNotFoundException;
1919
import org.folio.fqm.exception.InvalidFqlException;
20-
import org.folio.fqm.utils.MarcFieldFactory;
21-
import org.folio.fqm.utils.MarcFieldFactory.MarcQueryContext;
20+
import org.folio.fqm.utils.MarcSqlFactory;
21+
import org.folio.fqm.utils.MarcSqlFactory.MarcQueryContext;
2222
import org.folio.fqm.utils.SqlFieldIdentificationUtils;
2323
import org.folio.querytool.domain.dto.ArrayType;
2424
import org.folio.querytool.domain.dto.DateTimeType;
@@ -107,7 +107,7 @@ public static Condition getSqlCondition(FqlCondition<?> fqlCondition, EntityType
107107
Field fqmField = getField(fieldCondition, entityType);
108108
if (fqmField.getDataType() instanceof MarcType) {
109109
MarcQueryContext marcQueryContext =
110-
MarcFieldFactory.createQueryContext(entityType, fieldCondition.field().getColumnName())
110+
MarcSqlFactory.createQueryContext(entityType, fieldCondition.field().getColumnName())
111111
.orElseThrow(() -> new FieldNotFoundException(entityType.getName(), fieldCondition.field()));
112112
return handleMarcCondition(fieldCondition, entityType, marcQueryContext);
113113
}

src/main/java/org/folio/fqm/service/QueryManagementService.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,9 @@
33
import lombok.Setter;
44
import lombok.extern.log4j.Log4j2;
55
import org.apache.commons.collections4.CollectionUtils;
6-
import org.folio.fqm.utils.MarcFieldFactory;
6+
import org.folio.fqm.utils.MarcSqlFactory;
77
import org.folio.fql.service.FqlValidationService;
8+
import org.folio.fql.service.MarcFieldFactory;
89
import org.folio.fqm.domain.Query;
910
import org.folio.fqm.domain.QueryStatus;
1011
import org.folio.fqm.domain.dto.PurgedQueries;
@@ -300,7 +301,7 @@ public void deleteQuery(UUID queryId) {
300301

301302
public void validateQuery(UUID entityTypeId, String fqlQuery) {
302303
EntityType entityType = entityTypeService.getEntityTypeDefinition(entityTypeId, true);
303-
EntityType entityTypeWithMarcFields = MarcFieldFactory.addSyntheticColumns(
304+
EntityType entityTypeWithMarcFields = MarcSqlFactory.addSyntheticColumns(
304305
entityType,
305306
fqlQuery,
306307
executionContext.getTenantId()

src/main/java/org/folio/fqm/utils/MarcFieldFactory.java renamed to src/main/java/org/folio/fqm/utils/MarcSqlFactory.java

Lines changed: 13 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import lombok.experimental.UtilityClass;
1212
import org.folio.fql.model.FqlCondition;
1313
import org.folio.fql.model.field.MarcFieldName;
14+
import org.folio.fql.service.MarcFieldFactory;
1415
import org.folio.fqm.exception.InvalidEntityTypeDefinitionException;
1516
import org.folio.querytool.domain.dto.EntityType;
1617
import org.folio.querytool.domain.dto.EntityTypeColumn;
@@ -20,47 +21,26 @@
2021
* Builds the SQL-bearing synthetic columns and query contexts for dynamic MARC fields.
2122
*
2223
* <p>MARC field-name parsing, recognition, placeholder detection, and metadata-only column generation are owned
23-
* by the shared lib ({@link org.folio.fql.service.MarcFieldFactory}), so the grammar lives in exactly one place.
24-
* This class layers the mod-fqm-manager-specific SQL onto the lib's parsed results: the {@code valueGetter} that
25-
* correlates against the marc_indexers view, the filter/value functions, and the row-level predicates used for
26-
* querying.
24+
* by the shared lib ({@link MarcFieldFactory}), so the grammar lives in exactly one place. This class layers the
25+
* mod-fqm-manager-specific SQL onto the lib's parsed results: the {@code valueGetter} that correlates against the
26+
* marc_indexers view, the filter/value functions, and the row-level predicates used for querying.
2727
*/
2828
@UtilityClass
29-
public class MarcFieldFactory {
29+
public class MarcSqlFactory {
3030

3131
private static final String MARC_INDEXERS_VIEW = "${tenant_id}_mod_fqm_manager.src_srs_marc_indexers";
3232
private static final String MARC_VALUE_FUNCTION = "lower(:value)";
3333
private static final Pattern MARC_TABLE_PATTERN =
3434
Pattern.compile("FROM\\s+(?<table>\\S+)\\s+marc", Pattern.CASE_INSENSITIVE);
3535

36-
// ---- Delegation to the shared lib -----------------------------------------------------------------------
37-
// Thin pass-throughs so existing mod-fqm-manager call sites keep a single entry point while the grammar and
38-
// placeholder logic live in the lib.
39-
40-
public static Set<String> getReferencedMarcFieldNames(String rawQuery) {
41-
return org.folio.fql.service.MarcFieldFactory.getReferencedMarcFieldNames(rawQuery);
42-
}
43-
44-
public static Set<String> getReferencedMarcFieldNames(FqlCondition<?> condition) {
45-
return org.folio.fql.service.MarcFieldFactory.getReferencedMarcFieldNames(condition);
46-
}
47-
48-
public static Optional<EntityTypeColumn> findMarcPlaceholder(EntityType entityType) {
49-
return org.folio.fql.service.MarcFieldFactory.findMarcPlaceholder(entityType);
50-
}
51-
52-
public static boolean isGenericMarcPlaceholder(EntityTypeColumn column) {
53-
return org.folio.fql.service.MarcFieldFactory.isGenericMarcPlaceholder(column);
54-
}
55-
5636
// ---- Synthetic column construction ----------------------------------------------------------------------
5737

5838
public static EntityType addSyntheticColumns(EntityType entityType, String rawQuery, String tenantId) {
59-
return addSyntheticColumns(entityType, getReferencedMarcFieldNames(rawQuery), tenantId);
39+
return addSyntheticColumns(entityType, MarcFieldFactory.getReferencedMarcFieldNames(rawQuery), tenantId);
6040
}
6141

6242
public static EntityType addSyntheticColumns(EntityType entityType, FqlCondition<?> condition, String tenantId) {
63-
return addSyntheticColumns(entityType, getReferencedMarcFieldNames(condition), tenantId);
43+
return addSyntheticColumns(entityType, MarcFieldFactory.getReferencedMarcFieldNames(condition), tenantId);
6444
}
6545

6646
public static EntityType addSyntheticColumns(EntityType entityType, Collection<String> fieldNames, String tenantId) {
@@ -88,8 +68,8 @@ public static EntityType addSyntheticColumns(EntityType entityType, Collection<S
8868
}
8969

9070
public static Optional<EntityTypeColumn> createSyntheticColumn(EntityType entityType, String fieldName, String tenantId) {
91-
Optional<MarcFieldName> parsedField = org.folio.fql.service.MarcFieldFactory.parse(fieldName);
92-
Optional<EntityTypeColumn> placeholder = findMarcPlaceholder(entityType);
71+
Optional<MarcFieldName> parsedField = MarcFieldFactory.parse(fieldName);
72+
Optional<EntityTypeColumn> placeholder = MarcFieldFactory.findMarcPlaceholder(entityType);
9373

9474
if (parsedField.isEmpty() || placeholder.isEmpty()) {
9575
return Optional.empty();
@@ -113,15 +93,15 @@ public static Optional<EntityTypeColumn> createSyntheticColumn(EntityType entity
11393

11494
MarcFieldName marcField = parsedField.get();
11595
// The lib supplies the metadata-only column (name, label, marcType); mod-fqm-manager layers on the SQL.
116-
return Optional.of(org.folio.fql.service.MarcFieldFactory.toColumn(marcField)
96+
return Optional.of(MarcFieldFactory.toColumn(marcField)
11797
.valueGetter(buildValueGetter(marcField, marcPlaceholder.getValueGetter(), tenantId))
11898
.filterValueGetter(filterValueGetter(marcField))
11999
.valueFunction(MARC_VALUE_FUNCTION));
120100
}
121101

122102
public static Optional<MarcQueryContext> createQueryContext(EntityType entityType, String fieldName) {
123-
Optional<MarcFieldName> parsedField = org.folio.fql.service.MarcFieldFactory.parse(fieldName);
124-
Optional<EntityTypeColumn> placeholder = findMarcPlaceholder(entityType);
103+
Optional<MarcFieldName> parsedField = MarcFieldFactory.parse(fieldName);
104+
Optional<EntityTypeColumn> placeholder = MarcFieldFactory.findMarcPlaceholder(entityType);
125105
Optional<EntityTypeColumn> syntheticField = EntityTypeUtils.findColumn(entityType, fieldName);
126106

127107
if (parsedField.isEmpty() || placeholder.isEmpty() || syntheticField.isEmpty()) {
@@ -205,7 +185,7 @@ public record MarcQueryContext(MarcFieldName marcField, String tableName, String
205185

206186
/** SQL expression the search value is compared against (the value column, or an indicator column). */
207187
public String filterValueGetter() {
208-
return MarcFieldFactory.filterValueGetter(marcField);
188+
return MarcSqlFactory.filterValueGetter(marcField);
209189
}
210190

211191
public String whereClause() {

src/test/java/org/folio/fqm/service/FqlToSqlConverterServiceTest.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import org.folio.fql.service.FqlService;
44
import org.folio.fqm.exception.FieldNotFoundException;
55
import org.folio.fqm.exception.InvalidFqlException;
6-
import org.folio.fqm.utils.MarcFieldFactory;
6+
import org.folio.fqm.utils.MarcSqlFactory;
77
import org.folio.querytool.domain.dto.ArrayType;
88
import org.folio.querytool.domain.dto.DateTimeType;
99
import org.folio.querytool.domain.dto.DateType;
@@ -117,7 +117,7 @@ void setup() {
117117
))))
118118
)
119119
);
120-
entityType = MarcFieldFactory.addSyntheticColumns(entityType,
120+
entityType = MarcSqlFactory.addSyntheticColumns(entityType,
121121
List.of("marc_245_a", "marc_245", "marc_245_ind1", "marc_245_ind1_7_a", "marc_245_ind1_blank_a"), "diku");
122122
}
123123

@@ -1553,7 +1553,7 @@ void shouldThrowExceptionForInvalidDateTimeValue() {
15531553
void shouldGenerateMarcSubfieldContainsCondition() {
15541554
// Representative end-to-end check that a MARC subfield reference routes into the MARC exists-subquery
15551555
// against the correct table/field_no/subfield_no. The other operator tests assume routing works and
1556-
// assert only the operator-specific shape; the exact clause SQL is verified in MarcFieldFactoryTest.
1556+
// assert only the operator-specific shape; the exact clause SQL is verified in MarcSqlFactoryTest.
15571557
String rendered = renderMarcCondition("""
15581558
{"marc_245_a": {"$contains": "Shakespeare"}}""");
15591559

@@ -1568,7 +1568,7 @@ void shouldGenerateMarcSubfieldContainsCondition() {
15681568

15691569
// Equality-style operator routing across the two MARC value-handling paths: subfield/tag values
15701570
// (lower(marc.value)) and indicators (lower(marc.ind1)). The exact clause SQL is verified in
1571-
// MarcFieldFactoryTest; here we only assert that each operator routes to the right clause shape.
1571+
// MarcSqlFactoryTest; here we only assert that each operator routes to the right clause shape.
15721572
@ParameterizedTest(name = "{0}")
15731573
@MethodSource("marcEqualityOperatorCases")
15741574
void shouldRouteMarcEqualityOperator(String label, String fql,

0 commit comments

Comments
 (0)