Skip to content

Commit

Permalink
[CDAP-14806] Test and fix search on custom entities
Browse files Browse the repository at this point in the history
  • Loading branch information
anew committed Feb 19, 2019
1 parent 6965699 commit ec750e0
Show file tree
Hide file tree
Showing 20 changed files with 308 additions and 345 deletions.
Expand Up @@ -21,7 +21,6 @@
import co.cask.cdap.common.InvalidMetadataException;
import co.cask.cdap.common.metadata.MetadataRecord;
import co.cask.cdap.data2.metadata.dataset.SearchRequest;
import co.cask.cdap.proto.element.EntityTypeSimpleName;
import co.cask.cdap.proto.metadata.MetadataSearchResponse;

import java.util.Map;
Expand Down Expand Up @@ -135,7 +134,7 @@ public interface MetadataAdmin {

/**
* Executes a search for CDAP entities in the specified namespace with the specified search query and
* an optional set of {@link EntityTypeSimpleName entity types} in the specified {@link MetadataScope}.
* an optional set of entity types in the specified {@link MetadataScope}.
*
* @param request the search request
* @return the {@link MetadataSearchResponse} containing search results for the specified search query and filters
Expand Down
Expand Up @@ -29,14 +29,14 @@
import co.cask.cdap.proto.EntityScope;
import co.cask.cdap.proto.ProgramType;
import co.cask.cdap.proto.codec.NamespacedEntityIdCodec;
import co.cask.cdap.proto.element.EntityTypeSimpleName;
import co.cask.cdap.proto.id.EntityId;
import co.cask.cdap.proto.id.NamespaceId;
import co.cask.cdap.proto.id.NamespacedEntityId;
import co.cask.cdap.proto.metadata.MetadataSearchResponse;
import co.cask.http.AbstractHttpHandler;
import co.cask.http.HttpResponder;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.collect.ImmutableSet;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.reflect.TypeToken;
Expand All @@ -61,7 +61,6 @@
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.StreamSupport;
import javax.annotation.Nullable;
Expand All @@ -86,9 +85,6 @@ public class MetadataHttpHandler extends AbstractHttpHandler {
private static final Type SET_STRING_TYPE = new TypeToken<Set<String>>() { }.getType();
private static final Type SET_METADATA_RECORD_TYPE = new TypeToken<Set<MetadataRecord>>() { }.getType();

private static final Function<String, EntityTypeSimpleName> STRING_TO_TARGET_TYPE =
input -> EntityTypeSimpleName.valueOf(input.toUpperCase());

private final MetadataAdmin metadataAdmin;
private final LineageAdmin lineageAdmin;

Expand Down Expand Up @@ -247,10 +243,7 @@ private SearchRequest getValidatedSearchRequest(@Nullable String namespace, @Nul
int numCursors, String cursor, boolean showHidden, String entityScope)
throws BadRequestException, UnsupportedEncodingException {

Set<EntityTypeSimpleName> types = Collections.emptySet();
if (targets != null) {
types = targets.stream().map(STRING_TO_TARGET_TYPE).collect(Collectors.toSet());
}
Set<String> types = targets == null ? Collections.emptySet() : ImmutableSet.copyOf(targets);

SortInfo sortInfo = SortInfo.of(URLDecoder.decode(sort, StandardCharsets.UTF_8.name()));
if (SortInfo.DEFAULT.equals(sortInfo)) {
Expand Down
Expand Up @@ -19,6 +19,7 @@
import co.cask.cdap.AllProgramsApp;
import co.cask.cdap.api.dataset.lib.KeyValueTable;
import co.cask.cdap.api.dataset.lib.ObjectMappedTable;
import co.cask.cdap.api.metadata.MetadataEntity;
import co.cask.cdap.common.conf.CConfiguration;
import co.cask.cdap.common.conf.Constants;
import co.cask.cdap.common.id.Id;
Expand All @@ -31,7 +32,6 @@
import co.cask.cdap.internal.app.services.AppFabricServer;
import co.cask.cdap.proto.EntityScope;
import co.cask.cdap.proto.ProgramType;
import co.cask.cdap.proto.element.EntityTypeSimpleName;
import co.cask.cdap.proto.id.ApplicationId;
import co.cask.cdap.proto.id.NamespaceId;
import co.cask.cdap.proto.security.Action;
Expand All @@ -42,6 +42,7 @@
import co.cask.cdap.security.authorization.InMemoryAuthorizer;
import co.cask.cdap.security.spi.authentication.SecurityRequestContext;
import co.cask.cdap.security.spi.authorization.Authorizer;
import com.google.common.collect.ImmutableSet;
import com.google.inject.Injector;
import org.apache.twill.filesystem.LocalLocationFactory;
import org.apache.twill.filesystem.Location;
Expand All @@ -57,6 +58,7 @@
import java.io.IOException;
import java.util.Collections;
import java.util.EnumSet;
import java.util.Set;
import java.util.concurrent.TimeUnit;

/**
Expand Down Expand Up @@ -141,9 +143,9 @@ public void testSearch() throws Exception {

// query for all metadata entity type except schedule
// TODO: https://issues.cask.co/browse/CDAP-14705, add back schedule type when the JIRA is fixed.
EnumSet<EntityTypeSimpleName> types = EnumSet.of(EntityTypeSimpleName.NAMESPACE, EntityTypeSimpleName.ARTIFACT,
EntityTypeSimpleName.APP, EntityTypeSimpleName.PROGRAM,
EntityTypeSimpleName.DATASET);
Set<String> types = ImmutableSet.of(MetadataEntity.NAMESPACE, MetadataEntity.ARTIFACT,
MetadataEntity.APPLICATION, MetadataEntity.PROGRAM,
MetadataEntity.DATASET);
SearchRequest searchRequest =
new SearchRequest(NamespaceId.DEFAULT, "*", types, SortInfo.DEFAULT, 0,
Integer.MAX_VALUE, 0, null, false, EnumSet.allOf(EntityScope.class));
Expand Down
Expand Up @@ -716,15 +716,16 @@ public void testMetadata() throws Exception {
testCommandOutputContains(cli, String.format("search metadata %s filtered by target-type artifact",
FakeApp.class.getSimpleName()), FAKE_ARTIFACT_ID.toString());
testCommandOutputContains(cli, "search metadata appKey:appValue", FAKE_APP_ID.toString());
testCommandOutputContains(cli, "search metadata fake* filtered by target-type app", FAKE_APP_ID.toString());
testCommandOutputContains(cli, "search metadata fake* filtered by target-type application", FAKE_APP_ID.toString());
output = getCommandOutput(cli, "search metadata fake* filtered by target-type program");
lines = Arrays.asList(output.split("\\r?\\n"));
List<String> expected = ImmutableList.of("Entity", FAKE_WORKFLOW_ID.toString(), FAKE_SPARK_ID.toString());
Assert.assertTrue(lines.containsAll(expected) && expected.containsAll(lines));
testCommandOutputContains(cli, "search metadata fake* filtered by target-type dataset", FAKE_DS_ID.toString());
testCommandOutputContains(cli, String.format("search metadata %s", FakeApp.TIME_SCHEDULE_NAME),
FAKE_APP_ID.toString());
testCommandOutputContains(cli, String.format("search metadata %s filtered by target-type app", PingService.NAME),
testCommandOutputContains(cli, String.format("search metadata %s filtered by target-type application",
PingService.NAME),
FAKE_APP_ID.toString());
testCommandOutputContains(cli, String.format("search metadata %s filtered by target-type program",
PrefixedEchoHandler.NAME), PREFIXED_ECHO_HANDLER_ID.toString());
Expand All @@ -736,7 +737,7 @@ public void testMetadata() throws Exception {
lines = Arrays.asList(output.split("\\r?\\n"));
expected = ImmutableList.of("Entity", FAKE_SPARK_ID.toString(), FAKE_WORKFLOW_ID.toString());
Assert.assertTrue(lines.containsAll(expected) && expected.containsAll(lines));
output = getCommandOutput(cli, "search metadata fake* filtered by target-type dataset,app");
output = getCommandOutput(cli, "search metadata fake* filtered by target-type dataset,application");
lines = Arrays.asList(output.split("\\r?\\n"));
expected = ImmutableList.of("Entity", FAKE_DS_ID.toString(), FAKE_APP_ID.toString());
Assert.assertTrue(lines.containsAll(expected) && expected.containsAll(lines));
Expand Down
Expand Up @@ -29,7 +29,6 @@
import co.cask.cdap.cli.completer.element.ProgramIdCompleter;
import co.cask.cdap.client.ApplicationClient;
import co.cask.cdap.proto.ProgramRunStatus;
import co.cask.cdap.proto.element.EntityTypeSimpleName;
import co.cask.cdap.proto.security.Principal;
import com.google.common.base.Supplier;
import com.google.common.collect.ImmutableMap;
Expand Down Expand Up @@ -68,7 +67,6 @@ public DefaultCompleters(Injector injector) {
.put(ArgumentName.COMMAND_CATEGORY.getName(), new EnumCompleter(CommandCategory.class))
.put(ArgumentName.TABLE_RENDERER.getName(), new EnumCompleter(RenderAsCommand.Type.class))
.put(ArgumentName.WORKFLOW_TOKEN_SCOPE.getName(), new EnumCompleter(WorkflowToken.Scope.class))
.put(ArgumentName.TARGET_TYPE.getName(), new EnumCompleter(EntityTypeSimpleName.class))
.put(ArgumentName.METADATA_SCOPE.getName(), new EnumCompleter(MetadataScope.class))
.put(ArgumentName.PRINCIPAL_TYPE.getName(), new EnumCompleter(Principal.PrincipalType.class))
.putAll(generateProgramIdCompleters(injector)).build();
Expand Down
Expand Up @@ -21,14 +21,11 @@
import co.cask.cdap.cli.util.AbstractCommand;
import co.cask.cdap.cli.util.table.Table;
import co.cask.cdap.client.MetadataClient;
import co.cask.cdap.proto.element.EntityTypeSimpleName;
import co.cask.cdap.proto.metadata.MetadataSearchResponse;
import co.cask.cdap.proto.metadata.MetadataSearchResultRecord;
import co.cask.common.cli.Arguments;
import com.google.common.base.Function;
import com.google.common.base.Splitter;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.google.inject.Inject;

Expand All @@ -40,14 +37,6 @@
*/
public class SearchMetadataCommand extends AbstractCommand {

private static final Function<String, EntityTypeSimpleName> STRING_TO_TARGET_TYPE =
new Function<String, EntityTypeSimpleName>() {
@Override
public EntityTypeSimpleName apply(String input) {
return EntityTypeSimpleName.valueOf(input.toUpperCase());
}
};

private final MetadataClient metadataClient;

@Inject
Expand Down Expand Up @@ -84,11 +73,10 @@ public String getDescription() {
"'artifact', 'app', 'dataset', 'program', 'stream', or 'view'.";
}

private Set<EntityTypeSimpleName> parseTargetType(String typeString) {
private Set<String> parseTargetType(String typeString) {
if (typeString == null) {
return ImmutableSet.of();
}

return ImmutableSet.copyOf(Iterables.transform(Splitter.on(',').split(typeString), STRING_TO_TARGET_TYPE));
return ImmutableSet.copyOf(Splitter.on(',').split(typeString));
}
}

0 comments on commit ec750e0

Please sign in to comment.