Search in sources :

Example 6 with SecondaryIdDescription

use of com.bakdata.conquery.models.datasets.SecondaryIdDescription in project conquery by bakdata.

the class AdminDatasetProcessor method deleteSecondaryId.

/**
 * Delete SecondaryId if it does not have any dependents.
 */
public synchronized void deleteSecondaryId(@NonNull SecondaryIdDescription secondaryId) {
    final Namespace namespace = datasetRegistry.get(secondaryId.getDataset().getId());
    // Before we commit this deletion, we check if this SecondaryId still has dependent Columns.
    final List<Column> dependents = namespace.getStorage().getTables().stream().map(Table::getColumns).flatMap(Arrays::stream).filter(column -> secondaryId.equals(column.getSecondaryId())).collect(Collectors.toList());
    if (!dependents.isEmpty()) {
        final Set<TableId> tables = dependents.stream().map(Column::getTable).map(Identifiable::getId).collect(Collectors.toSet());
        log.error("SecondaryId[{}] still present on {}", secondaryId, tables);
        throw new ForbiddenException(String.format("SecondaryId still has dependencies. %s", tables));
    }
    log.info("Deleting SecondaryId[{}]", secondaryId);
    namespace.getStorage().removeSecondaryId(secondaryId.getId());
    namespace.sendToAll(new RemoveSecondaryId(secondaryId));
}
Also used : Arrays(java.util.Arrays) ConqueryConfig(com.bakdata.conquery.models.config.ConqueryConfig) SneakyThrows(lombok.SneakyThrows) RequiredArgsConstructor(lombok.RequiredArgsConstructor) EntityIdMap(com.bakdata.conquery.models.identifiable.mapping.EntityIdMap) Import(com.bakdata.conquery.models.datasets.Import) DictionaryId(com.bakdata.conquery.models.identifiable.ids.specific.DictionaryId) ConceptId(com.bakdata.conquery.models.identifiable.ids.specific.ConceptId) DatasetId(com.bakdata.conquery.models.identifiable.ids.specific.DatasetId) InternalOnly(com.bakdata.conquery.io.jackson.InternalOnly) RemoveImportJob(com.bakdata.conquery.models.messages.namespaces.specific.RemoveImportJob) NonNull(lombok.NonNull) Table(com.bakdata.conquery.models.datasets.Table) Concept(com.bakdata.conquery.models.datasets.concepts.Concept) RemoveConcept(com.bakdata.conquery.models.messages.namespaces.specific.RemoveConcept) Set(java.util.Set) Validator(javax.validation.Validator) Collectors(java.util.stream.Collectors) NotFoundException(javax.ws.rs.NotFoundException) RemoveSecondaryId(com.bakdata.conquery.models.messages.namespaces.specific.RemoveSecondaryId) Dataset(com.bakdata.conquery.models.datasets.Dataset) Objects(java.util.Objects) SecondaryIdDescription(com.bakdata.conquery.models.datasets.SecondaryIdDescription) JobManager(com.bakdata.conquery.models.jobs.JobManager) List(java.util.List) Slf4j(lombok.extern.slf4j.Slf4j) Response(javax.ws.rs.core.Response) WebApplicationException(javax.ws.rs.WebApplicationException) Jackson(com.bakdata.conquery.io.jackson.Jackson) MetaStorage(com.bakdata.conquery.io.storage.MetaStorage) Column(com.bakdata.conquery.models.datasets.Column) Namespace(com.bakdata.conquery.models.worker.Namespace) RemoveTable(com.bakdata.conquery.models.messages.namespaces.specific.RemoveTable) Getter(lombok.Getter) AddWorker(com.bakdata.conquery.models.messages.network.specific.AddWorker) UpdateTable(com.bakdata.conquery.models.messages.namespaces.specific.UpdateTable) Connector(com.bakdata.conquery.models.datasets.concepts.Connector) UpdateSecondaryId(com.bakdata.conquery.models.messages.namespaces.specific.UpdateSecondaryId) NamespaceStorage(com.bakdata.conquery.io.storage.NamespaceStorage) IdMutex(com.bakdata.conquery.models.identifiable.IdMutex) TableId(com.bakdata.conquery.models.identifiable.ids.specific.TableId) CsvParser(com.univocity.parsers.csv.CsvParser) UpdateMatchingStatsMessage(com.bakdata.conquery.models.messages.namespaces.specific.UpdateMatchingStatsMessage) Identifiable(com.bakdata.conquery.models.identifiable.Identifiable) SimpleJob(com.bakdata.conquery.models.jobs.SimpleJob) ForbiddenException(javax.ws.rs.ForbiddenException) ImportJob(com.bakdata.conquery.models.jobs.ImportJob) IOException(java.io.IOException) ValidatorHelper(com.bakdata.conquery.models.exceptions.ValidatorHelper) UpdateConcept(com.bakdata.conquery.models.messages.namespaces.specific.UpdateConcept) ShardNodeInformation(com.bakdata.conquery.models.worker.ShardNodeInformation) StructureNode(com.bakdata.conquery.models.datasets.concepts.StructureNode) FilterSearch(com.bakdata.conquery.apiv1.FilterSearch) DatasetRegistry(com.bakdata.conquery.models.worker.DatasetRegistry) Collections(java.util.Collections) InputStream(java.io.InputStream) TableId(com.bakdata.conquery.models.identifiable.ids.specific.TableId) ForbiddenException(javax.ws.rs.ForbiddenException) RemoveSecondaryId(com.bakdata.conquery.models.messages.namespaces.specific.RemoveSecondaryId) Column(com.bakdata.conquery.models.datasets.Column) Arrays(java.util.Arrays) Namespace(com.bakdata.conquery.models.worker.Namespace)

Example 7 with SecondaryIdDescription

use of com.bakdata.conquery.models.datasets.SecondaryIdDescription in project conquery by bakdata.

the class SecondaryIdEndpointTest method execute.

@Override
public void execute(StandaloneSupport conquery) throws Exception {
    final SecondaryIdDescription description = new SecondaryIdDescription();
    description.setDescription("description-DESCRIPTION");
    description.setName("description-NAME");
    description.setLabel("description-LABEL");
    final SecondaryIdDescriptionId id = new SecondaryIdDescriptionId(conquery.getDataset().getId(), description.getName());
    final Response post = uploadDescription(conquery, description);
    log.info("{}", post);
    assertThat(post).describedAs("Response = `%s`", post).returns(Response.Status.Family.SUCCESSFUL, response -> response.getStatusInfo().getFamily());
    {
        final Set<FESecondaryId> secondaryIds = fetchSecondaryIdDescriptions(conquery);
        log.info("{}", secondaryIds);
        description.setDataset(conquery.getDataset());
        assertThat(secondaryIds).extracting(FESecondaryId::getId).containsExactly(description.getId().toString());
        // Upload Table referencing SecondaryId
        {
            // Build data manually so content is minmal (ie no dataset prefixes etc)
            ObjectNode tableNode = Jackson.MAPPER.createObjectNode();
            tableNode.put("name", "table");
            ObjectNode columnNode = Jackson.MAPPER.createObjectNode();
            columnNode.put("name", "column");
            columnNode.put("type", MajorTypeId.INTEGER.name());
            columnNode.put("secondaryId", description.getId().toStringWithoutDataset());
            tableNode.put("columns", columnNode);
            final Response response = uploadTable(conquery, tableNode);
            assertThat(response.getStatusInfo().getFamily()).isEqualTo(Response.Status.Family.SUCCESSFUL);
        }
    }
    {
        final URI uri = HierarchyHelper.hierarchicalPath(conquery.defaultAdminURIBuilder(), DatasetsUIResource.class, "getDataset").buildFromMap(Map.of("dataset", conquery.getDataset().getName()));
        final Response actual = conquery.getClient().target(uri).request().get();
        assertThat(actual).returns(Response.Status.Family.SUCCESSFUL, response -> response.getStatusInfo().getFamily());
    }
    {
        // First one fails because table depends on it
        assertThat(deleteDescription(conquery, id)).returns(Response.Status.Family.CLIENT_ERROR, response -> response.getStatusInfo().getFamily());
        deleteTable(conquery, new TableId(conquery.getDataset().getId(), "table"));
        // We've deleted the table, now it should be successful
        assertThat(deleteDescription(conquery, id)).returns(Response.Status.Family.SUCCESSFUL, response -> response.getStatusInfo().getFamily());
        final Set<FESecondaryId> secondaryIds = fetchSecondaryIdDescriptions(conquery);
        log.info("{}", secondaryIds);
        assertThat(secondaryIds).isEmpty();
    }
}
Also used : Response(javax.ws.rs.core.Response) SecondaryIdDescriptionId(com.bakdata.conquery.models.identifiable.ids.specific.SecondaryIdDescriptionId) Assertions.assertThat(org.assertj.core.api.Assertions.assertThat) AdminTablesResource(com.bakdata.conquery.resources.admin.rest.AdminTablesResource) AdminDatasetResource(com.bakdata.conquery.resources.admin.rest.AdminDatasetResource) ObjectNode(com.fasterxml.jackson.databind.node.ObjectNode) MediaType(javax.ws.rs.core.MediaType) Map(java.util.Map) TableId(com.bakdata.conquery.models.identifiable.ids.specific.TableId) URI(java.net.URI) TypeReference(com.fasterxml.jackson.core.type.TypeReference) MajorTypeId(com.bakdata.conquery.models.events.MajorTypeId) IntegrationTest(com.bakdata.conquery.integration.IntegrationTest) ResourceConstants(com.bakdata.conquery.resources.ResourceConstants) ObjectMapper(com.fasterxml.jackson.databind.ObjectMapper) Set(java.util.Set) DatasetsUIResource(com.bakdata.conquery.resources.admin.ui.DatasetsUIResource) FESecondaryId(com.bakdata.conquery.apiv1.frontend.FESecondaryId) Entity(javax.ws.rs.client.Entity) DatasetResource(com.bakdata.conquery.resources.api.DatasetResource) StandaloneSupport(com.bakdata.conquery.util.support.StandaloneSupport) SecondaryIdDescription(com.bakdata.conquery.models.datasets.SecondaryIdDescription) Slf4j(lombok.extern.slf4j.Slf4j) Response(javax.ws.rs.core.Response) Jackson(com.bakdata.conquery.io.jackson.Jackson) HierarchyHelper(com.bakdata.conquery.resources.hierarchies.HierarchyHelper) TableId(com.bakdata.conquery.models.identifiable.ids.specific.TableId) SecondaryIdDescriptionId(com.bakdata.conquery.models.identifiable.ids.specific.SecondaryIdDescriptionId) Set(java.util.Set) ObjectNode(com.fasterxml.jackson.databind.node.ObjectNode) FESecondaryId(com.bakdata.conquery.apiv1.frontend.FESecondaryId) URI(java.net.URI) SecondaryIdDescription(com.bakdata.conquery.models.datasets.SecondaryIdDescription)

Example 8 with SecondaryIdDescription

use of com.bakdata.conquery.models.datasets.SecondaryIdDescription in project conquery by bakdata.

the class QueryProcessor method tryReuse.

/**
 * Determine if the submitted query does reuse ONLY another query and restart that instead of creating another one.
 */
private ManagedExecution<?> tryReuse(QueryDescription query, ManagedExecutionId executionId, DatasetRegistry datasetRegistry, ConqueryConfig config, ExecutionManager executionManager, User user) {
    ManagedExecution<?> execution = datasetRegistry.getMetaRegistry().resolve(executionId);
    if (execution == null) {
        return null;
    }
    // Direct reuse only works if the queries are of the same type (As reuse reconstructs the Query for different types)
    if (!query.getClass().equals(execution.getSubmitted().getClass())) {
        return null;
    }
    // If SecondaryIds differ from selected and prior, we cannot reuse them.
    if (query instanceof SecondaryIdQuery) {
        final SecondaryIdDescription selectedSecondaryId = ((SecondaryIdQuery) query).getSecondaryId();
        final SecondaryIdDescription reusedSecondaryId = ((SecondaryIdQuery) execution.getSubmitted()).getSecondaryId();
        if (!selectedSecondaryId.equals(reusedSecondaryId)) {
            return null;
        }
    }
    // If the user is not the owner of the execution, we definitely create a new Execution, so the owner can cancel it
    if (!user.isOwner(execution)) {
        final ManagedExecution<?> newExecution = executionManager.createExecution(datasetRegistry, execution.getSubmitted(), user, execution.getDataset());
        newExecution.setLabel(execution.getLabel());
        newExecution.setTags(execution.getTags().clone());
        storage.updateExecution(newExecution);
        execution = newExecution;
    }
    ExecutionState state = execution.getState();
    if (state.equals(ExecutionState.RUNNING)) {
        log.trace("The Execution[{}] was already started and its state is: {}", execution.getId(), state);
        return execution;
    }
    log.trace("Re-executing Query {}", execution);
    executionManager.execute(datasetRegistry, execution, config);
    return execution;
}
Also used : ExecutionState(com.bakdata.conquery.models.execution.ExecutionState) SecondaryIdQuery(com.bakdata.conquery.apiv1.query.SecondaryIdQuery) SecondaryIdDescription(com.bakdata.conquery.models.datasets.SecondaryIdDescription)

Example 9 with SecondaryIdDescription

use of com.bakdata.conquery.models.datasets.SecondaryIdDescription in project conquery by bakdata.

the class LoadingUtil method importSecondaryIds.

public static Map<String, SecondaryIdDescription> importSecondaryIds(StandaloneSupport support, List<RequiredSecondaryId> secondaryIds) {
    Map<String, SecondaryIdDescription> out = new HashMap<>();
    for (RequiredSecondaryId required : secondaryIds) {
        final SecondaryIdDescription description = required.toSecondaryId();
        support.getDatasetsProcessor().addSecondaryId(support.getNamespace(), description);
        out.put(description.getName(), description);
    }
    return out;
}
Also used : HashMap(java.util.HashMap) SecondaryIdDescription(com.bakdata.conquery.models.datasets.SecondaryIdDescription)

Aggregations

SecondaryIdDescription (com.bakdata.conquery.models.datasets.SecondaryIdDescription)9 Column (com.bakdata.conquery.models.datasets.Column)4 SecondaryIdQuery (com.bakdata.conquery.apiv1.query.SecondaryIdQuery)2 Jackson (com.bakdata.conquery.io.jackson.Jackson)2 Connector (com.bakdata.conquery.models.datasets.concepts.Connector)2 SecondaryIdDescriptionId (com.bakdata.conquery.models.identifiable.ids.specific.SecondaryIdDescriptionId)2 TableId (com.bakdata.conquery.models.identifiable.ids.specific.TableId)2 HashMap (java.util.HashMap)2 Set (java.util.Set)2 AtomicInteger (java.util.concurrent.atomic.AtomicInteger)2 Response (javax.ws.rs.core.Response)2 Slf4j (lombok.extern.slf4j.Slf4j)2 FilterSearch (com.bakdata.conquery.apiv1.FilterSearch)1 FESecondaryId (com.bakdata.conquery.apiv1.frontend.FESecondaryId)1 CQUnfilteredTable (com.bakdata.conquery.apiv1.query.concept.filter.CQUnfilteredTable)1 IntegrationTest (com.bakdata.conquery.integration.IntegrationTest)1 InternalOnly (com.bakdata.conquery.io.jackson.InternalOnly)1 MetaStorage (com.bakdata.conquery.io.storage.MetaStorage)1 NamespaceStorage (com.bakdata.conquery.io.storage.NamespaceStorage)1 ConqueryConfig (com.bakdata.conquery.models.config.ConqueryConfig)1