Skip to content

Commit 04da494

Browse files
committed
feat: small refactoring updating the the field converter to use strategy to reduce the huge amoung of ifs
Signed-off-by: Otavio Santana <[email protected]>
1 parent 3d0cf85 commit 04da494

File tree

1 file changed

+170
-49
lines changed

1 file changed

+170
-49
lines changed

jnosql-oracle-nosql/src/main/java/org/eclipse/jnosql/databases/oracle/communication/FieldValueConverter.java

Lines changed: 170 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -27,49 +27,48 @@
2727
import oracle.nosql.driver.values.StringValue;
2828

2929
import java.lang.reflect.Array;
30-
import java.util.Enumeration;
30+
import java.util.List;
3131
import java.util.Map;
3232

33-
enum FieldValueConverter {
33+
class FieldValueConverter {
34+
private static final List<FieldValueMapper> MAPPERS = List.of(
35+
new FieldValuePassthroughMapper(),
36+
new StringValueMapper(),
37+
new IntegerValueMapper(),
38+
new LongValueMapper(),
39+
new DoubleValueMapper(),
40+
new BooleanValueMapper(),
41+
new NumberValueMapper(),
42+
new ByteArrayValueMapper(),
43+
new EnumValueMapper(),
44+
new IterableValueMapper(),
45+
new ArrayValueMapper(),
46+
new MapValueMapper()
47+
);
3448

35-
INSTANCE;
49+
private FieldValueConverter() {
50+
throw new AssertionError("Utility class");
51+
}
3652

37-
FieldValue of(Object value){
38-
if(value == null){
53+
static FieldValue of(Object value) {
54+
if (value == null) {
3955
return NullValue.getInstance();
4056
}
41-
if (value instanceof String string) {
42-
return new StringValue(string);
43-
} else if (value instanceof Integer integer) {
44-
return new IntegerValue(integer);
45-
} else if (value instanceof Long longValue) {
46-
return new LongValue(longValue);
47-
} else if (value instanceof Double doubleValue) {
48-
return new DoubleValue(doubleValue);
49-
} else if (value instanceof Boolean booleanValue) {
50-
return Boolean.TRUE.equals(booleanValue) ? BooleanValue.trueInstance() : BooleanValue.falseInstance();
51-
} else if (value instanceof Number) {
52-
return new NumberValue(value.toString());
53-
} else if (value instanceof byte[]) {
54-
return new BinaryValue((byte[]) value);
55-
} else if (value instanceof Iterable<?> values) {
56-
return createList(values);
57-
} else if (value.getClass().isArray()) {
58-
return createArray(value);
59-
} else if (value instanceof Map<?,?>) {
60-
return entries((Map<String, ?>) value);
61-
}else if (value instanceof FieldValue) {
62-
return (FieldValue) value;
63-
} else if(value instanceof Enum<?> enumeration) {
64-
return new StringValue(enumeration.name());
57+
58+
for (FieldValueMapper mapper : MAPPERS) {
59+
if (mapper.supports(value)) {
60+
return mapper.toFieldValue(value);
61+
}
6562
}
66-
throw new UnsupportedOperationException("There is not support to: " + value.getClass());
63+
64+
throw new UnsupportedOperationException("Unsupported value type: " + value.getClass());
6765
}
6866

69-
Object toObject(FieldValue value) {
70-
if (value.isNull()) {
67+
public static Object toJavaObject(FieldValue value) {
68+
if (value == null || value.isNull()) {
7169
return null;
7270
}
71+
7372
return switch (value.getType()) {
7473
case STRING -> value.asString();
7574
case INTEGER -> value.asInteger();
@@ -80,31 +79,153 @@ Object toObject(FieldValue value) {
8079
case BINARY -> value.asBinary();
8180
case ARRAY -> value.asArray();
8281
case MAP -> value.asMap();
83-
default -> throw new UnsupportedOperationException("There is not support to: " + value.getType());
82+
default -> throw new UnsupportedOperationException("Unsupported FieldValue type: " + value.getType());
8483
};
8584
}
86-
private MapValue entries(Map<String, ?> value) {
87-
MapValue mapValue = new MapValue();
88-
for (Map.Entry<String, ?> entry : value.entrySet()) {
89-
mapValue.put(entry.getKey(), of(entry.getValue()));
85+
86+
private interface FieldValueMapper {
87+
boolean supports(Object value);
88+
FieldValue toFieldValue(Object value);
89+
}
90+
91+
private static final class FieldValuePassthroughMapper implements FieldValueMapper {
92+
public boolean supports(Object value) {
93+
return value instanceof FieldValue;
94+
}
95+
96+
public FieldValue toFieldValue(Object value) {
97+
return (FieldValue) value;
98+
}
99+
}
100+
101+
private static final class StringValueMapper implements FieldValueMapper {
102+
public boolean supports(Object value) {
103+
return value instanceof String;
104+
}
105+
106+
public FieldValue toFieldValue(Object value) {
107+
return new StringValue((String) value);
108+
}
109+
}
110+
111+
private static final class IntegerValueMapper implements FieldValueMapper {
112+
public boolean supports(Object value) {
113+
return value instanceof Integer;
114+
}
115+
116+
public FieldValue toFieldValue(Object value) {
117+
return new IntegerValue((Integer) value);
118+
}
119+
}
120+
121+
private static final class LongValueMapper implements FieldValueMapper {
122+
public boolean supports(Object value) {
123+
return value instanceof Long;
124+
}
125+
126+
public FieldValue toFieldValue(Object value) {
127+
return new LongValue((Long) value);
128+
}
129+
}
130+
131+
private static final class DoubleValueMapper implements FieldValueMapper {
132+
public boolean supports(Object value) {
133+
return value instanceof Double;
134+
}
135+
136+
public FieldValue toFieldValue(Object value) {
137+
return new DoubleValue((Double) value);
138+
}
139+
}
140+
141+
private static final class BooleanValueMapper implements FieldValueMapper {
142+
public boolean supports(Object value) {
143+
return value instanceof Boolean;
144+
}
145+
146+
public FieldValue toFieldValue(Object value) {
147+
return Boolean.TRUE.equals(value)
148+
? BooleanValue.trueInstance()
149+
: BooleanValue.falseInstance();
150+
}
151+
}
152+
153+
private static final class NumberValueMapper implements FieldValueMapper {
154+
public boolean supports(Object value) {
155+
return value instanceof Number &&
156+
!(value instanceof Integer || value instanceof Long || value instanceof Double);
157+
}
158+
159+
public FieldValue toFieldValue(Object value) {
160+
return new NumberValue(value.toString());
161+
}
162+
}
163+
164+
private static final class ByteArrayValueMapper implements FieldValueMapper {
165+
public boolean supports(Object value) {
166+
return value instanceof byte[];
167+
}
168+
169+
public FieldValue toFieldValue(Object value) {
170+
return new BinaryValue((byte[]) value);
171+
}
172+
}
173+
174+
private static final class EnumValueMapper implements FieldValueMapper {
175+
public boolean supports(Object value) {
176+
return value instanceof Enum<?>;
177+
}
178+
179+
public FieldValue toFieldValue(Object value) {
180+
return new StringValue(((Enum<?>) value).name());
181+
}
182+
}
183+
184+
private static final class IterableValueMapper implements FieldValueMapper {
185+
public boolean supports(Object value) {
186+
return value instanceof Iterable<?>;
187+
}
188+
189+
public FieldValue toFieldValue(Object value) {
190+
ArrayValue array = new ArrayValue();
191+
for (Object item : (Iterable<?>) value) {
192+
array.add(FieldValueConverter.toFieldValue(item));
193+
}
194+
return array;
90195
}
91-
return mapValue;
92196
}
93197

94-
private ArrayValue createArray(Object value) {
95-
var arrayValue = new ArrayValue();
96-
int length = Array.getLength(value);
97-
for (int i = 0; i < length; i ++) {
98-
arrayValue.add(of(Array.get(value, i)));
198+
private static final class ArrayValueMapper implements FieldValueMapper {
199+
public boolean supports(Object value) {
200+
return value != null && value.getClass().isArray();
201+
}
202+
203+
public FieldValue toFieldValue(Object value) {
204+
int length = Array.getLength(value);
205+
ArrayValue array = new ArrayValue();
206+
for (int i = 0; i < length; i++) {
207+
array.add(FieldValueConverter.toFieldValue(Array.get(value, i)));
208+
}
209+
return array;
99210
}
100-
return arrayValue;
101211
}
102212

103-
private ArrayValue createList(Iterable<?> values) {
104-
var arrayValue = new ArrayValue();
105-
for (Object value : values) {
106-
arrayValue.add(of(value));
213+
private static final class MapValueMapper implements FieldValueMapper {
214+
public boolean supports(Object value) {
215+
return value instanceof Map<?, ?>;
216+
}
217+
218+
public FieldValue toFieldValue(Object value) {
219+
Map<?, ?> map = (Map<?, ?>) value;
220+
MapValue mapValue = new MapValue();
221+
for (Map.Entry<?, ?> entry : map.entrySet()) {
222+
Object key = entry.getKey();
223+
if (!(key instanceof String keyStr)) {
224+
throw new IllegalArgumentException("Map keys must be strings. Found: " + key);
225+
}
226+
mapValue.put(keyStr, FieldValueConverter.toFieldValue(entry.getValue()));
227+
}
228+
return mapValue;
107229
}
108-
return arrayValue;
109230
}
110231
}

0 commit comments

Comments
 (0)