package com.thinkbiganalytics.metadata.modeshape.feed; /*- * #%L * thinkbig-metadata-modeshape * %% * Copyright (C) 2017 ThinkBig Analytics * %% * Licensed 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. * #L% */ import com.thinkbiganalytics.metadata.api.MetadataAccess; import com.thinkbiganalytics.metadata.api.category.Category; import com.thinkbiganalytics.metadata.api.datasource.Datasource; import com.thinkbiganalytics.metadata.api.datasource.DatasourceProvider; import com.thinkbiganalytics.metadata.api.datasource.DerivedDatasource; import com.thinkbiganalytics.metadata.api.feed.Feed; import com.thinkbiganalytics.metadata.api.feed.FeedDestination; import com.thinkbiganalytics.metadata.api.feed.FeedProvider; import com.thinkbiganalytics.metadata.api.template.FeedManagerTemplate; import com.thinkbiganalytics.metadata.api.template.FeedManagerTemplateProvider; import com.thinkbiganalytics.metadata.api.template.TemplateDeletionException; import com.thinkbiganalytics.metadata.modeshape.JcrMetadataAccess; import com.thinkbiganalytics.metadata.modeshape.JcrTestConfig; import com.thinkbiganalytics.metadata.modeshape.ModeShapeEngineConfig; import com.thinkbiganalytics.metadata.modeshape.security.AdminCredentials; import com.thinkbiganalytics.support.FeedNameUtil; import org.junit.Test; import org.junit.runner.RunWith; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.annotation.ComponentScan; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.testng.Assert; import java.util.HashSet; import java.util.List; import java.util.Set; import javax.inject.Inject; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = {ModeShapeEngineConfig.class, JcrTestConfig.class, FeedTestConfig.class}) @ComponentScan(basePackages = {"com.thinkbiganalytics.metadata.modeshape"}) public class FeedManagerFeedTest { private static final Logger log = LoggerFactory.getLogger(FeedManagerFeedTest.class); @Inject FeedProvider feedProvider; @Inject FeedManagerTemplateProvider feedManagerTemplateProvider; @Inject private DatasourceProvider datasourceProvider; @Inject private JcrMetadataAccess metadata; @Inject private FeedTestUtil feedTestUtil; private boolean deleteTemplate(String templateName) { //try to delete the template. This should fail since there are feeds attached to it return metadata.commit(() -> { FeedManagerTemplate template = feedTestUtil.findOrCreateTemplate(templateName); return feedManagerTemplateProvider.deleteTemplate(template.getId()); }, MetadataAccess.SERVICE); } private void setupFeedAndTemplate(String categorySystemName, String feedName, String templateName) { //first create the category metadata.commit(() -> { Category category = feedTestUtil.findOrCreateCategory(categorySystemName); return category.getId(); }, MetadataAccess.SERVICE); //creqte the feed metadata.commit(() -> { Feed feed = feedTestUtil.findOrCreateFeed(categorySystemName, feedName, templateName); return feed.getId(); }, MetadataAccess.SERVICE); //ensure the feed relates to the template metadata.read(() -> { FeedManagerTemplate template = feedTestUtil.findOrCreateTemplate(templateName); List<Feed> feeds = template.getFeeds(); Assert.assertTrue(feeds != null && feeds.size() > 0); }, MetadataAccess.SERVICE); } /** * Test querying a large number of feeds */ @Test public void testLotsOfFeeds() { //increase to query more .. i.e. 1000 int numberOfFeeds = 5; int numberOfFeedsPerCategory = 20; String templateName = "my_template"; int categories = numberOfFeeds / numberOfFeedsPerCategory; //create all the categories metadata.commit(() -> { for (int i = 1; i <= categories; i++) { Category category = feedTestUtil.createCategory("category_" + i); } }, MetadataAccess.ADMIN); metadata.commit(() -> { FeedManagerTemplate template = feedTestUtil.findOrCreateTemplate(templateName); }, MetadataAccess.ADMIN); //create the feeds metadata.commit(() -> { FeedManagerTemplate template = feedTestUtil.findOrCreateTemplate(templateName); Category category = null; int categoryNum = 0; String categoryName = "category" + categoryNum; for (int i = 0; i < numberOfFeeds; i++) { if (i % numberOfFeedsPerCategory == 0) { categoryNum++; categoryName = "category_" + categoryNum; category = feedTestUtil.findOrCreateCategory(categoryName); } Feed feed = feedTestUtil.findOrCreateFeed(category, "feed_" + i, template); } }, MetadataAccess.ADMIN); //now query it long time = System.currentTimeMillis(); Integer size = metadata.read(new AdminCredentials(), () -> { List<Feed> feeds = feedProvider.findAll(); return feeds.size(); }); long stopTime = System.currentTimeMillis(); log.info("Time to query {} feeds was {} ms", size, (stopTime - time)); } @Test public void testFeedDatasource() { String categorySystemName = "my_category"; String feedName = "my_feed"; String templateName = "my_template"; String description = " my feed description"; setupFeedAndTemplate(categorySystemName, feedName, templateName); // boolean isDefineTable = true; // boolean isGetFile = false; metadata.commit(() -> { Feed feed = feedTestUtil.findFeed(categorySystemName, feedName); Set<Datasource.ID> sources = new HashSet<Datasource.ID>(); Set<com.thinkbiganalytics.metadata.api.datasource.Datasource.ID> destinations = new HashSet<>(); //Add Table Dependencies String uniqueName = FeedNameUtil.fullName(categorySystemName, feedName); DerivedDatasource srcDatasource = datasourceProvider.ensureDatasource(uniqueName, feed.getDescription(), DerivedDatasource.class); sources.add(srcDatasource.getId()); DerivedDatasource destDatasource = datasourceProvider.ensureDatasource("destination", feed.getDescription(), DerivedDatasource.class); destinations.add(destDatasource.getId()); sources.stream().forEach(sourceId -> feedProvider.ensureFeedSource(feed.getId(), sourceId)); destinations.stream().forEach(destinationId -> feedProvider.ensureFeedDestination(feed.getId(), destinationId)); }, MetadataAccess.SERVICE); //ensure the sources and dest got created metadata.read(() -> { Feed feed = feedTestUtil.findFeed(categorySystemName, feedName); Assert.assertNotNull(feed.getSources()); Assert.assertTrue(feed.getSources().size() == 1, "Feed Sources should be 1"); Assert.assertNotNull(feed.getDestinations()); Assert.assertTrue(feed.getDestinations().size() == 1, "Feed Destinations should be 1"); List<? extends FeedDestination> feedDestinations = feed.getDestinations(); if (feedDestinations != null) { FeedDestination feedDestination = feedDestinations.get(0); Datasource ds = feedDestination.getDatasource(); Assert.assertTrue(ds instanceof DerivedDatasource, "Datasource was not expected DerivedDatasource"); } }, MetadataAccess.SERVICE); } @Test public void testFeedTemplates() { String categorySystemName = "my_category"; String feedName = "my_feed"; String templateName = "my_template"; setupFeedAndTemplate(categorySystemName, feedName, templateName); //try to delete the template. This should fail since there are feeds attached to it Boolean deleteStatus = null; try { deleteStatus = deleteTemplate(templateName); } catch (TemplateDeletionException e) { Assert.assertNotNull(e); deleteStatus = false; } //assert that we could not delete it Assert.assertFalse(deleteStatus); //try to delete the feed metadata.commit(() -> { Feed feed = feedTestUtil.findFeed(categorySystemName, feedName); Assert.assertNotNull(feed); if (feed != null) { feedProvider.delete(feed); } }, MetadataAccess.SERVICE); //ensure it is deleted metadata.read(() -> { Feed feed = feedTestUtil.findFeed(categorySystemName, feedName); Assert.assertNull(feed); }, MetadataAccess.SERVICE); //try to delete the template. This should succeed since the feeds are gone deleteStatus = deleteTemplate(templateName); Assert.assertEquals(deleteStatus.booleanValue(), true); } }