Browse Source

VC: fix other entities removal

pull/10377/head
ViacheslavKlimov 3 years ago
parent
commit
a4384eb019
  1. 45
      application/src/main/java/org/thingsboard/server/service/sync/vc/DefaultEntitiesVersionControlService.java
  2. 3
      ui-ngx/src/app/modules/home/components/vc/complex-version-load.component.ts
  3. 1
      ui-ngx/src/app/shared/models/vc.models.ts

45
application/src/main/java/org/thingsboard/server/service/sync/vc/DefaultEntitiesVersionControlService.java

@ -39,6 +39,7 @@ import org.thingsboard.server.common.data.id.EntityIdFactory;
import org.thingsboard.server.common.data.id.HasId; import org.thingsboard.server.common.data.id.HasId;
import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.page.PageData; import org.thingsboard.server.common.data.page.PageData;
import org.thingsboard.server.common.data.page.PageDataIterable;
import org.thingsboard.server.common.data.page.PageLink; import org.thingsboard.server.common.data.page.PageLink;
import org.thingsboard.server.common.data.sync.ie.EntityExportData; import org.thingsboard.server.common.data.sync.ie.EntityExportData;
import org.thingsboard.server.common.data.sync.ie.EntityExportSettings; import org.thingsboard.server.common.data.sync.ie.EntityExportSettings;
@ -89,6 +90,7 @@ import java.util.Collections;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;
import java.util.Set;
import java.util.UUID; import java.util.UUID;
import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutionException;
import java.util.function.Function; import java.util.function.Function;
@ -331,7 +333,6 @@ public class DefaultEntitiesVersionControlService implements EntitiesVersionCont
sw.startNew("Entities " + entityType.name()); sw.startNew("Entities " + entityType.name());
ctx.setSettings(getEntityImportSettings(request, entityType)); ctx.setSettings(getEntityImportSettings(request, entityType));
importEntities(ctx, entityType); importEntities(ctx, entityType);
persistToCache(ctx);
} }
sw.startNew("Reimport"); sw.startNew("Reimport");
@ -343,7 +344,6 @@ public class DefaultEntitiesVersionControlService implements EntitiesVersionCont
.filter(entityType -> request.getEntityTypes().get(entityType).isRemoveOtherEntities()) .filter(entityType -> request.getEntityTypes().get(entityType).isRemoveOtherEntities())
.sorted(exportImportService.getEntityTypeComparatorForImport().reversed()) .sorted(exportImportService.getEntityTypeComparatorForImport().reversed())
.forEach(entityType -> removeOtherEntities(ctx, entityType)); .forEach(entityType -> removeOtherEntities(ctx, entityType));
persistToCache(ctx);
sw.startNew("References and Relations"); sw.startNew("References and Relations");
exportImportService.saveReferencesAndRelations(ctx); exportImportService.saveReferencesAndRelations(ctx);
@ -396,6 +396,8 @@ public class DefaultEntitiesVersionControlService implements EntitiesVersionCont
ctx.getImportedEntities().computeIfAbsent(entityType, t -> new HashSet<>()) ctx.getImportedEntities().computeIfAbsent(entityType, t -> new HashSet<>())
.add(importResult.getSavedEntity().getId()); .add(importResult.getSavedEntity().getId());
} }
persistToCache(ctx);
log.debug("Imported {} pack ({}) for tenant {}", entityType, entityDataList.size(), ctx.getTenantId()); log.debug("Imported {} pack ({}) for tenant {}", entityType, entityDataList.size(), ctx.getTenantId());
offset += limit; offset += limit;
} while (entityDataList.size() == limit); } while (entityDataList.size() == limit);
@ -420,19 +422,34 @@ public class DefaultEntitiesVersionControlService implements EntitiesVersionCont
} }
private void removeOtherEntities(EntitiesImportCtx ctx, EntityType entityType) { private void removeOtherEntities(EntitiesImportCtx ctx, EntityType entityType) {
DaoUtil.processInBatches(pageLink -> { var entities = new PageDataIterable<>(link -> exportableEntitiesService.findEntitiesIdsByTenantId(ctx.getTenantId(), entityType, link), 100);
return exportableEntitiesService.findEntitiesByTenantId(ctx.getTenantId(), entityType, pageLink); Set<EntityId> toRemove = new HashSet<>();
}, 100, entity -> { for (EntityId entityId : entities) {
if (ctx.getImportedEntities().get(entityType) == null || !ctx.getImportedEntities().get(entityType).contains(entity.getId())) { if (ctx.getImportedEntities().get(entityType) == null || !ctx.getImportedEntities().get(entityType).contains(entityId)) {
exportableEntitiesService.removeById(ctx.getTenantId(), entity.getId()); toRemove.add(entityId);
ctx.addEventCallback(() -> {
entityNotificationService.logEntityAction(ctx.getTenantId(), entity.getId(), entity, null,
ActionType.DELETED, ctx.getUser());
});
ctx.registerDeleted(entityType);
} }
}); }
for (EntityId entityId : toRemove) {
ExportableEntity<EntityId> entity = exportableEntitiesService.findEntityById(entityId);
exportableEntitiesService.removeById(ctx.getTenantId(), entityId);
ThrowingRunnable callback = () -> {
entityNotificationService.logEntityAction(ctx.getTenantId(), entity.getId(), entity, null,
ActionType.DELETED, ctx.getUser());
};
if (ctx.isRollbackOnError()) {
ctx.addEventCallback(callback);
} else {
try {
callback.run();
} catch (ThingsboardException e) {
throw new RuntimeException(e);
}
}
ctx.registerDeleted(entityType);
}
persistToCache(ctx);
} }
private VersionLoadResult onError(EntityId externalId, Throwable e) { private VersionLoadResult onError(EntityId externalId, Throwable e) {

3
ui-ngx/src/app/modules/home/components/vc/complex-version-load.component.ts

@ -79,7 +79,7 @@ export class ComplexVersionLoadComponent extends PageComponent implements OnInit
ngOnInit(): void { ngOnInit(): void {
this.loadVersionFormGroup = this.fb.group({ this.loadVersionFormGroup = this.fb.group({
entityTypes: [createDefaultEntityTypesVersionLoad(), []], entityTypes: [createDefaultEntityTypesVersionLoad(), []],
rollbackOnError: [false] rollbackOnError: [true]
}); });
} }
@ -117,6 +117,7 @@ export class ComplexVersionLoadComponent extends PageComponent implements OnInit
const request: EntityTypeVersionLoadRequest = { const request: EntityTypeVersionLoadRequest = {
versionId: this.versionId, versionId: this.versionId,
entityTypes: this.loadVersionFormGroup.get('entityTypes').value, entityTypes: this.loadVersionFormGroup.get('entityTypes').value,
rollbackOnError: this.loadVersionFormGroup.get('rollbackOnError').value,
type: VersionLoadRequestType.ENTITY_TYPE type: VersionLoadRequestType.ENTITY_TYPE
}; };
this.versionLoadResult$ = this.entitiesVersionControlService.loadEntitiesVersion(request, {ignoreErrors: true}).pipe( this.versionLoadResult$ = this.entitiesVersionControlService.loadEntitiesVersion(request, {ignoreErrors: true}).pipe(

1
ui-ngx/src/app/shared/models/vc.models.ts

@ -144,6 +144,7 @@ export interface EntityTypeVersionLoadConfig extends VersionLoadConfig {
export interface EntityTypeVersionLoadRequest extends VersionLoadRequest { export interface EntityTypeVersionLoadRequest extends VersionLoadRequest {
entityTypes: {[entityType: string]: EntityTypeVersionLoadConfig}; entityTypes: {[entityType: string]: EntityTypeVersionLoadConfig};
type: VersionLoadRequestType.ENTITY_TYPE; type: VersionLoadRequestType.ENTITY_TYPE;
rollbackOnError: boolean;
} }
export function createDefaultEntityTypesVersionLoad(): {[entityType: string]: EntityTypeVersionLoadConfig} { export function createDefaultEntityTypesVersionLoad(): {[entityType: string]: EntityTypeVersionLoadConfig} {

Loading…
Cancel
Save