Skip to content

Commit c7639b3

Browse files
committed
refactor: move BidiMap to another file to be shared
Also introduces a put method to ensure no duplicates, as well as a merge method.
1 parent 3ee953c commit c7639b3

2 files changed

Lines changed: 67 additions & 26 deletions

File tree

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package io.substrait.extension;
2+
3+
import java.util.HashMap;
4+
import java.util.Map;
5+
import java.util.Set;
6+
7+
/** We don't depend on guava... */
8+
class BidiMap<T1, T2> {
9+
private final Map<T1, T2> forwardMap;
10+
private final Map<T2, T1> reverseMap;
11+
12+
BidiMap(Map<T1, T2> forwardMap) {
13+
this.forwardMap = forwardMap;
14+
this.reverseMap = new HashMap<>();
15+
for (Map.Entry<T1, T2> entry : forwardMap.entrySet()) {
16+
reverseMap.put(entry.getValue(), entry.getKey());
17+
}
18+
}
19+
20+
BidiMap() {
21+
this.forwardMap = new HashMap<>();
22+
this.reverseMap = new HashMap<>();
23+
}
24+
25+
T2 get(T1 t1) {
26+
return forwardMap.get(t1);
27+
}
28+
29+
T1 reverseGet(T2 t2) {
30+
return reverseMap.get(t2);
31+
}
32+
33+
/**
34+
* Associates the specified values in both directions. Throws if either value is already mapped to
35+
* a different value.
36+
*/
37+
void put(T1 t1, T2 t2) {
38+
T2 existingForward = forwardMap.get(t1);
39+
T1 existingReverse = reverseMap.get(t2);
40+
41+
if (existingForward != null && !existingForward.equals(t2)) {
42+
throw new IllegalArgumentException("Key already exists in map with different value");
43+
}
44+
if (existingReverse != null && !existingReverse.equals(t1)) {
45+
throw new IllegalArgumentException("Key already exists in map with different value");
46+
}
47+
48+
forwardMap.put(t1, t2);
49+
reverseMap.put(t2, t1);
50+
}
51+
52+
void merge(BidiMap<T1, T2> other) {
53+
for (Map.Entry<T1, T2> entry : other.forwardEntrySet()) {
54+
put(entry.getKey(), entry.getValue());
55+
}
56+
}
57+
58+
Set<Map.Entry<T1, T2>> forwardEntrySet() {
59+
return forwardMap.entrySet();
60+
}
61+
62+
Set<Map.Entry<T2, T1>> reverseEntrySet() {
63+
return reverseMap.entrySet();
64+
}
65+
}

core/src/main/java/io/substrait/extension/ExtensionCollector.java

Lines changed: 2 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ private SimpleExtensions getExtensions() {
6868
HashMap<String, SimpleExtensionURN> urns = new HashMap<>();
6969

7070
ArrayList<SimpleExtensionDeclaration> extensionList = new ArrayList<>();
71-
for (Map.Entry<Integer, SimpleExtension.FunctionAnchor> e : funcMap.forwardMap.entrySet()) {
71+
for (Map.Entry<Integer, SimpleExtension.FunctionAnchor> e : funcMap.forwardEntrySet()) {
7272
SimpleExtensionURN urn =
7373
urns.computeIfAbsent(
7474
e.getValue().urn(),
@@ -87,7 +87,7 @@ private SimpleExtensions getExtensions() {
8787
.build();
8888
extensionList.add(decl);
8989
}
90-
for (Map.Entry<Integer, SimpleExtension.TypeAnchor> e : typeMap.forwardMap.entrySet()) {
90+
for (Map.Entry<Integer, SimpleExtension.TypeAnchor> e : typeMap.forwardEntrySet()) {
9191
SimpleExtensionURN urn =
9292
urns.computeIfAbsent(
9393
e.getValue().urn(),
@@ -120,28 +120,4 @@ private static final class SimpleExtensions {
120120
this.extensionList = extensionList;
121121
}
122122
}
123-
124-
/** We don't depend on guava... */
125-
private static class BidiMap<T1, T2> {
126-
private final Map<T1, T2> forwardMap;
127-
private final Map<T2, T1> reverseMap;
128-
129-
public BidiMap(Map<T1, T2> forwardMap) {
130-
this.forwardMap = forwardMap;
131-
this.reverseMap = new HashMap<>();
132-
}
133-
134-
public T2 get(T1 t1) {
135-
return forwardMap.get(t1);
136-
}
137-
138-
public T1 reverseGet(T2 t2) {
139-
return reverseMap.get(t2);
140-
}
141-
142-
public void put(T1 t1, T2 t2) {
143-
forwardMap.put(t1, t2);
144-
reverseMap.put(t2, t1);
145-
}
146-
}
147123
}

0 commit comments

Comments
 (0)