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"
+}

Reply via email to