use of io.cdap.cdap.spi.metadata.MetadataMutation.Update in project cdap by caskdata.
the class MetadataStorageTest method testUpdateRemove.
@Test
public void testUpdateRemove() throws IOException {
MetadataStorage mds = getMetadataStorage();
MetadataEntity entity = ofDataset(DEFAULT_NAMESPACE, "entity");
// get metadata for non-existing entity
verifyMetadata(mds, entity, Metadata.EMPTY);
// add some metadata for the entity
Metadata metadata = new Metadata(ImmutableSet.of(new ScopedName(SYSTEM, "sysTag"), new ScopedName(USER, "userTag")), ImmutableMap.of(new ScopedName(SYSTEM, "sysProp"), "sysVal", new ScopedName(USER, "userProp"), "userVal"));
MetadataChange change = mds.apply(new Update(entity, metadata), MutationOptions.DEFAULT);
Assert.assertEquals(new MetadataChange(entity, Metadata.EMPTY, metadata), change);
verifyMetadata(mds, entity, metadata);
// remove everything
change = mds.apply(new Remove(entity), MutationOptions.DEFAULT);
Assert.assertEquals(new MetadataChange(entity, metadata, Metadata.EMPTY), change);
verifyMetadata(mds, entity, Metadata.EMPTY);
// add back all metadata, then remove everything in user scope
change = mds.apply(new Update(entity, metadata), MutationOptions.DEFAULT);
Assert.assertEquals(new MetadataChange(entity, Metadata.EMPTY, metadata), change);
verifyMetadata(mds, entity, metadata);
change = mds.apply(new Remove(entity, USER), MutationOptions.DEFAULT);
Metadata newMetadata = filterBy(metadata, SYSTEM, null);
Assert.assertEquals(new MetadataChange(entity, metadata, newMetadata), change);
verifyMetadata(mds, entity, newMetadata);
// add back all metadata, then remove everything in system scope
change = mds.apply(new Update(entity, metadata), MutationOptions.DEFAULT);
Assert.assertEquals(new MetadataChange(entity, newMetadata, metadata), change);
verifyMetadata(mds, entity, metadata);
change = mds.apply(new Remove(entity, SYSTEM), MutationOptions.DEFAULT);
newMetadata = filterBy(metadata, USER, null);
Assert.assertEquals(new MetadataChange(entity, metadata, newMetadata), change);
verifyMetadata(mds, entity, newMetadata);
// add back all metadata, then remove all tags
change = mds.apply(new Update(entity, metadata), MutationOptions.DEFAULT);
Assert.assertEquals(new MetadataChange(entity, newMetadata, metadata), change);
verifyMetadata(mds, entity, metadata);
change = mds.apply(new Remove(entity, TAG), MutationOptions.DEFAULT);
newMetadata = filterBy(metadata, null, PROPERTY);
Assert.assertEquals(new MetadataChange(entity, metadata, newMetadata), change);
verifyMetadata(mds, entity, newMetadata);
// add back all metadata, then remove all properties
change = mds.apply(new Update(entity, metadata), MutationOptions.DEFAULT);
Assert.assertEquals(new MetadataChange(entity, newMetadata, metadata), change);
verifyMetadata(mds, entity, metadata);
change = mds.apply(new Remove(entity, PROPERTY), MutationOptions.DEFAULT);
newMetadata = filterBy(metadata, null, TAG);
Assert.assertEquals(new MetadataChange(entity, metadata, newMetadata), change);
verifyMetadata(mds, entity, newMetadata);
// add back all metadata, then remove all properties in system scope
change = mds.apply(new Update(entity, metadata), MutationOptions.DEFAULT);
Assert.assertEquals(new MetadataChange(entity, newMetadata, metadata), change);
verifyMetadata(mds, entity, metadata);
change = mds.apply(new Remove(entity, SYSTEM, PROPERTY), MutationOptions.DEFAULT);
newMetadata = union(filterBy(metadata, SYSTEM, TAG), filterBy(metadata, USER, null));
Assert.assertEquals(new MetadataChange(entity, metadata, newMetadata), change);
verifyMetadata(mds, entity, newMetadata);
// add back all metadata, then remove all tags in user scope
change = mds.apply(new Update(entity, metadata), MutationOptions.DEFAULT);
Assert.assertEquals(new MetadataChange(entity, newMetadata, metadata), change);
verifyMetadata(mds, entity, metadata);
change = mds.apply(new Remove(entity, USER, TAG), MutationOptions.DEFAULT);
newMetadata = union(filterBy(metadata, USER, PROPERTY), filterBy(metadata, SYSTEM, null));
Assert.assertEquals(new MetadataChange(entity, metadata, newMetadata), change);
verifyMetadata(mds, entity, newMetadata);
// clean up
mds.apply(new Drop(entity), MutationOptions.DEFAULT);
}
use of io.cdap.cdap.spi.metadata.MetadataMutation.Update in project cdap by caskdata.
the class MetadataStorageTest method testSearchWithInvalidSchema.
@Test
public void testSearchWithInvalidSchema() throws IOException {
String invalidSchema = "an invalid schema";
MetadataEntity entity = MetadataEntity.ofDataset("myDs");
Metadata meta = new Metadata(SYSTEM, props(MetadataConstants.ENTITY_NAME_KEY, "myDs", MetadataConstants.SCHEMA_KEY, invalidSchema));
MetadataRecord record = new MetadataRecord(entity, meta);
MetadataStorage mds = getMetadataStorage();
mds.apply(new Update(entity, meta), MutationOptions.DEFAULT);
assertResults(mds, SearchRequest.of("myds").build(), record);
assertResults(mds, SearchRequest.of("schema:*").build(), record);
assertResults(mds, SearchRequest.of("properties:schema").build(), record);
assertResults(mds, SearchRequest.of("schema:inval*").build(), record);
// clean up
mds.apply(new Drop(entity), MutationOptions.DEFAULT);
}
use of io.cdap.cdap.spi.metadata.MetadataMutation.Update in project cdap by caskdata.
the class MetadataStorageTest method testUpdateSearch.
@Test
public void testUpdateSearch() throws IOException {
MetadataStorage mds = getMetadataStorage();
String ns = "ns";
MetadataEntity program = ofWorker(ofApp(ns, "app1"), "wk1");
Metadata meta = new Metadata(USER, tags("tag1", "tag2"), props("key1", "value1", "key2", "value2"));
MetadataRecord programRecord = new MetadataRecord(program, meta);
mds.apply(new Update(program, meta), MutationOptions.DEFAULT);
assertResults(mds, SearchRequest.of("value1").addNamespace(ns).build(), programRecord);
assertResults(mds, SearchRequest.of("value2").addNamespace(ns).build(), programRecord);
assertResults(mds, SearchRequest.of("tag2").addNamespace(ns).build(), programRecord);
mds.apply(new Update(program, new Metadata(USER, props("key1", "value3"))), MutationOptions.DEFAULT);
mds.apply(new Remove(program, ImmutableSet.of(new ScopedNameOfKind(PROPERTY, USER, "key2"), new ScopedNameOfKind(TAG, USER, "tag2"))), MutationOptions.DEFAULT);
programRecord = new MetadataRecord(program, new Metadata(USER, tags("tag1"), props("key1", "value3")));
// Searching for value1 should be empty
assertEmpty(mds, SearchRequest.of("value1").addNamespace(ns).build());
// Instead key1 has value value3 now
assertResults(mds, SearchRequest.of("value3").addNamespace(ns).build(), programRecord);
// key2 and tag2 were deleted
assertEmpty(mds, SearchRequest.of("value2").addNamespace(ns).build());
assertEmpty(mds, SearchRequest.of("tag2").addNamespace(ns).build());
// tag1 is still here
assertResults(mds, SearchRequest.of("tag1").addNamespace(ns).build(), programRecord);
// clean up
mds.apply(new Drop(program), MutationOptions.DEFAULT);
}
use of io.cdap.cdap.spi.metadata.MetadataMutation.Update in project cdap by caskdata.
the class MetadataStorageTest method testSearchDifferentNamespaces.
@Test
public void testSearchDifferentNamespaces() throws IOException {
MetadataStorage mds = getMetadataStorage();
String ns1 = "ns1";
MetadataEntity artifact = ofArtifact(ns1, "artifact", "1.0");
MetadataEntity sysArtifact = ofArtifact(SYSTEM_NAMESPACE, "artifact", "1.0");
String multiWordKey = "multiword";
String multiWordValue = "aV1 av2 , - , av3 - av4_av5 av6";
Metadata meta = new Metadata(SYSTEM, props(multiWordKey, multiWordValue));
MetadataRecord artifactRecord = new MetadataRecord(artifact, meta);
MetadataRecord sysArtifactRecord = new MetadataRecord(sysArtifact, meta);
mds.batch(batch(new Update(artifact, meta), new Update(sysArtifact, meta)), MutationOptions.DEFAULT);
// searching only user namespace should not return system entity
assertResults(mds, SearchRequest.of("aV5").addNamespace(ns1).build(), artifactRecord);
// searching only user namespace and system should return only the system entity
assertResults(mds, SearchRequest.of("aV5").addSystemNamespace().build(), sysArtifactRecord);
// searching only user namespace and system should return both entities
assertResults(mds, SearchRequest.of("aV5").addNamespace(ns1).addSystemNamespace().build(), artifactRecord, sysArtifactRecord);
// clean up
mds.batch(batch(new Drop(artifact), new Drop(sysArtifact)), MutationOptions.DEFAULT);
}
use of io.cdap.cdap.spi.metadata.MetadataMutation.Update in project cdap by cdapio.
the class MetadataStorageTest method testSearchPagination.
@Test
public void testSearchPagination() throws IOException {
MetadataStorage mds = getMetadataStorage();
String ns = "ns";
MetadataEntity app1 = ofApp(ns, "app");
MetadataEntity app2 = ofApp(ns, "app2");
MetadataEntity service = ofService(app1, "service");
MetadataEntity worker = ofWorker(app2, "worker");
MetadataEntity dataset = ofDataset(ns, "dataset");
MetadataEntity hidden = ofDataset(ns, "_auditLog");
MetadataRecord serviceRecord = new MetadataRecord(service, new Metadata(USER, tags("tag", "tag1")));
MetadataRecord workerRecord = new MetadataRecord(worker, new Metadata(USER, tags("tag2", "tag3 tag4")));
MetadataRecord datasetRecord = new MetadataRecord(dataset, new Metadata(USER, tags("tag5 tag6", "tag7 tag8")));
MetadataRecord hiddenRecord = new MetadataRecord(hidden, new Metadata(USER, tags("tag9", "tag10", "tag11", "tag12", "tag13")));
mds.batch(batch(new Update(service, serviceRecord.getMetadata()), new Update(worker, workerRecord.getMetadata()), new Update(dataset, datasetRecord.getMetadata()), new Update(hidden, hiddenRecord.getMetadata())), MutationOptions.DEFAULT);
// assert that search returns all records and determine the order of relevance )it varies by implementation)
SearchResponse response = mds.search(SearchRequest.of("tag*").addNamespace(ns).setShowHidden(true).setLimit(Integer.MAX_VALUE).build());
List<MetadataRecord> results = response.getResults();
List<MetadataRecord> noHidden = results.stream().filter(record -> !record.equals(hiddenRecord)).collect(Collectors.toList());
Assert.assertEquals(ImmutableSet.of(serviceRecord, workerRecord, datasetRecord, hiddenRecord), ImmutableSet.copyOf(results));
assertResults(mds, SearchRequest.of("tag*").addNamespace(ns).setLimit(Integer.MAX_VALUE).build(), noHidden.get(0), noHidden.get(1), noHidden.get(2));
// hidden entity should now be returned since showHidden is true
assertResults(mds, SearchRequest.of("tag*").addNamespace(ns).setShowHidden(true).build(), results.get(0), results.get(1), results.get(2), results.get(3));
assertResults(mds, SearchRequest.of("tag*").addNamespace(ns).setLimit(2).setCursorRequested(true).build(), noHidden.get(0), noHidden.get(1));
// skipping hidden entity should not affect the offset
assertResults(mds, SearchRequest.of("tag*").addNamespace(ns).setOffset(1).setLimit(2).build(), noHidden.get(1), noHidden.get(2));
// if showHidden is true, the hidden entity should affect the offset
assertResults(mds, SearchRequest.of("tag*").addNamespace(ns).setOffset(1).setLimit(3).setShowHidden(true).build(), results.get(1), results.get(2), results.get(3));
assertResults(mds, SearchRequest.of("tag*").addNamespace(ns).setOffset(2).setLimit(2).build(), noHidden.get(2));
assertEmpty(mds, SearchRequest.of("tag*").addNamespace(ns).setOffset(4).setLimit(2).build());
assertResults(mds, SearchRequest.of("tag*").addNamespace(ns).setOffset(1).build(), noHidden.get(1), noHidden.get(2));
// clean up
mds.batch(batch(new Drop(service), new Drop(worker), new Drop(dataset), new Drop(hidden)), MutationOptions.DEFAULT);
}
Aggregations