@Override public MetadataEntity toMetadataEntity() { return MetadataEntity.ofDataset(namespace, dataset); }
@Override public MetadataEntity toMetadataEntity() { return MetadataEntity.ofDataset(namespace, dataset); }
MetadataEntity.ofDataset(endPoint.getNamespace(), endPoint.getName()));
MetadataEntity.ofDataset(endPoint.getNamespace(), endPoint.getName()));
@PUT @Path("metadata/{dataset}/properties") public void addProperties(HttpServiceRequest request, HttpServiceResponder responder, @PathParam("dataset") String dataset) { String body = StandardCharsets.UTF_8.decode(request.getContent()).toString(); Map<String, String> properties = GSON.fromJson(body, MAP_STRING_STRING_TYPE); getContext().addProperties(MetadataEntity.ofDataset(getContext().getNamespace(), dataset), properties); // wait till change is recorded to store try { Tasks.waitFor(true, () -> { Map<MetadataScope, Metadata> metadata2 = getContext().getMetadata(MetadataEntity.ofDataset(getContext().getNamespace(), dataset)); return metadata2.get(MetadataScope.USER).getProperties().keySet().containsAll(properties.keySet()); }, 10, TimeUnit.SECONDS, 100, TimeUnit.MILLISECONDS); } catch (Exception e) { responder.sendStatus(HttpResponseStatus.INTERNAL_SERVER_ERROR.code()); } responder.sendStatus(HttpResponseStatus.OK.code()); }
@DELETE @Path("metadata/{dataset}/properties/{key}") public void removeProperty(HttpServiceRequest request, HttpServiceResponder responder, @PathParam("dataset") String dataset, @PathParam("key") String key) { getContext().removeProperties(MetadataEntity.ofDataset(getContext().getNamespace(), dataset), key); // wait till change is recorded to store try { Tasks.waitFor(true, () -> { Map<MetadataScope, Metadata> metadata2 = getContext().getMetadata(MetadataEntity.ofDataset(getContext().getNamespace(), dataset)); return !metadata2.get(MetadataScope.USER).getProperties().containsKey(key); }, 10, TimeUnit.SECONDS, 100, TimeUnit.MILLISECONDS); } catch (Exception e) { responder.sendStatus(HttpResponseStatus.INTERNAL_SERVER_ERROR.code()); } responder.sendStatus(HttpResponseStatus.OK.code()); }
@DELETE @Path("metadata/{dataset}/properties") public void removeAllProperties(HttpServiceRequest request, HttpServiceResponder responder, @PathParam("dataset") String dataset) { getContext().removeProperties(MetadataEntity.ofDataset(getContext().getNamespace(), dataset)); // wait till change is recorded to store try { Tasks.waitFor(true, () -> { Map<MetadataScope, Metadata> metadata2 = getContext().getMetadata(MetadataEntity.ofDataset(getContext().getNamespace(), dataset)); return metadata2.get(MetadataScope.USER).getProperties().isEmpty(); }, 10, TimeUnit.SECONDS, 100, TimeUnit.MILLISECONDS); } catch (Exception e) { responder.sendStatus(HttpResponseStatus.INTERNAL_SERVER_ERROR.code()); } responder.sendStatus(HttpResponseStatus.OK.code()); }
/************************************************* PUT ***********************************************************/ @PUT @Path("metadata/{dataset}/tags") public void addTag(HttpServiceRequest request, HttpServiceResponder responder, @PathParam("dataset") String dataset) { String tag = StandardCharsets.UTF_8.decode(request.getContent()).toString(); getContext().addTags(MetadataEntity.ofDataset(getContext().getNamespace(), dataset), tag); // wait till change is recorded to store try { Tasks.waitFor(true, () -> { Map<MetadataScope, Metadata> metadata2 = getContext().getMetadata(MetadataEntity.ofDataset(getContext().getNamespace(), dataset)); return metadata2.get(MetadataScope.USER).getTags().contains(tag); }, 10, TimeUnit.SECONDS, 100, TimeUnit.MILLISECONDS); } catch (Exception e) { responder.sendStatus(HttpResponseStatus.INTERNAL_SERVER_ERROR.code()); } responder.sendStatus(HttpResponseStatus.OK.code()); }
/************************************************ DELETE *********************************************************/ @DELETE @Path("metadata/{dataset}/tags/{tag}") public void removeTag(HttpServiceRequest request, HttpServiceResponder responder, @PathParam("dataset") String dataset, @PathParam("tag") String tag) { getContext().removeTags(MetadataEntity.ofDataset(getContext().getNamespace(), dataset), tag); // wait till change is recorded to store try { Tasks.waitFor(true, () -> { Map<MetadataScope, Metadata> metadata2 = getContext().getMetadata(MetadataEntity.ofDataset(getContext().getNamespace(), dataset)); return !metadata2.get(MetadataScope.USER).getTags().contains(tag); }, 10, TimeUnit.SECONDS, 100, TimeUnit.MILLISECONDS); } catch (Exception e) { responder.sendStatus(HttpResponseStatus.INTERNAL_SERVER_ERROR.code()); } responder.sendStatus(HttpResponseStatus.OK.code()); }
MetadataEntity metadataEntity = MetadataEntity.ofDataset(context.getNamespace(), config.tableName); Map<MetadataScope, Metadata> currentMetadata = context.getMetadata(metadataEntity); Set<MetadataOperation> operations = GSON.fromJson(config.metadataOperations, SET_METADATA_OPERATION_TYPE);
@DELETE @Path("metadata/{dataset}/tags") public void removeAllTags(HttpServiceRequest request, HttpServiceResponder responder, @PathParam("dataset") String dataset) { getContext().removeTags(MetadataEntity.ofDataset(getContext().getNamespace(), dataset)); // wait till change is recorded to store try { Tasks.waitFor(true, () -> { Map<MetadataScope, Metadata> metadata2 = getContext().getMetadata(MetadataEntity.ofDataset(getContext().getNamespace(), dataset)); return metadata2.get(MetadataScope.USER).getTags().isEmpty(); }, 10, TimeUnit.SECONDS, 100, TimeUnit.MILLISECONDS); } catch (Exception e) { responder.sendStatus(HttpResponseStatus.INTERNAL_SERVER_ERROR.code()); } responder.sendStatus(HttpResponseStatus.OK.code()); }
@DELETE @Path("metadata/{dataset}") public void removeMetadata(HttpServiceRequest request, HttpServiceResponder responder, @PathParam("dataset") String dataset) { getContext().removeMetadata(MetadataEntity.ofDataset(getContext().getNamespace(), dataset)); // wait till change is recorded to store try { Tasks.waitFor(true, () -> { Map<MetadataScope, Metadata> metadata2 = getContext().getMetadata(MetadataEntity.ofDataset(getContext().getNamespace(), dataset)); return metadata2.get(MetadataScope.USER).getProperties().isEmpty() && metadata2.get(MetadataScope.USER) .getTags().isEmpty(); }, 10, TimeUnit.SECONDS, 100, TimeUnit.MILLISECONDS); } catch (Exception e) { responder.sendStatus(HttpResponseStatus.INTERNAL_SERVER_ERROR.code()); } responder.sendStatus(HttpResponseStatus.OK.code()); } }
/************************************************ GET ************************************************************/ @GET @Path("metadata/{dataset}") public void getMetadata(HttpServiceRequest request, HttpServiceResponder responder, @PathParam("dataset") String dataset) { Map<MetadataScope, Metadata> metadata = null; try { metadata = getContext().getMetadata(MetadataEntity.ofDataset(getContext().getNamespace(), dataset)); } catch (Exception e) { if (e.getCause() instanceof UnauthorizedException) { responder.sendStatus(((UnauthorizedException) e.getCause()).getStatusCode()); } else if (e.getCause() instanceof UnauthenticatedException) { responder.sendStatus(((UnauthenticatedException) e.getCause()).getStatusCode()); } else if (e.getCause() instanceof BadRequestException) { responder.sendStatus(((BadRequestException) e.getCause()).getStatusCode()); } else { responder.sendStatus(HttpResponseStatus.INTERNAL_SERVER_ERROR.code()); } } responder.sendJson(HttpResponseStatus.OK.code(), metadata); }
@Test public void testSearchOnTypes() throws Exception { MetadataEntity myField1 = MetadataEntity.builder(MetadataEntity.ofDataset(NamespaceId.DEFAULT.getEntityName(), "myDs")) .appendAsType("field", "myField1").build(); MetadataEntity myField2 = MetadataEntity.builder(MetadataEntity.ofDataset(NamespaceId.DEFAULT.getEntityName(), "myDs")) .appendAsType("field", "myField2").build(); final MetadataEntry myFieldEntry1 = new MetadataEntry(myField1, "testKey1", "testValue1"); final MetadataEntry myFieldEntry2 = new MetadataEntry(myField2, "testKey2", "testValue2"); txnl.execute(() -> { dataset.addProperty(myField1, "testKey1", "testValue1"); dataset.addProperty(myField2, "testKey2", "testValue2"); }); // Search for it based on value txnl.execute(() -> { List<MetadataEntry> results = searchByDefaultIndex("default", "field:myField1", ImmutableSet.of(EntityTypeSimpleName.ALL)); Assert.assertEquals(ImmutableList.of(myFieldEntry1), results); // should return both fields results = searchByDefaultIndex("default", "field:myFie*", ImmutableSet.of(EntityTypeSimpleName.ALL)); Assert.assertEquals(ImmutableList.of(myFieldEntry1, myFieldEntry2), results); results = searchByDefaultIndex("default", "field*", ImmutableSet.of(EntityTypeSimpleName.ALL)); Assert.assertEquals(ImmutableList.of(myFieldEntry1, myFieldEntry2), results); }); }
@Test public void testToEntityId() { // should be able to get get an EntityId if Metadata belong to a cdap entity id DatasetId myDs = NamespaceId.DEFAULT.dataset("myDs"); MetadataDataset.Record metadata1 = new MetadataDataset.Record(myDs); Assert.assertEquals(myDs, metadata1.getEntityId()); MetadataEntity metadataEntity = MetadataEntity.builder(MetadataEntity.ofDataset(NamespaceId.DEFAULT.getEntityName(), "myDs")) .appendAsType("field", "myField").build(); MetadataDataset.Record metadata2 = new MetadataDataset.Record(metadataEntity); try { metadata2.getEntityId(); Assert.fail(); } catch (IllegalArgumentException e) { // expected } } }
@Test public void testMetadata() throws InterruptedException, TimeoutException, ExecutionException { ProgramRunId workflowRunId = workflow1.run(RunIds.generate()); MetadataEntity entity = MetadataEntity.ofDataset("myns", "myds");