private String getDescription(StringBuilder builder, String type) { switch (type) { case MetadataEntity.NAMESPACE: builder.append(String.format("%s: %s", MetadataEntity.NAMESPACE, getValue(MetadataEntity.NAMESPACE))); return builder.toString(); case MetadataEntity.APPLICATION: String description = String.format("%s: %s", MetadataEntity.APPLICATION, getValue(MetadataEntity.APPLICATION)); getValue(MetadataEntity.VERSION)); case MetadataEntity.ARTIFACT: builder.append(String.format("%s: %s of %s: %s deployed in ", MetadataEntity.ARTIFACT, getValue(MetadataEntity.ARTIFACT), MetadataEntity.VERSION, getValue(MetadataEntity.VERSION))); return getDescription(builder, MetadataEntity.NAMESPACE); case MetadataEntity.DATASET: builder.append(String.format("%s: %s which exists in ", MetadataEntity.DATASET, getValue(MetadataEntity.DATASET))); return getDescription(builder, MetadataEntity.NAMESPACE); case MetadataEntity.PROGRAM: builder.append(String.format("%s: %s in ", getValue(MetadataEntity.TYPE).toLowerCase(), getValue(MetadataEntity.PROGRAM))); return getDescription(builder, MetadataEntity.APPLICATION); case MetadataEntity.SCHEDULE: builder.append(String.format("%s: %s in ", MetadataEntity.SCHEDULE, getValue(MetadataEntity.SCHEDULE))); return getDescription(builder, MetadataEntity.APPLICATION); case MetadataEntity.PROGRAM_RUN: builder.append(String.format("%s: %s of ", MetadataEntity.PROGRAM_RUN, getValue(MetadataEntity.PROGRAM_RUN)));
@Override public Set<String> getIndexes(MetadataEntry entry) { Set<String> indexes = new HashSet<>(); indexes.add(entry.getMetadataEntity().getType() + MetadataConstants.KEYVALUE_SEPARATOR + entry.getMetadataEntity().getValue(entry.getMetadataEntity().getType())); return indexes; }
@Override public Set<String> getIndexes(MetadataEntry entry) { Set<String> indexes = new HashSet<>(); indexes.add(entry.getMetadataEntity().getType() + MetadataDataset.KEYVALUE_SEPARATOR + entry.getMetadataEntity().getValue(entry.getMetadataEntity().getType())); return indexes; }
metadataEntity.getValue(MetadataEntity.VERSION) : ApplicationId.DEFAULT_VERSION; if (entityType == EntityType.APPLICATION) {
metadataEntity.getValue(MetadataEntity.VERSION) : ApplicationId.DEFAULT_VERSION; if (entityType == EntityType.APPLICATION) {
@Test public void testPublishing() { generateMetadataUpdates(); // Audit messages for metadata changes List<AuditMessage> actualAuditMessages = new ArrayList<>(); String systemNs = NamespaceId.SYSTEM.getNamespace(); for (AuditMessage auditMessage : auditPublisher.popMessages()) { // Ignore system audit messages if (auditMessage.getType() == AuditType.METADATA_CHANGE) { if (!systemNs.equalsIgnoreCase(auditMessage.getEntity().getValue(MetadataEntity.NAMESPACE))) { actualAuditMessages.add(auditMessage); } } } Assert.assertEquals(expectedAuditMessages, actualAuditMessages); }
txnl.execute(() -> { Assert.assertEquals(ImmutableList.of(new MetadataEntry(program1, "key1", "value1")), searchByDefaultIndex(program1.getValue(MetadataEntity.NAMESPACE), "value1", Collections.emptySet())); Assert.assertEquals(ImmutableList.of(new MetadataEntry(program1, "key2", "value2")), searchByDefaultIndex(program1.getValue(MetadataEntity.NAMESPACE), "value2", Collections.emptySet())); Assert.assertEquals(ImmutableList.of(new MetadataEntry(program1, MetadataConstants.TAGS_KEY, "tag1,tag2")), searchByDefaultIndex(program1.getValue(MetadataEntity.NAMESPACE), "tag2", Collections.emptySet())); }); searchByDefaultIndex(program1.getValue(MetadataEntity.NAMESPACE), "value1", Collections.emptySet())); searchByDefaultIndex(program1.getValue(MetadataEntity.NAMESPACE), "value3", Collections.emptySet())); searchByDefaultIndex(program1.getValue(MetadataEntity.NAMESPACE), "value2", Collections.emptySet())); searchByDefaultIndex(program1.getValue(MetadataEntity.NAMESPACE), "tag2", ImmutableSet.of())) searchByDefaultIndex(program1.getValue(MetadataEntity.NAMESPACE), "tag1", ImmutableSet.of()) ); });
/** * Store indexes for a {@link MetadataEntry} * @param indexers {@link Set<String>} of {@link Indexer indexers} for this {@link MetadataEntry} * @param metadataEntry {@link MetadataEntry} for which indexes are to be stored */ void storeIndexes(MetadataEntry metadataEntry, Set<Indexer> indexers) { // Delete existing indexes for metadataEntity-key deleteIndexes(metadataEntry.getMetadataEntity(), metadataEntry.getKey()); String namespacePrefix = metadataEntry.getMetadataEntity().getValue(MetadataEntity.NAMESPACE) + KEYVALUE_SEPARATOR; for (Indexer indexer : indexers) { Set<String> indexes = indexer.getIndexes(metadataEntry); IndexColumn indexColumn = getIndexColumn(metadataEntry.getKey(), indexer.getSortOrder()); for (String index : indexes) { if (index.isEmpty()) { continue; } // store one value for within namespace search and one for cross namespace search String lowercaseIndex = index.toLowerCase(); MDSKey mdsIndexKey = MetadataKey.createIndexRowKey(metadataEntry.getMetadataEntity(), metadataEntry.getKey(), lowercaseIndex); Put put = new Put(mdsIndexKey.getKey()); put.add(Bytes.toBytes(indexColumn.getCrossNamespaceColumn()), Bytes.toBytes(lowercaseIndex)); put.add(Bytes.toBytes(indexColumn.getColumn()), Bytes.toBytes(namespacePrefix + lowercaseIndex)); indexedTable.put(put); } } }
/** * Store indexes for a {@link MetadataEntry} * @param indexers {@link Set<String>} of {@link Indexer indexers} for this {@link MetadataEntry} * @param metadataEntry {@link MetadataEntry} for which indexes are to be stored */ private void storeIndexes(MetadataEntry metadataEntry, Set<Indexer> indexers) { // Delete existing indexes for metadataEntity-key deleteIndexes(metadataEntry.getMetadataEntity(), metadataEntry.getKey()); String namespacePrefix = metadataEntry.getMetadataEntity().getValue(MetadataEntity.NAMESPACE) + MetadataConstants.KEYVALUE_SEPARATOR; for (Indexer indexer : indexers) { Set<String> indexes = indexer.getIndexes(metadataEntry); IndexColumn indexColumn = getIndexColumn(metadataEntry.getKey(), indexer.getSortOrder()); for (String index : indexes) { if (index.isEmpty()) { continue; } // store one value for within namespace search and one for cross namespace search String lowercaseIndex = index.toLowerCase(); MDSKey mdsIndexKey = MetadataKey.createIndexRowKey(metadataEntry.getMetadataEntity(), metadataEntry.getKey(), lowercaseIndex); Put put = new Put(mdsIndexKey.getKey()); put.add(Bytes.toBytes(indexColumn.getCrossNamespaceColumn()), Bytes.toBytes(lowercaseIndex)); put.add(Bytes.toBytes(indexColumn.getColumn()), Bytes.toBytes(namespacePrefix + lowercaseIndex)); indexedTable.put(put); } } }
dataset.addProperty(app1, AbstractSystemMetadataWriter.ENTITY_NAME_KEY, appName); }); NamespaceId namespaceId = new NamespaceId(program1.getValue(MetadataEntity.NAMESPACE)); EnumSet<EntityTypeSimpleName> targets = EnumSet.allOf(EntityTypeSimpleName.class); MetadataEntry flowEntry = new MetadataEntry(program1, AbstractSystemMetadataWriter.ENTITY_NAME_KEY, flowName);
dataset.addProperty(dataset1, AbstractSystemMetadataWriter.CREATION_TIME_KEY, String.valueOf(creationTime)); }); final String namespaceId = program1.getValue(MetadataEntity.NAMESPACE); txnl.execute(() -> {