Committed by
Gerrit Code Review
Make resource retrieval more efficient when specifing resource type
This resolves ONOS-4666 Change-Id: I9d09b60531ca48b36fc20f43498cda62f1badb8b
Showing
10 changed files
with
84 additions
and
6 deletions
... | @@ -111,6 +111,18 @@ public interface ResourceStore extends Store<ResourceEvent, ResourceStoreDelegat | ... | @@ -111,6 +111,18 @@ public interface ResourceStore extends Store<ResourceEvent, ResourceStoreDelegat |
111 | Set<Resource> getChildResources(DiscreteResourceId parent); | 111 | Set<Resource> getChildResources(DiscreteResourceId parent); |
112 | 112 | ||
113 | /** | 113 | /** |
114 | + * Returns a set of the child resources of the specified parent and whose type is | ||
115 | + * the specified class. | ||
116 | + * | ||
117 | + * @param parent ID of the parent of the resources to be returned | ||
118 | + * @param cls class instance of the children | ||
119 | + * @param <T> type of the resource | ||
120 | + * @return a set of the child resources of the specified parent and whose type is | ||
121 | + * the specified class | ||
122 | + */ | ||
123 | + <T> Set<Resource> getChildResources(DiscreteResourceId parent, Class<T> cls); | ||
124 | + | ||
125 | + /** | ||
114 | * Returns a collection of the resources which are children of the specified parent and | 126 | * Returns a collection of the resources which are children of the specified parent and |
115 | * whose type is the specified class. | 127 | * whose type is the specified class. |
116 | * | 128 | * | ... | ... |
... | @@ -165,9 +165,9 @@ public final class ResourceManager extends AbstractListenerManager<ResourceEvent | ... | @@ -165,9 +165,9 @@ public final class ResourceManager extends AbstractListenerManager<ResourceEvent |
165 | checkNotNull(parent); | 165 | checkNotNull(parent); |
166 | checkNotNull(cls); | 166 | checkNotNull(cls); |
167 | 167 | ||
168 | - // naive implementation | 168 | + return store.getChildResources(parent, cls).stream() |
169 | - return getAvailableResources(parent).stream() | 169 | + // We access store twice in this method, then the store may be updated by others |
170 | - .filter(resource -> resource.isTypeOf(cls)) | 170 | + .filter(store::isAvailable) |
171 | .collect(Collectors.toSet()); | 171 | .collect(Collectors.toSet()); |
172 | } | 172 | } |
173 | 173 | ||
... | @@ -177,9 +177,11 @@ public final class ResourceManager extends AbstractListenerManager<ResourceEvent | ... | @@ -177,9 +177,11 @@ public final class ResourceManager extends AbstractListenerManager<ResourceEvent |
177 | checkNotNull(parent); | 177 | checkNotNull(parent); |
178 | checkNotNull(cls); | 178 | checkNotNull(cls); |
179 | 179 | ||
180 | - // naive implementation | 180 | + return store.getChildResources(parent, cls).stream() |
181 | - return getAvailableResources(parent).stream() | 181 | + // We access store twice in this method, then the store may be updated by others |
182 | - .flatMap(resource -> Tools.stream(resource.valueAs(cls))) | 182 | + .filter(store::isAvailable) |
183 | + .map(x -> x.valueAs(cls)) | ||
184 | + .flatMap(Tools::stream) | ||
183 | .collect(Collectors.toSet()); | 185 | .collect(Collectors.toSet()); |
184 | } | 186 | } |
185 | 187 | ... | ... |
... | @@ -32,6 +32,7 @@ import org.onosproject.store.service.Versioned; | ... | @@ -32,6 +32,7 @@ import org.onosproject.store.service.Versioned; |
32 | import java.util.LinkedHashSet; | 32 | import java.util.LinkedHashSet; |
33 | import java.util.List; | 33 | import java.util.List; |
34 | import java.util.Set; | 34 | import java.util.Set; |
35 | +import java.util.stream.Collectors; | ||
35 | import java.util.stream.Stream; | 36 | import java.util.stream.Stream; |
36 | 37 | ||
37 | import static org.onosproject.store.resource.impl.ConsistentResourceStore.SERIALIZER; | 38 | import static org.onosproject.store.resource.impl.ConsistentResourceStore.SERIALIZER; |
... | @@ -79,6 +80,13 @@ class ConsistentContinuousResourceSubStore { | ... | @@ -79,6 +80,13 @@ class ConsistentContinuousResourceSubStore { |
79 | return children.value(); | 80 | return children.value(); |
80 | } | 81 | } |
81 | 82 | ||
83 | + <T> Set<ContinuousResource> getChildResources(DiscreteResourceId parent, Class<T> cls) { | ||
84 | + // naive implementation | ||
85 | + return getChildResources(parent).stream() | ||
86 | + .filter(x -> x.isTypeOf(cls)) | ||
87 | + .collect(Collectors.toCollection(LinkedHashSet::new)); | ||
88 | + } | ||
89 | + | ||
82 | public boolean isAvailable(ContinuousResource resource) { | 90 | public boolean isAvailable(ContinuousResource resource) { |
83 | // check if it's registered or not. | 91 | // check if it's registered or not. |
84 | Versioned<Set<ContinuousResource>> children = childMap.get(resource.parent().get().id()); | 92 | Versioned<Set<ContinuousResource>> children = childMap.get(resource.parent().get().id()); | ... | ... |
... | @@ -76,6 +76,16 @@ class ConsistentDiscreteResourceSubStore { | ... | @@ -76,6 +76,16 @@ class ConsistentDiscreteResourceSubStore { |
76 | return children.value().values(); | 76 | return children.value().values(); |
77 | } | 77 | } |
78 | 78 | ||
79 | + <T> Set<DiscreteResource> getChildResources(DiscreteResourceId parent, Class<T> cls) { | ||
80 | + Versioned<DiscreteResources> children = childMap.get(parent); | ||
81 | + | ||
82 | + if (children == null) { | ||
83 | + return ImmutableSet.of(); | ||
84 | + } | ||
85 | + | ||
86 | + return children.value().valuesOf(cls); | ||
87 | + } | ||
88 | + | ||
79 | boolean isAvailable(DiscreteResource resource) { | 89 | boolean isAvailable(DiscreteResource resource) { |
80 | return getResourceAllocations(resource.id()).isEmpty(); | 90 | return getResourceAllocations(resource.id()).isEmpty(); |
81 | } | 91 | } | ... | ... |
... | @@ -296,6 +296,17 @@ public class ConsistentResourceStore extends AbstractStore<ResourceEvent, Resour | ... | @@ -296,6 +296,17 @@ public class ConsistentResourceStore extends AbstractStore<ResourceEvent, Resour |
296 | .build(); | 296 | .build(); |
297 | } | 297 | } |
298 | 298 | ||
299 | + @Override | ||
300 | + public <T> Set<Resource> getChildResources(DiscreteResourceId parent, Class<T> cls) { | ||
301 | + checkNotNull(parent); | ||
302 | + checkNotNull(cls); | ||
303 | + | ||
304 | + return ImmutableSet.<Resource>builder() | ||
305 | + .addAll(discreteStore.getChildResources(parent, cls)) | ||
306 | + .addAll(continuousStore.getChildResources(parent, cls)) | ||
307 | + .build(); | ||
308 | + } | ||
309 | + | ||
299 | // computational complexity: O(n) where n is the number of the children of the parent | 310 | // computational complexity: O(n) where n is the number of the children of the parent |
300 | @Override | 311 | @Override |
301 | public <T> Collection<Resource> getAllocatedResources(DiscreteResourceId parent, Class<T> cls) { | 312 | public <T> Collection<Resource> getAllocatedResources(DiscreteResourceId parent, Class<T> cls) { | ... | ... |
... | @@ -91,4 +91,13 @@ interface DiscreteResources { | ... | @@ -91,4 +91,13 @@ interface DiscreteResources { |
91 | * @return all resources | 91 | * @return all resources |
92 | */ | 92 | */ |
93 | Set<DiscreteResource> values(); | 93 | Set<DiscreteResource> values(); |
94 | + | ||
95 | + /** | ||
96 | + * Returns all of resources this instance holds and filtered by the specified type. | ||
97 | + * | ||
98 | + * @param cls class instance of the resource value | ||
99 | + * @param <T> type of the resource value | ||
100 | + * @return all of resources this instance holds and filtered by the specified type | ||
101 | + */ | ||
102 | + <T> Set<DiscreteResource> valuesOf(Class<T> cls); | ||
94 | } | 103 | } | ... | ... |
... | @@ -68,4 +68,9 @@ final class EmptyDiscreteResources implements DiscreteResources { | ... | @@ -68,4 +68,9 @@ final class EmptyDiscreteResources implements DiscreteResources { |
68 | .add("values", ImmutableSet.of()) | 68 | .add("values", ImmutableSet.of()) |
69 | .toString(); | 69 | .toString(); |
70 | } | 70 | } |
71 | + | ||
72 | + @Override | ||
73 | + public <T> Set<DiscreteResource> valuesOf(Class<T> cls) { | ||
74 | + return ImmutableSet.of(); | ||
75 | + } | ||
71 | } | 76 | } | ... | ... |
... | @@ -16,6 +16,7 @@ | ... | @@ -16,6 +16,7 @@ |
16 | package org.onosproject.store.resource.impl; | 16 | package org.onosproject.store.resource.impl; |
17 | 17 | ||
18 | import com.google.common.base.MoreObjects; | 18 | import com.google.common.base.MoreObjects; |
19 | +import com.google.common.collect.ImmutableSet; | ||
19 | import com.google.common.collect.Sets; | 20 | import com.google.common.collect.Sets; |
20 | import org.onosproject.net.resource.DiscreteResource; | 21 | import org.onosproject.net.resource.DiscreteResource; |
21 | import org.onosproject.net.resource.DiscreteResourceCodec; | 22 | import org.onosproject.net.resource.DiscreteResourceCodec; |
... | @@ -114,6 +115,13 @@ final class EncodableDiscreteResources implements DiscreteResources { | ... | @@ -114,6 +115,13 @@ final class EncodableDiscreteResources implements DiscreteResources { |
114 | .collect(Collectors.toCollection(LinkedHashSet::new)); | 115 | .collect(Collectors.toCollection(LinkedHashSet::new)); |
115 | } | 116 | } |
116 | 117 | ||
118 | + @Override | ||
119 | + public <T> Set<DiscreteResource> valuesOf(Class<T> cls) { | ||
120 | + return Optional.ofNullable(values.get(cls)) | ||
121 | + .map(x -> x.values(parent.id())) | ||
122 | + .orElse(ImmutableSet.of()); | ||
123 | + } | ||
124 | + | ||
117 | DiscreteResource parent() { | 125 | DiscreteResource parent() { |
118 | return parent; | 126 | return parent; |
119 | } | 127 | } | ... | ... |
... | @@ -25,6 +25,7 @@ import java.util.LinkedHashSet; | ... | @@ -25,6 +25,7 @@ import java.util.LinkedHashSet; |
25 | import java.util.Objects; | 25 | import java.util.Objects; |
26 | import java.util.Optional; | 26 | import java.util.Optional; |
27 | import java.util.Set; | 27 | import java.util.Set; |
28 | +import java.util.stream.Collectors; | ||
28 | 29 | ||
29 | final class GenericDiscreteResources implements DiscreteResources { | 30 | final class GenericDiscreteResources implements DiscreteResources { |
30 | private final Set<DiscreteResource> values; | 31 | private final Set<DiscreteResource> values; |
... | @@ -87,6 +88,13 @@ final class GenericDiscreteResources implements DiscreteResources { | ... | @@ -87,6 +88,13 @@ final class GenericDiscreteResources implements DiscreteResources { |
87 | } | 88 | } |
88 | 89 | ||
89 | @Override | 90 | @Override |
91 | + public <T> Set<DiscreteResource> valuesOf(Class<T> cls) { | ||
92 | + return values.stream() | ||
93 | + .filter(x -> x.isTypeOf(cls)) | ||
94 | + .collect(Collectors.toCollection(LinkedHashSet::new)); | ||
95 | + } | ||
96 | + | ||
97 | + @Override | ||
90 | public int hashCode() { | 98 | public int hashCode() { |
91 | return Objects.hash(values); | 99 | return Objects.hash(values); |
92 | } | 100 | } | ... | ... |
... | @@ -93,6 +93,11 @@ final class UnifiedDiscreteResources implements DiscreteResources { | ... | @@ -93,6 +93,11 @@ final class UnifiedDiscreteResources implements DiscreteResources { |
93 | .collect(Collectors.toCollection(LinkedHashSet::new)); | 93 | .collect(Collectors.toCollection(LinkedHashSet::new)); |
94 | } | 94 | } |
95 | 95 | ||
96 | + public <T> Set<DiscreteResource> valuesOf(Class<T> cls) { | ||
97 | + return Stream.concat(encodables.valuesOf(cls).stream(), generics.valuesOf(cls).stream()) | ||
98 | + .collect(Collectors.toCollection(LinkedHashSet::new)); | ||
99 | + } | ||
100 | + | ||
96 | @Override | 101 | @Override |
97 | public int hashCode() { | 102 | public int hashCode() { |
98 | return Objects.hash(generics, encodables); | 103 | return Objects.hash(generics, encodables); | ... | ... |
-
Please register or login to post a comment