package com.thinkbiganalytics.metadata.modeshape;
/*-
* #%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.category.CategoryProvider;
import com.thinkbiganalytics.metadata.api.datasource.DatasourceProvider;
import com.thinkbiganalytics.metadata.api.extension.ExtensibleType;
import com.thinkbiganalytics.metadata.api.extension.ExtensibleTypeProvider;
import com.thinkbiganalytics.metadata.api.extension.FieldDescriptor;
import com.thinkbiganalytics.metadata.api.feed.Feed;
import com.thinkbiganalytics.metadata.api.feed.FeedProvider;
import com.thinkbiganalytics.metadata.api.feed.FeedSource;
import com.thinkbiganalytics.metadata.api.template.FeedManagerTemplateProvider;
import com.thinkbiganalytics.metadata.modeshape.category.JcrCategory;
import com.thinkbiganalytics.metadata.modeshape.common.JcrObject;
import com.thinkbiganalytics.metadata.modeshape.datasource.JcrDatasource;
import com.thinkbiganalytics.metadata.modeshape.datasource.JcrDerivedDatasource;
import com.thinkbiganalytics.metadata.modeshape.feed.JcrFeed;
import com.thinkbiganalytics.metadata.modeshape.feed.JcrFeedProvider;
import com.thinkbiganalytics.metadata.modeshape.support.JcrVersionUtil;
import com.thinkbiganalytics.metadata.modeshape.tag.TagProvider;
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.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
import javax.inject.Inject;
import javax.jcr.Node;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.jcr.version.Version;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {ModeShapeEngineConfig.class, JcrTestConfig.class, JcrPropertyTestConfig.class})
@ComponentScan(basePackages = {"com.thinkbiganalytics.metadata.modeshape.op"})
public class JcrPropertyTest {
private static final Logger log = LoggerFactory.getLogger(JcrPropertyTest.class);
@Inject
CategoryProvider categoryProvider;
@Inject
DatasourceProvider datasourceProvider;
@Inject
FeedProvider feedProvider;
@Inject
TagProvider tagProvider;
@Inject
private ExtensibleTypeProvider provider;
@Inject
private JcrMetadataAccess metadata;
@Test
public void testGetPropertyTypes() throws RepositoryException {
Map<String, FieldDescriptor.Type> propertyTypeMap = metadata.commit(() -> {
ExtensibleType feedType = provider.getType("tba:feed");
Set<FieldDescriptor> fields = feedType.getFieldDescriptors();
Map<String, FieldDescriptor.Type> map = new HashMap<>();
for (FieldDescriptor field : fields) {
map.put(field.getName(), field.getType());
}
return map;
}, MetadataAccess.SERVICE);
log.info("Property Types {} ", propertyTypeMap);
}
/**
* Creates a new Category Creates a new Feed Updates the Feed Get Feed and its versions Validates Feed is versioned along with its properties and can successfully return a version
*/
@Test
public void testFeed() {
String categorySystemName = "my_category";
Category category = metadata.commit(() -> {
JcrCategory cat = (JcrCategory) categoryProvider.ensureCategory(categorySystemName);
cat.setDescription("my category desc");
cat.setTitle("my category");
categoryProvider.update(cat);
return cat;
}, MetadataAccess.SERVICE);
final JcrFeed.FeedId createdFeedId = metadata.commit(() -> {
String sysName = "my_category";
JcrCategory cat = (JcrCategory) categoryProvider.ensureCategory(sysName);
cat.setDescription("my category desc");
cat.setTitle("my category");
categoryProvider.update(cat);
JcrDerivedDatasource datasource1 = (JcrDerivedDatasource) datasourceProvider.ensureDerivedDatasource("HiveDatasource", "mysql.table1", "mysql.table1", "mysql table source 1", null);
JcrDerivedDatasource datasource2 = (JcrDerivedDatasource) datasourceProvider.ensureDerivedDatasource("HiveDatasource", "mysql.table2", "mysql.table2", "mysql table source 2", null);
JcrDerivedDatasource emptySource1 = (JcrDerivedDatasource) datasourceProvider.ensureDerivedDatasource("HDFSDatasource", "", "", "empty hdfs source", null);
JcrDerivedDatasource emptySource2 = (JcrDerivedDatasource) datasourceProvider.ensureDerivedDatasource("HDFSDatasource", "", "", "empty hdfs source", null);
Assert.assertEquals(emptySource1.getId(), emptySource2.getId());
JcrDerivedDatasource emptySource3 = (JcrDerivedDatasource) datasourceProvider.ensureDerivedDatasource("HDFSDatasource", null, null, "empty hdfs source", null);
JcrDerivedDatasource emptySource4 = (JcrDerivedDatasource) datasourceProvider.ensureDerivedDatasource("HDFSDatasource", null, null, "empty hdfs source", null);
Assert.assertEquals(emptySource3.getId(), emptySource4.getId());
JcrDerivedDatasource
datasource3 =
(JcrDerivedDatasource) datasourceProvider.ensureDerivedDatasource("HDFSDatasource", "/etl/customers/swert/012320342", "/etl/customers/swert/012320342", "mysql hdfs source", null);
JcrDerivedDatasource
datasource4 =
(JcrDerivedDatasource) datasourceProvider.ensureDerivedDatasource("HDFSDatasource", "/etl/customers/swert/012320342", "/etl/customers/swert/012320342", "mysql hdfs source", null);
Assert.assertEquals(datasource3.getId(), datasource4.getId());
String feedSystemName = "my_feed_" + UUID.randomUUID();
// JcrFeed feed = (JcrFeed) feedProvider.ensureFeed(categorySystemName, feedSystemName, "my feed desc", datasource1.getId(), null);
JcrFeed feed = (JcrFeed) feedProvider.ensureFeed(sysName, feedSystemName, "my feed desc");
feedProvider.ensureFeedSource(feed.getId(), datasource1.getId());
feedProvider.ensureFeedSource(feed.getId(), datasource2.getId());
feed.setTitle("my feed");
feed.addTag("my tag");
feed.addTag("my second tag");
feed.addTag("feedTag");
Map<String, Object> otherProperties = new HashMap<String, Object>();
otherProperties.put("prop1", "my prop1");
otherProperties.put("prop2", "my prop2");
feed.setProperties(otherProperties);
return feed.getId();
}, MetadataAccess.SERVICE);
//read and find feed verisons and ensure props
JcrFeed.FeedId readFeedId = metadata.read(() -> {
Session s = null;
JcrFeed f = (JcrFeed) ((JcrFeedProvider) feedProvider).findById(createdFeedId);
// TODO: Feed vesioning disabled for Kylo v0.5.0
// int versions = printVersions(f);
// Assert.assertTrue(versions > 1, "Expecting more than 1 version: jcr:rootVersion, 1.0");
@SuppressWarnings("unchecked")
List<? extends FeedSource> sources = f.getSources();
Assert.assertTrue(sources.size() > 0);
if (sources != null) {
for (FeedSource source : sources) {
Map<String, Object> dataSourceProperties = ((JcrDatasource) source.getDatasource()).getAllProperties();
String type = (String) dataSourceProperties.get(JcrDerivedDatasource.TYPE_NAME);
Assert.assertEquals(type, "HiveDatasource");
}
}
List<JcrObject> taggedObjects = tagProvider.findByTag("my tag");
//assert we got 1 feed back
Assert.assertTrue(taggedObjects.size() >= 1);
return f.getId();
}, MetadataAccess.SERVICE);
//update the feed again
JcrFeed.FeedId updatedFeed = metadata.commit(() -> {
JcrFeed f = (JcrFeed) ((JcrFeedProvider) feedProvider).findById(createdFeedId);
f.setDescription("My Feed Updated Description");
Map<String, Object> otherProperties = new HashMap<String, Object>();
otherProperties.put("prop1", "my updated prop1");
f.setProperties(otherProperties);
((JcrFeedProvider) feedProvider).update(f);
return f.getId();
}, MetadataAccess.SERVICE);
//read it again and find the versions
readFeedId = metadata.read(() -> {
JcrFeed f = (JcrFeed) ((JcrFeedProvider) feedProvider).findById(updatedFeed);
// TODO: Feed vesioning disabled for Kylo v0.5.0
// int versions = printVersions(f);
// Assert.assertTrue(versions > 2, "Expecting more than 2 versions: jcr:rootVersion, 1.0, 1.1");
// JcrFeed v1 = JcrVersionUtil.getVersionedNode(f, "1.0", JcrFeed.class);
// JcrFeed v11 = JcrVersionUtil.getVersionedNode(f, "1.1", JcrFeed.class);
// String v1Prop1 = v1.getProperty("prop1", String.class);
// String v11Prop1 = v11.getProperty("prop1", String.class);
// JcrFeed baseVersion = JcrVersionUtil.getVersionedNode(JcrVersionUtil.getBaseVersion(f.getNode()), JcrFeed.class);
//Assert the Props get versioned
// Assert.assertEquals(v1Prop1, "my prop1");
// Assert.assertEquals(v11Prop1, "my updated prop1");
// Assert.assertEquals(v1.getDescription(), "my feed desc");
// Assert.assertEquals(v11.getDescription(), "My Feed Updated Description");
// String v = v11.getVersionName();
// Feed.ID v1Id = v1.getId();
// Feed.ID v11Id = v11.getId();
// Feed.ID baseId = baseVersion.getId();
//assert all ids are equal
// Assert.assertEquals(v1Id, v11Id);
// Assert.assertEquals(v1Id, baseId);
return f.getId();
}, MetadataAccess.SERVICE);
}
private int printVersions(JcrObject o) {
List<Version> versions = JcrVersionUtil.getVersions(o.getNode());
int versionCount = versions.size();
log.info(" {}. Version count: {}", o.getNodeName(), versionCount);
for (Version v : versions) {
try {
log.info("Version: {}", v.getName());
} catch (RepositoryException e) {
e.printStackTrace();
}
}
return versionCount;
}
@Test
public void queryTest() {
//final String query = "select e.* from [tba:feed] as e join [tba:category] c on e.[tba:category].[tba:systemName] = c.[tba:systemName] where c.[tba:systemName] = $category ";
final String query = "select e.* from [tba:feed] as e join [tba:category] as c on e.[tba:category] = c.[jcr:uuid]";
metadata.read(() -> {
List<Node> feeds = ((JcrFeedProvider) feedProvider).findNodes(query);
}, MetadataAccess.SERVICE);
metadata.read(() -> {
List<Category> c = categoryProvider.findAll();
if (c != null) {
for (Category cat : c) {
Category jcrCategory = (Category) cat;
List<? extends Feed> categoryFeeds = jcrCategory.getFeeds();
if (categoryFeeds != null) {
for (Feed feed : categoryFeeds) {
log.info("Feed for category {} is {}", cat.getName(), feed.getName());
}
}
}
}
}, MetadataAccess.SERVICE);
}
@Test
public void testFeedManager() {
Feed feed = metadata.read(() -> {
List<Feed> feeds = feedProvider.findAll();
if (feeds != null) {
return feeds.get(0);
}
return null;
}, MetadataAccess.SERVICE);
}
@Test
public void testMergeProps() {
testFeed();
Map<String, Object> props = new HashMap<>();
props.put("name", "An Old User");
props.put("age", 140);
Map<String, Object> props2 = metadata.commit(() -> {
List<? extends Feed> feeds = feedProvider.getFeeds();
Feed feed = null;
//grab the first feed
if (feeds != null) {
feed = feeds.get(0);
}
feedProvider.mergeFeedProperties(feed.getId(), props);
return feed.getProperties();
}, MetadataAccess.SERVICE);
props.put("address", "Some road");
props2 = metadata.commit(() -> {
List<? extends Feed> feeds = feedProvider.getFeeds();
Feed feed = null;
//grab the first feed
if (feeds != null) {
feed = feeds.get(0);
}
feedProvider.mergeFeedProperties(feed.getId(), props);
return feed.getProperties();
}, MetadataAccess.SERVICE);
org.junit.Assert.assertEquals("Some road", props2.get("address"));
//Now Replace
props.remove("address");
props2 = metadata.commit(() -> {
List<? extends Feed> feeds = feedProvider.getFeeds();
Feed feed = null;
//grab the first feed
if (feeds != null) {
feed = feeds.get(0);
}
feedProvider.replaceProperties(feed.getId(), props);
return feed.getProperties();
}, MetadataAccess.SERVICE);
Assert.assertNull(props2.get("address"));
}
}