From 86d8b9703a9b317eb1e43ad0e90d9be8f30d9116 Mon Sep 17 00:00:00 2001 From: Thorsten Marx Date: Sat, 11 Jan 2025 16:16:12 +0100 Subject: [PATCH] add exists query for fields --- .../com/condation/cms/api/db/ContentQuery.java | 2 ++ .../filesystem/metadata/memory/MemoryQuery.java | 5 +++++ .../cms/filesystem/metadata/memory/QueryUtil.java | 14 ++++++++------ .../metadata/persistent/LuceneQuery.java | 8 +++++++- .../metadata/persistent/QueryHelper.java | 2 +- .../cms/filesystem/PresistentFileSystemTest.java | 13 +++++++++++++ .../condation/cms/filesystem/query/QueryTest.java | 7 +++++++ cms-filesystem/src/test/resources/content/index.md | 3 ++- .../src/test/resources/content/test/test1.md | 3 ++- 9 files changed, 47 insertions(+), 10 deletions(-) diff --git a/cms-api/src/main/java/com/condation/cms/api/db/ContentQuery.java b/cms-api/src/main/java/com/condation/cms/api/db/ContentQuery.java index 106445fbc..b541a85cd 100644 --- a/cms-api/src/main/java/com/condation/cms/api/db/ContentQuery.java +++ b/cms-api/src/main/java/com/condation/cms/api/db/ContentQuery.java @@ -64,6 +64,8 @@ public interface ContentQuery { ContentQuery whereNotIn(final String field, final Object... value); ContentQuery whereNotIn(final String field, final List value); + + ContentQuery whereExists(final String field); public static interface Sort { public ContentQuery asc(); diff --git a/cms-filesystem/src/main/java/com/condation/cms/filesystem/metadata/memory/MemoryQuery.java b/cms-filesystem/src/main/java/com/condation/cms/filesystem/metadata/memory/MemoryQuery.java index 2f0e45ea4..2ae0e0cea 100644 --- a/cms-filesystem/src/main/java/com/condation/cms/filesystem/metadata/memory/MemoryQuery.java +++ b/cms-filesystem/src/main/java/com/condation/cms/filesystem/metadata/memory/MemoryQuery.java @@ -111,6 +111,11 @@ public MemoryQuery whereNotIn(final String field, final List value) { return where(field, Queries.Operator.NOT_IN, value); } + @Override + public MemoryQuery whereExists(final String field) { + return new MemoryQuery<>(QueryUtil.exists(context, field)); + } + private MemoryQuery where(final String field, final Queries.Operator operator, final Object value) { return new MemoryQuery<>(filtered(context, field, value, operator)); } diff --git a/cms-filesystem/src/main/java/com/condation/cms/filesystem/metadata/memory/QueryUtil.java b/cms-filesystem/src/main/java/com/condation/cms/filesystem/metadata/memory/QueryUtil.java index 1d5509a61..f21794e4c 100644 --- a/cms-filesystem/src/main/java/com/condation/cms/filesystem/metadata/memory/QueryUtil.java +++ b/cms-filesystem/src/main/java/com/condation/cms/filesystem/metadata/memory/QueryUtil.java @@ -21,7 +21,6 @@ * . * #L% */ - import com.condation.cms.api.db.ContentNode; import com.condation.cms.api.utils.MapUtil; import com.condation.cms.filesystem.metadata.query.Queries; @@ -40,8 +39,6 @@ @Slf4j public final class QueryUtil { - - public static Map> groupby(final Stream nodes, final String field) { return nodes.collect(Collectors.groupingBy((node) -> MapUtil.getValue(node.data(), field))); } @@ -66,6 +63,14 @@ protected static QueryContext sorted(final QueryConte return context; } + public static QueryContext exists(final QueryContext context, final String field) { + context.setNodes(context.getNodes().filter((node) -> { + var node_value = MapUtil.getValue(((ContentNode)node).data(), field); + return node_value != null; + })); + return context; + } + public static QueryContext filtered(final QueryContext context, final String field, final Object value, final Queries.Operator operator) { context.setNodes(context.getNodes().filter(createPredicate(field, value, operator))); return context; @@ -92,7 +97,4 @@ protected static QueryContext filter_extension(final QueryContext context, final context.setNodes(context.getNodes().filter(Queries.createExtensionPredicate(field, value, predicate))); return context; } - - - } diff --git a/cms-filesystem/src/main/java/com/condation/cms/filesystem/metadata/persistent/LuceneQuery.java b/cms-filesystem/src/main/java/com/condation/cms/filesystem/metadata/persistent/LuceneQuery.java index 15ca0bb02..fd937a95a 100644 --- a/cms-filesystem/src/main/java/com/condation/cms/filesystem/metadata/persistent/LuceneQuery.java +++ b/cms-filesystem/src/main/java/com/condation/cms/filesystem/metadata/persistent/LuceneQuery.java @@ -269,10 +269,16 @@ public ContentQuery whereNotIn(String field, Object... value) { public ContentQuery whereNotIn(String field, List value) { return where(field, Queries.Operator.NOT_IN, value); } + + @Override + public ContentQuery whereExists(String field) { + QueryHelper.exists(queryBuilder, field); + return this; + } private ContentQuery where(final String field, final Queries.Operator operator, final Object value) { - QueryHelper.exists(queryBuilder, field, value); + QueryHelper.exists(queryBuilder, field); switch (operator) { case EQ -> diff --git a/cms-filesystem/src/main/java/com/condation/cms/filesystem/metadata/persistent/QueryHelper.java b/cms-filesystem/src/main/java/com/condation/cms/filesystem/metadata/persistent/QueryHelper.java index be05bc4c5..6d0cb23c1 100644 --- a/cms-filesystem/src/main/java/com/condation/cms/filesystem/metadata/persistent/QueryHelper.java +++ b/cms-filesystem/src/main/java/com/condation/cms/filesystem/metadata/persistent/QueryHelper.java @@ -47,7 +47,7 @@ @Slf4j public class QueryHelper { - public static void exists(BooleanQuery.Builder queryBuilder, String field, Object value) { + public static void exists(BooleanQuery.Builder queryBuilder, String field) { if (true) { queryBuilder.add( diff --git a/cms-filesystem/src/test/java/com/condation/cms/filesystem/PresistentFileSystemTest.java b/cms-filesystem/src/test/java/com/condation/cms/filesystem/PresistentFileSystemTest.java index 5fe1a3e4b..65ad2d711 100644 --- a/cms-filesystem/src/test/java/com/condation/cms/filesystem/PresistentFileSystemTest.java +++ b/cms-filesystem/src/test/java/com/condation/cms/filesystem/PresistentFileSystemTest.java @@ -118,6 +118,19 @@ public void test_query_with_start_uri() throws IOException { Assertions.assertThat(nodes.getFirst().uri()).isEqualTo("test/test1.md"); } + @Test + public void test_field_exists() throws IOException { + + var nodes = fileSystem.query("/test", (node, i) -> node).whereExists("keywords").get(); + + Assertions.assertThat(nodes).hasSize(1); + Assertions.assertThat(nodes.getFirst().uri()).isEqualTo("test/test1.md"); + + nodes = fileSystem.query((node, i) -> node).whereExists("keywords").get(); + + Assertions.assertThat(nodes).hasSize(2); + } + @Test public void test_custom_operation() throws IOException { diff --git a/cms-filesystem/src/test/java/com/condation/cms/filesystem/query/QueryTest.java b/cms-filesystem/src/test/java/com/condation/cms/filesystem/query/QueryTest.java index 9a500f913..67d3cc4c9 100644 --- a/cms-filesystem/src/test/java/com/condation/cms/filesystem/query/QueryTest.java +++ b/cms-filesystem/src/test/java/com/condation/cms/filesystem/query/QueryTest.java @@ -290,4 +290,11 @@ public void test_where_not_null() { query.where("index", "=", null).get(); Assertions.assertThat(nodes).hasSize(2); } + + @Test + public void test_where_exists() { + MemoryQuery query = createQuery(); + var nodes = query.whereExists("index").get(); + Assertions.assertThat(nodes).hasSize(2); + } } diff --git a/cms-filesystem/src/test/resources/content/index.md b/cms-filesystem/src/test/resources/content/index.md index 2e5f2adde..e72167977 100644 --- a/cms-filesystem/src/test/resources/content/index.md +++ b/cms-filesystem/src/test/resources/content/index.md @@ -1,3 +1,4 @@ featured: true publish_date: 2024-09-23 -name: start \ No newline at end of file +name: start +keywords: ["eins", "zwei"] \ No newline at end of file diff --git a/cms-filesystem/src/test/resources/content/test/test1.md b/cms-filesystem/src/test/resources/content/test/test1.md index 8479c758f..05acf4b04 100644 --- a/cms-filesystem/src/test/resources/content/test/test1.md +++ b/cms-filesystem/src/test/resources/content/test/test1.md @@ -4,4 +4,5 @@ taxonomy: tags: [eins, zwei] number1: 1 number2: 5 -publish_date: 2024-10-01 \ No newline at end of file +publish_date: 2024-10-01 +keywords: ["eins", "zwei"] \ No newline at end of file