use of com.bakdata.conquery.models.datasets.Table in project conquery by bakdata.
the class AdminDatasetProcessor method deleteTable.
/**
* Deletes a table if it has no dependents or not forced to do so.
*/
public synchronized List<ConceptId> deleteTable(Table table, boolean force) {
final Namespace namespace = datasetRegistry.get(table.getDataset().getId());
final List<Concept<?>> dependentConcepts = namespace.getStorage().getAllConcepts().stream().flatMap(c -> c.getConnectors().stream()).filter(con -> con.getTable().equals(table)).map(Connector::getConcept).collect(Collectors.toList());
if (force || dependentConcepts.isEmpty()) {
for (Concept<?> concept : dependentConcepts) {
deleteConcept(concept);
}
namespace.getStorage().getAllImports().stream().filter(imp -> imp.getTable().equals(table)).forEach(this::deleteImport);
namespace.getStorage().removeTable(table.getId());
namespace.sendToAll(new RemoveTable(table));
}
return dependentConcepts.stream().map(Concept::getId).collect(Collectors.toList());
}
use of com.bakdata.conquery.models.datasets.Table 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));
}
use of com.bakdata.conquery.models.datasets.Table in project conquery by bakdata.
the class AdminDatasetProcessor method deleteDataset.
/**
* Delete dataset if it is empty.
*/
public synchronized void deleteDataset(Dataset dataset) {
final Namespace namespace = datasetRegistry.get(dataset.getId());
if (!namespace.getStorage().getTables().isEmpty()) {
throw new WebApplicationException(String.format("Cannot delete dataset `%s`, because it still has tables: `%s`", dataset.getId(), namespace.getStorage().getTables().stream().map(Table::getId).map(Objects::toString).collect(Collectors.joining(","))), Response.Status.CONFLICT);
}
datasetRegistry.removeNamespace(dataset.getId());
}
use of com.bakdata.conquery.models.datasets.Table in project conquery by bakdata.
the class NamespacedStorage method decorateConceptStore.
private void decorateConceptStore(IdentifiableStore<Concept<?>> store) {
store.onAdd(concept -> {
if (concept.getDataset() != null && !concept.getDataset().equals(dataset.get())) {
throw new IllegalStateException("Concept is not for this dataset.");
}
concept.setDataset(dataset.get());
concept.initElements();
concept.getSelects().forEach(centralRegistry::register);
for (Connector connector : concept.getConnectors()) {
centralRegistry.register(connector);
connector.collectAllFilters().forEach(centralRegistry::register);
connector.getSelects().forEach(centralRegistry::register);
connector.getValidityDates().forEach(centralRegistry::register);
}
// add imports of table
if (isRegisterImports()) {
for (Import imp : getAllImports()) {
for (Connector con : concept.getConnectors()) {
if (con.getTable().equals(imp.getTable())) {
con.addImport(imp);
}
}
}
}
if (concept instanceof TreeConcept) {
((TreeConcept) concept).getAllChildren().values().forEach(centralRegistry::register);
}
}).onRemove(concept -> {
concept.getSelects().forEach(centralRegistry::remove);
// see #146 remove from Dataset.concepts
for (Connector connector : concept.getConnectors()) {
connector.getSelects().forEach(centralRegistry::remove);
connector.collectAllFilters().forEach(centralRegistry::remove);
connector.getValidityDates().forEach(centralRegistry::remove);
centralRegistry.remove(connector);
}
if (concept instanceof TreeConcept) {
((TreeConcept) concept).getAllChildren().values().forEach(centralRegistry::remove);
}
});
}
use of com.bakdata.conquery.models.datasets.Table in project conquery by bakdata.
the class SerializationTests method bucketCompoundDateRange.
@Test
public void bucketCompoundDateRange() throws JSONException, IOException {
Dataset dataset = new Dataset();
dataset.setName("datasetName");
Table table = new Table();
Column startCol = new Column();
startCol.setName("startCol");
startCol.setType(MajorTypeId.DATE);
startCol.setTable(table);
Column endCol = new Column();
endCol.setLabel("endLabel");
endCol.setName("endCol");
endCol.setType(MajorTypeId.DATE);
endCol.setTable(table);
Column compoundCol = new Column();
compoundCol.setName("compoundCol");
compoundCol.setType(MajorTypeId.DATE_RANGE);
compoundCol.setTable(table);
table.setColumns(new Column[] { startCol, endCol, compoundCol });
table.setDataset(dataset);
table.setName("tableName");
Import imp = new Import(table);
imp.setName("importTest");
DateRangeTypeCompound compoundStore = new DateRangeTypeCompound(startCol.getName(), endCol.getName(), new BitSetStore(BitSet.valueOf(new byte[] { 0b1000 }), new BitSet(), 4));
// 0b1000 is a binary representation of 8 so that the 4th is set to make sure that BitSet length is 4.
ColumnStore startStore = new IntegerDateStore(new ShortArrayStore(new short[] { 1, 2, 3, 4 }, Short.MIN_VALUE));
ColumnStore endStore = new IntegerDateStore(new ShortArrayStore(new short[] { 5, 6, 7, 8 }, Short.MIN_VALUE));
Bucket bucket = new Bucket(0, 1, 4, new ColumnStore[] { startStore, endStore, compoundStore }, Collections.emptySet(), new int[0], new int[0], imp);
compoundStore.setParent(bucket);
CentralRegistry registry = new CentralRegistry();
registry.register(dataset);
registry.register(startCol);
registry.register(endCol);
registry.register(compoundCol);
registry.register(table);
registry.register(imp);
registry.register(bucket);
final Validator validator = Validators.newValidator();
SerializationTestUtil.forType(Bucket.class).registry(registry).injectables(new Injectable() {
@Override
public MutableInjectableValues inject(MutableInjectableValues values) {
return values.add(Validator.class, validator);
}
}).test(bucket);
}
Aggregations