This is an automated email from the ASF dual-hosted git repository.
shuber pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/unomi.git
The following commit(s) were added to refs/heads/master by this push:
new 130e7eb UNOMI-349: Implement CDP_View GET by performing aggregate
query on scopes (#203)
130e7eb is described below
commit 130e7eba44db2792ea9f2bde617cf8b86b3687c9
Author: anatol-sialitski <[email protected]>
AuthorDate: Wed Oct 14 11:33:07 2020 +0300
UNOMI-349: Implement CDP_View GET by performing aggregate query on scopes
(#203)
---
.../unomi/graphql/fetchers/ViewDataFetcher.java | 44 ++++--
.../apache/unomi/itests/graphql/GraphQLViewIT.java | 154 +++++++++++++++++++++
.../test/resources/graphql/views/get-views.json | 5 +
3 files changed, 195 insertions(+), 8 deletions(-)
diff --git
a/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/fetchers/ViewDataFetcher.java
b/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/fetchers/ViewDataFetcher.java
index e9c9985..0f48933 100644
---
a/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/fetchers/ViewDataFetcher.java
+++
b/graphql/cxs-impl/src/main/java/org/apache/unomi/graphql/fetchers/ViewDataFetcher.java
@@ -16,19 +16,47 @@
*/
package org.apache.unomi.graphql.fetchers;
-import graphql.schema.DataFetcher;
-import graphql.schema.DataFetchingEnvironment;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+import org.apache.unomi.api.Topic;
+import org.apache.unomi.api.lists.UserList;
+import org.apache.unomi.api.segments.Segment;
+import org.apache.unomi.graphql.services.ServiceManager;
import org.apache.unomi.graphql.types.output.CDPView;
+import org.apache.unomi.persistence.spi.PersistenceService;
+import org.apache.unomi.persistence.spi.aggregate.TermsAggregate;
-import java.util.Collections;
-import java.util.List;
+import graphql.schema.DataFetcher;
+import graphql.schema.DataFetchingEnvironment;
-public class ViewDataFetcher implements DataFetcher<List<CDPView>> {
+public class ViewDataFetcher
+ implements DataFetcher<List<CDPView>>
+{
@Override
- public List<CDPView> get(final DataFetchingEnvironment environment) throws
Exception {
- // Unomi doesn't have an API for that yet, so return a stub
- return Collections.emptyList();
+ public List<CDPView> get( final DataFetchingEnvironment environment )
+ throws Exception
+ {
+ final ServiceManager serviceManager = environment.getContext();
+
+ final PersistenceService persistenceService =
serviceManager.getService( PersistenceService.class );
+
+ final List<Map<String, Long>> scopes = new ArrayList<>();
+
+ scopes.add( persistenceService.aggregateWithOptimizedQuery( null, new
TermsAggregate( "scope" ), Topic.ITEM_TYPE ) );
+ scopes.add( persistenceService.aggregateWithOptimizedQuery( null, new
TermsAggregate( "metadata.scope" ), Segment.ITEM_TYPE ) );
+ scopes.add( persistenceService.aggregateWithOptimizedQuery( null, new
TermsAggregate( "metadata.scope" ), UserList.ITEM_TYPE ) );
+
+ return scopes.stream().
+ filter( Objects::nonNull ).
+ map( Map::keySet ).
+ flatMap( scopeAsKeys -> scopeAsKeys.stream().
+ filter( scope -> !"_filtered".equals( scope ) &&
!"_missing".equals( scope ) && !"_all".equals( scope ) ).
+ map( CDPView::new ) ).collect( Collectors.toList() );
}
}
diff --git
a/itests/src/test/java/org/apache/unomi/itests/graphql/GraphQLViewIT.java
b/itests/src/test/java/org/apache/unomi/itests/graphql/GraphQLViewIT.java
new file mode 100644
index 0000000..5c12b83
--- /dev/null
+++ b/itests/src/test/java/org/apache/unomi/itests/graphql/GraphQLViewIT.java
@@ -0,0 +1,154 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+package org.apache.unomi.itests.graphql;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+
+import javax.inject.Inject;
+
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.unomi.api.Metadata;
+import org.apache.unomi.api.Topic;
+import org.apache.unomi.api.conditions.Condition;
+import org.apache.unomi.api.segments.Segment;
+import org.apache.unomi.api.services.DefinitionsService;
+import org.apache.unomi.api.services.SegmentService;
+import org.apache.unomi.api.services.TopicService;
+import org.apache.unomi.lists.UserList;
+import org.apache.unomi.services.UserListService;
+import org.junit.Assert;
+import org.junit.Test;
+import org.ops4j.pax.exam.util.Filter;
+
+public class GraphQLViewIT
+ extends BaseGraphQLIT
+{
+
+ @Inject
+ @Filter(timeout = 600000)
+ protected UserListService userListService;
+
+ @Inject
+ @Filter(timeout = 600000)
+ protected TopicService topicService;
+
+ @Inject
+ @Filter(timeout = 600000)
+ protected SegmentService segmentService;
+
+ @Inject
+ @Filter(timeout = 600000)
+ protected DefinitionsService definitionsService;
+
+ @Test
+ public void test()
+ throws Exception
+ {
+ // prepare
+ final UserList userList = createList();
+ final Topic topic = createTopic();
+ final Segment segment = createSegment();
+
+ persistenceService.refresh();
+
+ // test
+ try (CloseableHttpResponse response = post(
"graphql/views/get-views.json" ))
+ {
+ final ResponseContext context = ResponseContext.parse(
response.getEntity() );
+
+ Assert.assertNotNull( context.getValue( "data.cdp.getViews" ) );
+
+ List<Map> views = context.getValue( "data.cdp.getViews" );
+
+ Assert.assertTrue( views.size() >= 3 );
+ }
+ finally
+ {
+ topicService.delete( topic.getTopicId() );
+ userListService.delete( userList.getItemId() );
+ segmentService.removeSegmentDefinition( segment.getItemId(), false
);
+ }
+ }
+
+ private Topic createTopic()
+ throws InterruptedException
+ {
+ final Topic topic = new Topic();
+
+ topic.setTopicId( "topicId_GraphQLViewIT" );
+ topic.setItemId( "topicId_GraphQLViewIT" );
+ topic.setName( "topicName_GraphQLViewIT" );
+ topic.setScope( "scope_GraphQLViewIT" );
+
+ topicService.save( topic );
+
+ keepTrying( "Failed waiting for the creation of the topic for the
GraphQLViewIT test", () -> topicService.load( topic.getItemId() ),
+ Objects::nonNull, 1000, 100 );
+
+ return topic;
+ }
+
+ private UserList createList()
+ throws InterruptedException
+ {
+ final Metadata metadata = new Metadata();
+
+ metadata.setId( "userListId_GraphQLViewIT" );
+ metadata.setName( "userListName_GraphQLViewIT" );
+ metadata.setScope( "userListScope_GraphQLViewIT" );
+
+ final UserList userList = new UserList();
+
+ userList.setItemType( UserList.ITEM_TYPE );
+ userList.setMetadata( metadata );
+
+ userListService.save( userList );
+
+ keepTrying( "Failed waiting for the creation of the userList for the
GraphQLViewIT test",
+ () -> userListService.load( userList.getItemId() ),
Objects::nonNull, 1000, 100 );
+
+ return userList;
+ }
+
+ private Segment createSegment()
+ throws InterruptedException
+ {
+ final Segment segment = new Segment();
+
+ segment.setItemType( Segment.ITEM_TYPE );
+ segment.setMetadata( new Metadata() );
+
+ segment.setItemId( "segmentId_GraphQLViewIT" );
+ segment.getMetadata().setId( "segmentId_GraphQLViewIT" );
+ segment.getMetadata().setName( "segmentName_GraphQLViewIT" );
+ segment.getMetadata().setScope( "segmentScope_GraphQLViewIT" );
+
+ final Condition condition = new Condition(
definitionsService.getConditionType( "matchAllCondition" ) );
+
+ segment.setCondition( condition );
+
+ segmentService.setSegmentDefinition( segment );
+
+ keepTrying( "Failed waiting for the creation of the segment for the
GraphQLViewIT test",
+ () -> segmentService.getSegmentDefinition(
segment.getItemId() ), Objects::nonNull, 1000, 100 );
+
+ return segment;
+ }
+
+}
diff --git a/itests/src/test/resources/graphql/views/get-views.json
b/itests/src/test/resources/graphql/views/get-views.json
new file mode 100644
index 0000000..60f3496
--- /dev/null
+++ b/itests/src/test/resources/graphql/views/get-views.json
@@ -0,0 +1,5 @@
+{
+ "operationName": "getViews",
+ "variables": {},
+ "query": "query getViews {\n cdp {\n getViews {\n name\n }\n
}\n}\n"
+}