diff options
Diffstat (limited to 'subprojects/viatra-runtime/src/main/java/tools/refinery/viatra/runtime/matchers/memories/UnaryMaskedTupleMemory.java')
-rw-r--r-- | subprojects/viatra-runtime/src/main/java/tools/refinery/viatra/runtime/matchers/memories/UnaryMaskedTupleMemory.java | 143 |
1 files changed, 143 insertions, 0 deletions
diff --git a/subprojects/viatra-runtime/src/main/java/tools/refinery/viatra/runtime/matchers/memories/UnaryMaskedTupleMemory.java b/subprojects/viatra-runtime/src/main/java/tools/refinery/viatra/runtime/matchers/memories/UnaryMaskedTupleMemory.java new file mode 100644 index 00000000..f34cc9e3 --- /dev/null +++ b/subprojects/viatra-runtime/src/main/java/tools/refinery/viatra/runtime/matchers/memories/UnaryMaskedTupleMemory.java | |||
@@ -0,0 +1,143 @@ | |||
1 | /******************************************************************************* | ||
2 | * Copyright (c) 2010-2018, Gabor Bergmann, IncQuery Labs Ltd. | ||
3 | * This program and the accompanying materials are made available under the | ||
4 | * terms of the Eclipse Public License v. 2.0 which is available at | ||
5 | * http://www.eclipse.org/legal/epl-v20.html. | ||
6 | * | ||
7 | * SPDX-License-Identifier: EPL-2.0 | ||
8 | *******************************************************************************/ | ||
9 | package tools.refinery.viatra.runtime.matchers.memories; | ||
10 | |||
11 | import java.util.Collection; | ||
12 | import java.util.Iterator; | ||
13 | import java.util.Map; | ||
14 | |||
15 | import tools.refinery.viatra.runtime.matchers.tuple.ITuple; | ||
16 | import tools.refinery.viatra.runtime.matchers.tuple.Tuple; | ||
17 | import tools.refinery.viatra.runtime.matchers.tuple.TupleMask; | ||
18 | import tools.refinery.viatra.runtime.matchers.tuple.Tuples; | ||
19 | import tools.refinery.viatra.runtime.matchers.util.CollectionsFactory; | ||
20 | import tools.refinery.viatra.runtime.matchers.util.CollectionsFactory.MemoryType; | ||
21 | import tools.refinery.viatra.runtime.matchers.util.IMemoryView; | ||
22 | import tools.refinery.viatra.runtime.matchers.util.IMultiLookup; | ||
23 | import tools.refinery.viatra.runtime.matchers.util.IMultiLookup.ChangeGranularity; | ||
24 | import tools.refinery.viatra.runtime.matchers.util.timeline.Timeline; | ||
25 | |||
26 | /** | ||
27 | * Specialized for unary mask; tuples are indexed by a single column as opposed to a projection (signature) tuple. | ||
28 | * | ||
29 | * @author Gabor Bergmann | ||
30 | * @since 2.0 | ||
31 | */ | ||
32 | public final class UnaryMaskedTupleMemory<Timestamp extends Comparable<Timestamp>> extends MaskedTupleMemory<Timestamp> { | ||
33 | |||
34 | protected IMultiLookup<Object, Tuple> columnToTuples; | ||
35 | protected final int keyPosition; | ||
36 | |||
37 | /** | ||
38 | * @param mask | ||
39 | * The mask used to index the matchings | ||
40 | * @param owner the object "owning" this memory | ||
41 | * @param bucketType the kind of tuple collection maintained for each indexer bucket | ||
42 | * @since 2.0 | ||
43 | */ | ||
44 | public UnaryMaskedTupleMemory(TupleMask mask, MemoryType bucketType, Object owner) { | ||
45 | super(mask, owner); | ||
46 | if (1 != mask.getSize()) throw new IllegalArgumentException(mask.toString()); | ||
47 | |||
48 | columnToTuples = CollectionsFactory.<Object, Tuple>createMultiLookup( | ||
49 | Object.class, bucketType, Object.class); | ||
50 | keyPosition = mask.indices[0]; | ||
51 | } | ||
52 | |||
53 | @Override | ||
54 | public void clear() { | ||
55 | columnToTuples.clear(); | ||
56 | } | ||
57 | |||
58 | @Override | ||
59 | public int getKeysetSize() { | ||
60 | return columnToTuples.countKeys(); | ||
61 | } | ||
62 | |||
63 | @Override | ||
64 | public int getTotalSize() { | ||
65 | int i = 0; | ||
66 | for (Object key : columnToTuples.distinctKeys()) { | ||
67 | i += columnToTuples.lookup(key).size(); | ||
68 | } | ||
69 | return i; | ||
70 | } | ||
71 | |||
72 | @Override | ||
73 | public Iterator<Tuple> iterator() { | ||
74 | return columnToTuples.distinctValues().iterator(); | ||
75 | } | ||
76 | |||
77 | @Override | ||
78 | public Iterable<Tuple> getSignatures() { | ||
79 | return () -> { | ||
80 | Iterator<Object> wrapped = columnToTuples.distinctKeys().iterator(); | ||
81 | return new Iterator<Tuple>() { | ||
82 | @Override | ||
83 | public boolean hasNext() { | ||
84 | return wrapped.hasNext(); | ||
85 | } | ||
86 | @Override | ||
87 | public Tuple next() { | ||
88 | Object key = wrapped.next(); | ||
89 | return Tuples.staticArityFlatTupleOf(key); | ||
90 | } | ||
91 | }; | ||
92 | }; | ||
93 | } | ||
94 | |||
95 | @Override | ||
96 | public Collection<Tuple> get(ITuple signature) { | ||
97 | Object key = signature.get(0); | ||
98 | IMemoryView<Tuple> bucket = columnToTuples.lookup(key); | ||
99 | return bucket == null ? null : bucket.distinctValues(); | ||
100 | } | ||
101 | |||
102 | @Override | ||
103 | public Map<Tuple, Timeline<Timestamp>> getWithTimeline(ITuple signature) { | ||
104 | throw new UnsupportedOperationException("Timeless memories do not support timestamp-based lookup!"); | ||
105 | } | ||
106 | |||
107 | @Override | ||
108 | public boolean remove(Tuple tuple, Tuple signature) { | ||
109 | return removeInternal(tuple, tuple.get(keyPosition)); | ||
110 | } | ||
111 | |||
112 | @Override | ||
113 | public boolean remove(Tuple tuple) { | ||
114 | return removeInternal(tuple, tuple.get(keyPosition)); | ||
115 | } | ||
116 | |||
117 | @Override | ||
118 | public boolean add(Tuple tuple, Tuple signature) { | ||
119 | return addInternal(tuple, tuple.get(keyPosition)); | ||
120 | } | ||
121 | |||
122 | @Override | ||
123 | public boolean add(Tuple tuple) { | ||
124 | return addInternal(tuple, tuple.get(keyPosition)); | ||
125 | } | ||
126 | |||
127 | protected boolean addInternal(Tuple tuple, Object key) { | ||
128 | try { | ||
129 | return columnToTuples.addPair(key, tuple) == ChangeGranularity.KEY; | ||
130 | } catch (IllegalStateException ex) { // ignore worthless internal exception details | ||
131 | throw raiseDuplicateInsertion(tuple); | ||
132 | } | ||
133 | } | ||
134 | |||
135 | protected boolean removeInternal(Tuple tuple, Object key) { | ||
136 | try { | ||
137 | return columnToTuples.removePair(key, tuple) == ChangeGranularity.KEY; | ||
138 | } catch (IllegalStateException ex) { // ignore worthless internal exception details | ||
139 | throw raiseDuplicateDeletion(tuple); | ||
140 | } | ||
141 | } | ||
142 | |||
143 | } | ||