[Minor] Optimize bulk operations in transactions

This commit is contained in:
Robert von Burg 2021-07-16 14:25:59 +02:00
parent bff8658c22
commit 110569b895
1 changed files with 91 additions and 66 deletions

View File

@ -1403,98 +1403,123 @@ public abstract class AbstractTransaction implements StrolchTransaction {
if (this.objectFilter == null) if (this.objectFilter == null)
return; return;
List<Object> removed; List<Object> changed;
List<Object> updated;
List<Object> added;
/* /*
* Resources * Resources
*/ */
removed = this.objectFilter.getRemoved(Tags.RESOURCE); // removed
if (!removed.isEmpty()) { changed = this.objectFilter.getRemoved(Tags.RESOURCE);
for (Object obj : removed) { if (changed.size() == 1) {
RemoveResourceCommand cmd = new RemoveResourceCommand(this); RemoveResourceCommand cmd = new RemoveResourceCommand(this);
cmd.setResource((Resource) obj); cmd.setResource((Resource) changed.get(0));
addCommand(cmd); addCommand(cmd);
} } else if (changed.size() > 1) {
RemoveResourcesCommand cmd = new RemoveResourcesCommand(this);
changed.stream().map(e -> (Resource) e).forEach(cmd::addResource);
addCommand(cmd);
} }
updated = this.objectFilter.getUpdated(Tags.RESOURCE); // updated
if (!updated.isEmpty()) { changed = this.objectFilter.getUpdated(Tags.RESOURCE);
for (Object obj : updated) { if (changed.size() == 1) {
UpdateResourceCommand cmd = new UpdateResourceCommand(this); UpdateResourceCommand cmd = new UpdateResourceCommand(this);
cmd.setResource((Resource) obj); cmd.setResource((Resource) changed.get(0));
addCommand(cmd); addCommand(cmd);
} } else if (changed.size() > 1) {
UpdateResourcesCommand cmd = new UpdateResourcesCommand(this);
changed.stream().map(e -> (Resource) e).forEach(cmd::addResource);
addCommand(cmd);
} }
added = this.objectFilter.getAdded(Tags.RESOURCE); // added
if (!added.isEmpty()) { changed = this.objectFilter.getAdded(Tags.RESOURCE);
for (Object obj : added) { if (changed.size() == 1) {
AddResourceCommand cmd = new AddResourceCommand(this); AddResourceCommand cmd = new AddResourceCommand(this);
cmd.setResource((Resource) obj); cmd.setResource((Resource) changed.get(0));
addCommand(cmd); addCommand(cmd);
} } else if (changed.size() > 1) {
AddResourcesCommand cmd = new AddResourcesCommand(this);
changed.stream().map(e -> (Resource) e).forEach(cmd::addResource);
addCommand(cmd);
} }
/* /*
* Orders * Orders
*/ */
removed = this.objectFilter.getRemoved(Tags.ORDER); // removed
if (!removed.isEmpty()) { changed = this.objectFilter.getRemoved(Tags.ORDER);
for (Object obj : removed) { if (changed.size() == 1) {
RemoveOrderCommand cmd = new RemoveOrderCommand(this); RemoveOrderCommand cmd = new RemoveOrderCommand(this);
cmd.setOrder((Order) obj); cmd.setOrder((Order) changed.get(0));
addCommand(cmd); addCommand(cmd);
} } else if (changed.size() > 1) {
RemoveOrdersCommand cmd = new RemoveOrdersCommand(this);
changed.stream().map(e -> (Order) e).forEach(cmd::addOrder);
addCommand(cmd);
} }
updated = this.objectFilter.getUpdated(Tags.ORDER); // updated
if (!updated.isEmpty()) { changed = this.objectFilter.getUpdated(Tags.ORDER);
for (Object obj : updated) { if (changed.size() == 1) {
UpdateOrderCommand cmd = new UpdateOrderCommand(this); UpdateOrderCommand cmd = new UpdateOrderCommand(this);
cmd.setOrder((Order) obj); cmd.setOrder((Order) changed.get(0));
addCommand(cmd); addCommand(cmd);
} } else if (changed.size() > 1) {
UpdateOrdersCommand cmd = new UpdateOrdersCommand(this);
changed.stream().map(e -> (Order) e).forEach(cmd::addOrder);
addCommand(cmd);
} }
added = this.objectFilter.getAdded(Tags.ORDER); // added
if (!added.isEmpty()) { changed = this.objectFilter.getAdded(Tags.ORDER);
for (Object obj : added) { if (changed.size() == 1) {
AddOrderCommand cmd = new AddOrderCommand(this); AddOrderCommand cmd = new AddOrderCommand(this);
cmd.setOrder((Order) obj); cmd.setOrder((Order) changed.get(0));
addCommand(cmd); addCommand(cmd);
} } else if (changed.size() > 1) {
AddOrdersCommand cmd = new AddOrdersCommand(this);
changed.stream().map(e -> (Order) e).forEach(cmd::addOrder);
addCommand(cmd);
} }
/* /*
* Activities * Activities
*/ */
removed = this.objectFilter.getRemoved(Tags.ACTIVITY); // removed
if (!removed.isEmpty()) { changed = this.objectFilter.getRemoved(Tags.ACTIVITY);
for (Object obj : removed) { if (changed.size() == 1) {
RemoveActivityCommand cmd = new RemoveActivityCommand(this); RemoveActivityCommand cmd = new RemoveActivityCommand(this);
cmd.setActivity((Activity) obj); cmd.setActivity((Activity) changed.get(0));
addCommand(cmd); addCommand(cmd);
} } else if (changed.size() > 1) {
RemoveActivitiesCommand cmd = new RemoveActivitiesCommand(this);
changed.stream().map(e -> (Activity) e).forEach(cmd::addActivity);
addCommand(cmd);
} }
updated = this.objectFilter.getUpdated(Tags.ACTIVITY); // updated
if (!updated.isEmpty()) { changed = this.objectFilter.getUpdated(Tags.ACTIVITY);
for (Object obj : updated) { if (changed.size() == 1) {
UpdateActivityCommand cmd = new UpdateActivityCommand(this); UpdateActivityCommand cmd = new UpdateActivityCommand(this);
cmd.setActivity((Activity) obj); cmd.setActivity((Activity) changed.get(0));
addCommand(cmd); addCommand(cmd);
} } else if (changed.size() > 1) {
UpdateActivitiesCommand cmd = new UpdateActivitiesCommand(this);
changed.stream().map(e -> (Activity) e).forEach(cmd::addActivity);
addCommand(cmd);
} }
added = this.objectFilter.getAdded(Tags.ACTIVITY); // added
if (!added.isEmpty()) { changed = this.objectFilter.getAdded(Tags.ACTIVITY);
for (Object obj : added) { if (changed.size() == 1) {
AddActivityCommand cmd = new AddActivityCommand(this); AddActivityCommand cmd = new AddActivityCommand(this);
cmd.setActivity((Activity) obj); cmd.setActivity((Activity) changed.get(0));
addCommand(cmd); addCommand(cmd);
} } else if (changed.size() > 1) {
AddActivitiesCommand cmd = new AddActivitiesCommand(this);
changed.stream().map(e -> (Activity) e).forEach(cmd::addActivitiy);
addCommand(cmd);
} }
// clear, so that we don't do it twice in case of a flush() // clear, so that we don't do it twice in case of a flush()