}
public QueryResult<T> toQueryResult(final DOMQueryResult domResult) {
- return new DefaultQueryResult<>(codec, domResult.items());
+ return new DefaultQueryResult<>(codec, domResult);
}
@Override
import static com.google.common.base.Verify.verifyNotNull;
import static java.util.Objects.requireNonNull;
-import com.google.common.base.Function;
import com.google.common.base.VerifyException;
-import com.google.common.collect.Lists;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.VarHandle;
-import java.util.List;
import java.util.Map.Entry;
import java.util.Spliterator;
+import java.util.function.Function;
import java.util.stream.Stream;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
-import org.gaul.modernizer_maven_annotations.SuppressModernizer;
import org.opendaylight.mdsal.binding.api.query.QueryResult;
import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTree;
import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTreeNode;
import org.opendaylight.mdsal.binding.dom.codec.api.BindingDataObjectCodecTreeNode;
+import org.opendaylight.mdsal.dom.api.query.DOMQueryResult;
import org.opendaylight.yangtools.yang.binding.DataObject;
import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
@NonNullByDefault
-@SuppressModernizer
final class DefaultQueryResult<T extends DataObject>
implements QueryResult<T>, Function<Entry<YangInstanceIdentifier, NormalizedNode<?, ?>>, QueryResult.Item<T>> {
private static final VarHandle ITEM_CODEC;
}
}
- private final List<? extends Entry<YangInstanceIdentifier, NormalizedNode<?, ?>>> domResult;
+ private final DOMQueryResult domResult;
private final BindingCodecTree codec;
@SuppressWarnings("unused")
@SuppressFBWarnings(value = "NP_STORE_INTO_NONNULL_FIELD", justification = "Ungrokked type annotation")
private volatile @Nullable BindingDataObjectCodecTreeNode<T> itemCodec = null;
- DefaultQueryResult(final BindingCodecTree codec,
- final List<? extends Entry<YangInstanceIdentifier, NormalizedNode<?, ?>>> domResult) {
+ DefaultQueryResult(final BindingCodecTree codec, final DOMQueryResult domResult) {
this.codec = requireNonNull(codec);
this.domResult = requireNonNull(domResult);
}
@Override
public Spliterator<? extends Item<T>> spliterator() {
- return Lists.transform(domResult, this).spliterator();
+ return new DefaultQueryResultSpliterator<>(this, domResult.spliterator());
}
@Override
--- /dev/null
+/*
+ * Copyright (c) 2020 PANTHEON.tech, s.r.o. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.mdsal.binding.dom.adapter.query;
+
+import static java.util.Objects.requireNonNull;
+
+import java.util.Map.Entry;
+import java.util.Spliterator;
+import java.util.function.Consumer;
+import org.eclipse.jdt.annotation.NonNullByDefault;
+import org.eclipse.jdt.annotation.Nullable;
+import org.opendaylight.mdsal.binding.api.query.QueryResult;
+import org.opendaylight.mdsal.binding.api.query.QueryResult.Item;
+import org.opendaylight.yangtools.yang.binding.DataObject;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
+import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
+
+@NonNullByDefault
+final class DefaultQueryResultSpliterator<T extends DataObject> implements Spliterator<QueryResult.Item<T>> {
+ private final Spliterator<? extends Entry<YangInstanceIdentifier, NormalizedNode<?, ?>>> domSpliterator;
+ private final DefaultQueryResult<T> result;
+
+ DefaultQueryResultSpliterator(final DefaultQueryResult<T> result,
+ final Spliterator<? extends Entry<YangInstanceIdentifier, NormalizedNode<?, ?>>> domSpliterator) {
+ this.result = requireNonNull(result);
+ this.domSpliterator = requireNonNull(domSpliterator);
+ }
+
+ @Override
+ public boolean tryAdvance(final @Nullable Consumer<? super Item<T>> action) {
+ return domSpliterator.tryAdvance(dom -> action.accept(new DefaultQueryResultItem<>(result, dom)));
+ }
+
+ @Override
+ public @Nullable Spliterator<Item<T>> trySplit() {
+ final Spliterator<? extends Entry<YangInstanceIdentifier, NormalizedNode<?, ?>>> split =
+ domSpliterator.trySplit();
+ return split == null ? null : new DefaultQueryResultSpliterator<>(result, split);
+ }
+
+ @Override
+ public long estimateSize() {
+ return domSpliterator.estimateSize();
+ }
+
+ @Override
+ public long getExactSizeIfKnown() {
+ return domSpliterator.getExactSizeIfKnown();
+ }
+
+ @Override
+ public int characteristics() {
+ return domSpliterator.characteristics();
+ }
+}
package org.opendaylight.mdsal.dom.api.query;
import com.google.common.annotations.Beta;
-import com.google.common.collect.ImmutableList;
import java.util.List;
import java.util.Map.Entry;
+import java.util.Spliterator;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.opendaylight.yangtools.concepts.Immutable;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
*/
@Beta
@NonNullByDefault
-public final class DOMQueryResult implements Immutable {
- private static final DOMQueryResult EMPTY_INSTANCE = new DOMQueryResult(ImmutableList.of());
+public interface DOMQueryResult extends Immutable {
- private final ImmutableList<? extends Entry<YangInstanceIdentifier, NormalizedNode<?, ?>>> items;
+ Spliterator<? extends Entry<YangInstanceIdentifier, NormalizedNode<?, ?>>> spliterator();
- private DOMQueryResult(final List<? extends Entry<YangInstanceIdentifier, NormalizedNode<?, ?>>> items) {
- this.items = ImmutableList.copyOf(items);
- }
-
- public static DOMQueryResult of() {
- return EMPTY_INSTANCE;
- }
+ Stream<? extends Entry<YangInstanceIdentifier, NormalizedNode<?, ?>>> stream();
- public static DOMQueryResult of(final List<? extends Entry<YangInstanceIdentifier, NormalizedNode<?, ?>>> items) {
- return items.isEmpty() ? of() : new DOMQueryResult(items);
- }
+ Stream<? extends Entry<YangInstanceIdentifier, NormalizedNode<?, ?>>> parallelStream();
- public List<? extends Entry<YangInstanceIdentifier, NormalizedNode<?, ?>>> items() {
- return items;
+ default List<? extends Entry<YangInstanceIdentifier, NormalizedNode<?, ?>>> items() {
+ return stream().collect(Collectors.toUnmodifiableList());
}
}
for (PathArgument arg : query.getRoot().getPathArguments()) {
final Optional<NormalizedNode<?, ?>> next = NormalizedNodes.findNode(root, arg);
if (next.isEmpty()) {
- return DOMQueryResult.of();
+ return EagerDOMQueryResult.of();
}
evalRoot = next.orElseThrow();
}
final DOMQuery query) {
final List<Entry<YangInstanceIdentifier, NormalizedNode<?, ?>>> result = new ArrayList<>();
evalPath(result, new ArrayDeque<>(query.getRoot().getPathArguments()), remaining, data, query);
- return DOMQueryResult.of(result);
+ return EagerDOMQueryResult.of(result);
}
private static void evalPath(final List<Entry<YangInstanceIdentifier, NormalizedNode<?,?>>> result,
}
private static DOMQueryResult evalSingle(final NormalizedNode<?, ?> data, final DOMQuery query) {
- return matches(data, query) ? DOMQueryResult.of()
- : DOMQueryResult.of(List.of(new SimpleImmutableEntry<>(query.getRoot(), data)));
+ return matches(data, query) ? EagerDOMQueryResult.of()
+ : EagerDOMQueryResult.of(new SimpleImmutableEntry<>(query.getRoot(), data));
}
private static boolean matches(final NormalizedNode<?, ?> data, final DOMQuery query) {
--- /dev/null
+/*
+ * Copyright (c) 2020 PANTHEON.tech, s.r.o. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.mdsal.dom.spi.query;
+
+import com.google.common.annotations.Beta;
+import com.google.common.collect.ImmutableList;
+import java.util.List;
+import java.util.Map.Entry;
+import java.util.Spliterator;
+import java.util.stream.Stream;
+import org.eclipse.jdt.annotation.NonNullByDefault;
+import org.opendaylight.mdsal.dom.api.query.DOMQueryResult;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
+import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
+
+@Beta
+@NonNullByDefault
+public final class EagerDOMQueryResult implements DOMQueryResult {
+ private static final EagerDOMQueryResult EMPTY_INSTANCE = new EagerDOMQueryResult(ImmutableList.of());
+
+ private final ImmutableList<? extends Entry<YangInstanceIdentifier, NormalizedNode<?, ?>>> items;
+
+ private EagerDOMQueryResult(final List<? extends Entry<YangInstanceIdentifier, NormalizedNode<?, ?>>> items) {
+ this.items = ImmutableList.copyOf(items);
+ }
+
+ public static EagerDOMQueryResult of() {
+ return EMPTY_INSTANCE;
+ }
+
+ public static EagerDOMQueryResult of(final Entry<YangInstanceIdentifier, NormalizedNode<?, ?>> item) {
+ return new EagerDOMQueryResult(ImmutableList.of(item));
+ }
+
+ public static EagerDOMQueryResult of(
+ final List<? extends Entry<YangInstanceIdentifier, NormalizedNode<?, ?>>> items) {
+ return items.isEmpty() ? of() : new EagerDOMQueryResult(items);
+ }
+
+ @Override
+ public Spliterator<? extends Entry<YangInstanceIdentifier, NormalizedNode<?, ?>>> spliterator() {
+ return items.spliterator();
+ }
+
+ @Override
+ public Stream<? extends Entry<YangInstanceIdentifier, NormalizedNode<?, ?>>> stream() {
+ return items.stream();
+ }
+
+ @Override
+ public Stream<? extends Entry<YangInstanceIdentifier, NormalizedNode<?, ?>>> parallelStream() {
+ return items.parallelStream();
+ }
+
+ @Override
+ public List<? extends Entry<YangInstanceIdentifier, NormalizedNode<?, ?>>> items() {
+ return items;
+ }
+}