fix(ISSUE-64): guard malformed compliance search rows

Signed-off-by: dongmucat <1127093059@qq.com>
This commit is contained in:
dongmucat 2026-07-06 15:21:33 +08:00
parent 1905125e27
commit 4f193a5eba
2 changed files with 6 additions and 2 deletions

View file

@ -134,7 +134,8 @@ public class PostgresFullTextQueryService implements SearchQueryService {
if (hasComplianceStandard) {
sql.append("AND EXISTS (");
sql.append("SELECT 1 FROM jsonb_array_elements(");
sql.append("COALESCE(latest.parsed_metadata_json -> 'frontmatter' -> 'x-astron-compliance', '[]'::jsonb)");
sql.append("CASE WHEN jsonb_typeof(latest.parsed_metadata_json -> 'frontmatter' -> 'x-astron-compliance') = 'array' ");
sql.append("THEN latest.parsed_metadata_json -> 'frontmatter' -> 'x-astron-compliance' ELSE '[]'::jsonb END");
sql.append(") AS compliance_item ");
sql.append("WHERE LOWER(BTRIM(compliance_item ->> 'standard')) = :complianceStandard");
sql.append(") ");

View file

@ -326,7 +326,10 @@ class PostgresFullTextQueryServiceTest {
ArgumentCaptor<String> sqlCaptor = ArgumentCaptor.forClass(String.class);
verify(entityManager, org.mockito.Mockito.times(2)).createNativeQuery(sqlCaptor.capture());
assertThat(sqlCaptor.getAllValues().getFirst()).contains(
"jsonb_array_elements(COALESCE(latest.parsed_metadata_json -> 'frontmatter' -> 'x-astron-compliance', '[]'::jsonb))"
"jsonb_array_elements(CASE WHEN jsonb_typeof(latest.parsed_metadata_json -> 'frontmatter' -> 'x-astron-compliance') = 'array'"
);
assertThat(sqlCaptor.getAllValues().getFirst()).contains(
"THEN latest.parsed_metadata_json -> 'frontmatter' -> 'x-astron-compliance' ELSE '[]'::jsonb END)"
);
assertThat(sqlCaptor.getAllValues().getFirst()).contains("LOWER(BTRIM(compliance_item ->> 'standard')) = :complianceStandard");
verify(nativeQuery).setParameter("complianceStandard", "gdpr");