Committed by
Gerrit Code Review
Fast path in the resource store for discrete resource
Change-Id: I179376f8a6b43b1f2867212b2456c17b9b5602f5
Showing
1 changed file
with
16 additions
and
3 deletions
| ... | @@ -545,9 +545,9 @@ public class ConsistentResourceStore extends AbstractStore<ResourceEvent, Resour | ... | @@ -545,9 +545,9 @@ public class ConsistentResourceStore extends AbstractStore<ResourceEvent, Resour |
| 545 | * @param id ID of resource to be checked | 545 | * @param id ID of resource to be checked |
| 546 | * @return the resource which is regarded as the same as the specified resource | 546 | * @return the resource which is regarded as the same as the specified resource |
| 547 | */ | 547 | */ |
| 548 | - // Naive implementation, which traverses all elements in the set | 548 | + // Naive implementation, which traverses all elements in the set when continuous resource |
| 549 | - // computational complexity: O(n) where n is the number of elements | 549 | + // computational complexity: O(1) when discrete resource. O(n) when continuous resource |
| 550 | - // in the associated set | 550 | + // where n is the number of elements in the associated set |
| 551 | private Optional<Resource> lookup(TransactionalMap<DiscreteResourceId, Set<Resource>> childTxMap, ResourceId id) { | 551 | private Optional<Resource> lookup(TransactionalMap<DiscreteResourceId, Set<Resource>> childTxMap, ResourceId id) { |
| 552 | if (!id.parent().isPresent()) { | 552 | if (!id.parent().isPresent()) { |
| 553 | return Optional.of(Resource.ROOT); | 553 | return Optional.of(Resource.ROOT); |
| ... | @@ -558,6 +558,19 @@ public class ConsistentResourceStore extends AbstractStore<ResourceEvent, Resour | ... | @@ -558,6 +558,19 @@ public class ConsistentResourceStore extends AbstractStore<ResourceEvent, Resour |
| 558 | return Optional.empty(); | 558 | return Optional.empty(); |
| 559 | } | 559 | } |
| 560 | 560 | ||
| 561 | + // short-circuit if discrete resource | ||
| 562 | + // check the existence in the set: O(1) operation | ||
| 563 | + if (id instanceof DiscreteResourceId) { | ||
| 564 | + DiscreteResource discrete = Resources.discrete((DiscreteResourceId) id).resource(); | ||
| 565 | + if (values.contains(discrete)) { | ||
| 566 | + return Optional.of(discrete); | ||
| 567 | + } else { | ||
| 568 | + return Optional.empty(); | ||
| 569 | + } | ||
| 570 | + } | ||
| 571 | + | ||
| 572 | + // continuous resource case | ||
| 573 | + // iterate over the values in the set: O(n) operation | ||
| 561 | return values.stream() | 574 | return values.stream() |
| 562 | .filter(x -> x.id().equals(id)) | 575 | .filter(x -> x.id().equals(id)) |
| 563 | .findFirst(); | 576 | .findFirst(); | ... | ... |
-
Please register or login to post a comment