From 0008d677ea53c7ac6a1f13f1a5af36d053f8ae72 Mon Sep 17 00:00:00 2001 From: Enrico Risa Date: Wed, 12 Feb 2025 16:47:36 +0100 Subject: [PATCH] chore: improves issuance process query on credentialDefinitions field (#573) --- .../SqlIssuanceProcessStoreExtension.java | 2 +- .../postgres/IssuanceProcessMapping.java | 3 +- .../postgres/PostgresDialectStatements.java | 41 +------------------ .../SqlIssuanceProcessStoreTest.java | 2 +- .../postgres/CredentialDefinitionMapping.java | 2 +- .../schema/postgres/ParticipantMapping.java | 2 +- 6 files changed, 7 insertions(+), 45 deletions(-) diff --git a/extensions/store/sql/issuance-process-store-sql/src/main/java/org/eclipse/edc/issuerservice/store/sql/issuanceprocess/SqlIssuanceProcessStoreExtension.java b/extensions/store/sql/issuance-process-store-sql/src/main/java/org/eclipse/edc/issuerservice/store/sql/issuanceprocess/SqlIssuanceProcessStoreExtension.java index 0ad337f97..23d7fc973 100644 --- a/extensions/store/sql/issuance-process-store-sql/src/main/java/org/eclipse/edc/issuerservice/store/sql/issuanceprocess/SqlIssuanceProcessStoreExtension.java +++ b/extensions/store/sql/issuance-process-store-sql/src/main/java/org/eclipse/edc/issuerservice/store/sql/issuanceprocess/SqlIssuanceProcessStoreExtension.java @@ -68,7 +68,7 @@ public IssuanceProcessStore createSqlStore(ServiceExtensionContext context) { } private IssuanceProcessStoreStatements getStatementImpl() { - return statements != null ? statements : new PostgresDialectStatements(typemanager.getMapper()); + return statements != null ? statements : new PostgresDialectStatements(); } } diff --git a/extensions/store/sql/issuance-process-store-sql/src/main/java/org/eclipse/edc/issuerservice/store/sql/issuanceprocess/schema/postgres/IssuanceProcessMapping.java b/extensions/store/sql/issuance-process-store-sql/src/main/java/org/eclipse/edc/issuerservice/store/sql/issuanceprocess/schema/postgres/IssuanceProcessMapping.java index e36ee4067..34fd87084 100644 --- a/extensions/store/sql/issuance-process-store-sql/src/main/java/org/eclipse/edc/issuerservice/store/sql/issuanceprocess/schema/postgres/IssuanceProcessMapping.java +++ b/extensions/store/sql/issuance-process-store-sql/src/main/java/org/eclipse/edc/issuerservice/store/sql/issuanceprocess/schema/postgres/IssuanceProcessMapping.java @@ -16,6 +16,7 @@ import org.eclipse.edc.issuerservice.store.sql.issuanceprocess.IssuanceProcessStoreStatements; import org.eclipse.edc.sql.lease.StatefulEntityMapping; +import org.eclipse.edc.sql.translation.JsonArrayTranslator; import org.eclipse.edc.sql.translation.JsonFieldTranslator; @@ -34,6 +35,6 @@ public IssuanceProcessMapping(IssuanceProcessStoreStatements statements) { add(FIELD_ID, statements.getIdColumn()); add(FIELD_PARTICIPANT_ID, statements.getParticipantIdColumn()); add(FIELD_CLAIMS, new JsonFieldTranslator(FIELD_CLAIMS)); - add(FIELD_CREDENTIAL_DEFINITIONS, statements.getCredentialDefinitionsColumn()); + add(FIELD_CREDENTIAL_DEFINITIONS, new JsonArrayTranslator(statements.getCredentialDefinitionsColumn())); } } \ No newline at end of file diff --git a/extensions/store/sql/issuance-process-store-sql/src/main/java/org/eclipse/edc/issuerservice/store/sql/issuanceprocess/schema/postgres/PostgresDialectStatements.java b/extensions/store/sql/issuance-process-store-sql/src/main/java/org/eclipse/edc/issuerservice/store/sql/issuanceprocess/schema/postgres/PostgresDialectStatements.java index 1b8b34126..50c5ca971 100644 --- a/extensions/store/sql/issuance-process-store-sql/src/main/java/org/eclipse/edc/issuerservice/store/sql/issuanceprocess/schema/postgres/PostgresDialectStatements.java +++ b/extensions/store/sql/issuance-process-store-sql/src/main/java/org/eclipse/edc/issuerservice/store/sql/issuanceprocess/schema/postgres/PostgresDialectStatements.java @@ -14,27 +14,17 @@ package org.eclipse.edc.issuerservice.store.sql.issuanceprocess.schema.postgres; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; import org.eclipse.edc.issuerservice.store.sql.issuanceprocess.BaseSqlDialectStatements; -import org.eclipse.edc.spi.persistence.EdcPersistenceException; -import org.eclipse.edc.spi.query.QuerySpec; import org.eclipse.edc.sql.dialect.PostgresDialect; import org.eclipse.edc.sql.translation.PostgresqlOperatorTranslator; -import org.eclipse.edc.sql.translation.SqlQueryStatement; - -import static org.eclipse.edc.issuerservice.store.sql.issuanceprocess.schema.postgres.IssuanceProcessMapping.FIELD_CREDENTIAL_DEFINITIONS; /** * Postgres-specific specialization for creating queries based on Postgres JSON operators */ public class PostgresDialectStatements extends BaseSqlDialectStatements { - private final ObjectMapper mapper; - - public PostgresDialectStatements(ObjectMapper mapper) { + public PostgresDialectStatements() { super(new PostgresqlOperatorTranslator()); - this.mapper = mapper; } @@ -43,33 +33,4 @@ public String getFormatAsJsonOperator() { return PostgresDialect.getJsonCastOperator(); } - @Override - public SqlQueryStatement createQuery(QuerySpec querySpec) { - - // if any criterion credentialDefinition array field, we need to slightly adapt the FROM clause - // by including a JSONB containment operator - if (querySpec.containsAnyLeftOperand(FIELD_CREDENTIAL_DEFINITIONS)) { - var select = "SELECT * FROM %s ".formatted(getIssuanceProcessTable()); - - var criteria = querySpec.getFilterExpression(); - var filteredCriteria = criteria.stream() - .filter(c -> c.getOperandLeft().toString().startsWith(FIELD_CREDENTIAL_DEFINITIONS)) - .toList(); - - criteria.removeAll(filteredCriteria); - var stmt = new SqlQueryStatement(select, querySpec, new IssuanceProcessMapping(this), operatorTranslator); - filteredCriteria.forEach(c -> { - var rightOperand = c.getOperandRight(); - try { - var rightOperandJson = mapper.writeValueAsString(rightOperand); - stmt.addWhereClause("%s @> ?::jsonb".formatted(getCredentialDefinitionsColumn()), rightOperandJson); - } catch (JsonProcessingException e) { - throw new EdcPersistenceException(e); - } - - }); - return stmt; - } - return super.createQuery(querySpec); - } } diff --git a/extensions/store/sql/issuance-process-store-sql/src/test/java/org/eclipse/edc/issuerservice/store/sql/issuanceprocess/SqlIssuanceProcessStoreTest.java b/extensions/store/sql/issuance-process-store-sql/src/test/java/org/eclipse/edc/issuerservice/store/sql/issuanceprocess/SqlIssuanceProcessStoreTest.java index 9358c9b2c..9f7bea18b 100644 --- a/extensions/store/sql/issuance-process-store-sql/src/test/java/org/eclipse/edc/issuerservice/store/sql/issuanceprocess/SqlIssuanceProcessStoreTest.java +++ b/extensions/store/sql/issuance-process-store-sql/src/test/java/org/eclipse/edc/issuerservice/store/sql/issuanceprocess/SqlIssuanceProcessStoreTest.java @@ -42,7 +42,7 @@ class SqlIssuanceProcessStoreTest extends IssuanceProcessStoreTestBase { void setup(PostgresqlStoreSetupExtension extension, QueryExecutor queryExecutor) { var typeManager = new JacksonTypeManager(); - statements = new PostgresDialectStatements(typeManager.getMapper()); + statements = new PostgresDialectStatements(); store = new SqlIssuanceProcessStore(extension.getDataSourceRegistry(), extension.getDatasourceName(), extension.getTransactionContext(), typeManager.getMapper(), queryExecutor, statements, RUNTIME_ID, Clock.systemUTC()); diff --git a/extensions/store/sql/issuerservice-credential-definition-store-sql/src/main/java/org/eclipse/edc/issuerservice/store/sql/attestationdefinition/schema/postgres/CredentialDefinitionMapping.java b/extensions/store/sql/issuerservice-credential-definition-store-sql/src/main/java/org/eclipse/edc/issuerservice/store/sql/attestationdefinition/schema/postgres/CredentialDefinitionMapping.java index 20b062641..b42bcb5d5 100644 --- a/extensions/store/sql/issuerservice-credential-definition-store-sql/src/main/java/org/eclipse/edc/issuerservice/store/sql/attestationdefinition/schema/postgres/CredentialDefinitionMapping.java +++ b/extensions/store/sql/issuerservice-credential-definition-store-sql/src/main/java/org/eclipse/edc/issuerservice/store/sql/attestationdefinition/schema/postgres/CredentialDefinitionMapping.java @@ -50,7 +50,7 @@ public CredentialDefinitionMapping(CredentialDefinitionStoreStatements statement add(FIELD_JSON_SCHEMA_URL, statements.getJsonSchemaUrlColumn()); add(FIELD_VALIDITY, statements.getValidityColumn()); add(FIELD_DATAMODEL, statements.getDataModelColumn()); - add(FIELD_ATTESTATIONS, new JsonArrayTranslator()); + add(FIELD_ATTESTATIONS, new JsonArrayTranslator(statements.getAttestationsColumn())); add(FIELD_RULES, new JsonFieldTranslator(RULES_ALIAS)); add(FIELD_MAPPINGS, new JsonFieldTranslator(MAPPING_ALIAS)); } diff --git a/extensions/store/sql/issuerservice-participant-store-sql/src/main/java/org/eclipse/edc/issuerservice/store/sql/participant/schema/postgres/ParticipantMapping.java b/extensions/store/sql/issuerservice-participant-store-sql/src/main/java/org/eclipse/edc/issuerservice/store/sql/participant/schema/postgres/ParticipantMapping.java index 9c208d054..f40eebb61 100644 --- a/extensions/store/sql/issuerservice-participant-store-sql/src/main/java/org/eclipse/edc/issuerservice/store/sql/participant/schema/postgres/ParticipantMapping.java +++ b/extensions/store/sql/issuerservice-participant-store-sql/src/main/java/org/eclipse/edc/issuerservice/store/sql/participant/schema/postgres/ParticipantMapping.java @@ -37,6 +37,6 @@ public ParticipantMapping(ParticipantStoreStatements statements) { add(FIELD_LASTMODIFIED_TIMESTAMP, statements.getLastModifiedTimestampColumn()); add(FIELD_NAME, statements.getParticipantNameColumn()); add(FIELD_DID, statements.getDidColumn()); - add(FIELD_ATTESTATIONS, new JsonArrayTranslator()); + add(FIELD_ATTESTATIONS, new JsonArrayTranslator(statements.getAttestationsColumn())); } } \ No newline at end of file