Improvement to the Rule Chain diff

This commit is contained in:
Andrii Shvaika 2022-06-17 11:54:20 +03:00
parent 493b8f2f7b
commit 2dad98b2f7
2 changed files with 14 additions and 17 deletions

View File

@ -86,7 +86,6 @@ public abstract class BaseEntityImportService<I extends EntityId, E extends Expo
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
@Override @Override
public EntityImportResult<E> importEntity(EntitiesImportCtx ctx, D exportData) throws ThingsboardException { public EntityImportResult<E> importEntity(EntitiesImportCtx ctx, D exportData) throws ThingsboardException {
// TbStopWatch sw = TbStopWatch.create("find");
EntityImportResult<E> importResult = new EntityImportResult<>(); EntityImportResult<E> importResult = new EntityImportResult<>();
importResult.setEntityType(getEntityType()); importResult.setEntityType(getEntityType());
IdProvider idProvider = new IdProvider(ctx, importResult); IdProvider idProvider = new IdProvider(ctx, importResult);
@ -107,10 +106,9 @@ public abstract class BaseEntityImportService<I extends EntityId, E extends Expo
E prepared = prepare(ctx, entity, existingEntity, exportData, idProvider); E prepared = prepare(ctx, entity, existingEntity, exportData, idProvider);
boolean saveOrUpdate = existingEntity == null || compare(prepared, existingEntity); boolean saveOrUpdate = existingEntity == null || compare(ctx, exportData, prepared, existingEntity);
if (saveOrUpdate) { if (saveOrUpdate) {
// sw.startNew("prepareAndSave");
E savedEntity = saveOrUpdate(ctx, prepared, exportData, idProvider); E savedEntity = saveOrUpdate(ctx, prepared, exportData, idProvider);
boolean created = existingEntity == null; boolean created = existingEntity == null;
importResult.setCreated(created); importResult.setCreated(created);
@ -123,14 +121,8 @@ public abstract class BaseEntityImportService<I extends EntityId, E extends Expo
importResult.setUpdatedRelatedEntities(updateRelatedEntitiesIfUnmodified(ctx, prepared, exportData, idProvider)); importResult.setUpdatedRelatedEntities(updateRelatedEntitiesIfUnmodified(ctx, prepared, exportData, idProvider));
} }
// sw.startNew("afterSaved");
processAfterSaved(ctx, importResult, exportData, idProvider); processAfterSaved(ctx, importResult, exportData, idProvider);
// sw.stop();
// for (var task : sw.getTaskInfo()) {
// log.info("[{}][{}] Executed: {} in {}ms", exportData.getEntityType(), exportData.getEntity().getId(), task.getTaskName(), task.getTimeMillis());
// }
// log.info("[{}][{}] Total time: {}ms", exportData.getEntityType(), exportData.getEntity().getId(), sw.getTotalTimeMillis());
return importResult; return importResult;
} }
@ -145,16 +137,16 @@ public abstract class BaseEntityImportService<I extends EntityId, E extends Expo
protected abstract E prepare(EntitiesImportCtx ctx, E entity, E oldEntity, D exportData, IdProvider idProvider); protected abstract E prepare(EntitiesImportCtx ctx, E entity, E oldEntity, D exportData, IdProvider idProvider);
protected boolean compare(E prepared, E existing) { protected boolean compare(EntitiesImportCtx ctx, D exportData, E prepared, E existing) {
var newCopy = deepCopy(prepared); var newCopy = deepCopy(prepared);
var existingCopy = deepCopy(existing); var existingCopy = deepCopy(existing);
cleanupForComparison(newCopy); cleanupForComparison(newCopy);
cleanupForComparison(existingCopy); cleanupForComparison(existingCopy);
var result = !newCopy.equals(existingCopy); var result = !newCopy.equals(existingCopy);
if (result) { if (result) {
log.info("[{}] Found update.", prepared.getId()); log.debug("[{}] Found update.", prepared.getId());
log.info("[{}] From: {}", prepared.getId(), newCopy); log.debug("[{}] From: {}", prepared.getId(), newCopy);
log.info("[{}] To: {}", prepared.getId(), existingCopy); log.debug("[{}] To: {}", prepared.getId(), existingCopy);
} }
return result; return result;
} }

View File

@ -87,6 +87,7 @@ public class RuleChainImportService extends BaseEntityImportService<RuleChainId,
.forEach(ruleChainConnectionInfo -> { .forEach(ruleChainConnectionInfo -> {
ruleChainConnectionInfo.setTargetRuleChainId(idProvider.getInternalId(ruleChainConnectionInfo.getTargetRuleChainId(), false)); ruleChainConnectionInfo.setTargetRuleChainId(idProvider.getInternalId(ruleChainConnectionInfo.getTargetRuleChainId(), false));
}); });
//TODO: lookup rule node id based on external rule node id.
ruleChain.setFirstRuleNodeId(null); ruleChain.setFirstRuleNodeId(null);
return ruleChain; return ruleChain;
} }
@ -100,10 +101,14 @@ public class RuleChainImportService extends BaseEntityImportService<RuleChainId,
} }
@Override @Override
protected boolean compare(RuleChain prepared, RuleChain existing) { protected boolean compare(EntitiesImportCtx ctx, RuleChainExportData exportData, RuleChain prepared, RuleChain existing) {
//Always update, since we don't fetch the metadata. boolean different = super.compare(ctx, exportData, prepared, existing);
//TODO: improve and fetch the metadata of existing entity. if (!different) {
return true; RuleChainMetaData newMD = exportData.getMetaData();
RuleChainMetaData existingMD = ruleChainService.loadRuleChainMetaData(ctx.getTenantId(), prepared.getId());
different = newMD.equals(existingMD);
}
return different;
} }
@Override @Override