27
27
import oracle .nosql .driver .values .StringValue ;
28
28
29
29
import java .lang .reflect .Array ;
30
+ import java .util .List ;
30
31
import java .util .Map ;
31
32
32
- 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
+ );
33
48
34
- INSTANCE ;
49
+ private FieldValueConverter () {
50
+ throw new AssertionError ("Utility class" );
51
+ }
35
52
36
- FieldValue of (Object value ){
37
- if (value == null ){
53
+ static FieldValue of (Object value ) {
54
+ if (value == null ) {
38
55
return NullValue .getInstance ();
39
56
}
40
- if (value instanceof String string ) {
41
- return new StringValue (string );
42
- } else if (value instanceof Integer integer ) {
43
- return new IntegerValue (integer );
44
- } else if (value instanceof Long longValue ) {
45
- return new LongValue (longValue );
46
- } else if (value instanceof Double doubleValue ) {
47
- return new DoubleValue (doubleValue );
48
- } else if (value instanceof Boolean booleanValue ) {
49
- return Boolean .TRUE .equals (booleanValue ) ? BooleanValue .trueInstance () : BooleanValue .falseInstance ();
50
- } else if (value instanceof Number ) {
51
- return new NumberValue (value .toString ());
52
- } else if (value instanceof byte []) {
53
- return new BinaryValue ((byte []) value );
54
- } else if (value instanceof Iterable <?> values ) {
55
- return createList (values );
56
- } else if (value .getClass ().isArray ()) {
57
- return createArray (value );
58
- } else if (value instanceof Map <?,?>) {
59
- return entries ((Map <String , ?>) value );
60
- }else if (value instanceof FieldValue ) {
61
- return (FieldValue ) value ;
62
- } else {
63
- throw new UnsupportedOperationException ("There is not support to: " + value .getClass ());
57
+
58
+ for (FieldValueMapper mapper : MAPPERS ) {
59
+ if (mapper .supports (value )) {
60
+ return mapper .toFieldValue (value );
61
+ }
64
62
}
63
+
64
+ throw new UnsupportedOperationException ("Unsupported value type: " + value .getClass ());
65
65
}
66
66
67
- Object toObject (FieldValue value ) {
68
- if (value .isNull ()) {
67
+ public static Object toJavaObject (FieldValue value ) {
68
+ if (value == null || value .isNull ()) {
69
69
return null ;
70
70
}
71
+
71
72
return switch (value .getType ()) {
72
73
case STRING -> value .asString ();
73
74
case INTEGER -> value .asInteger ();
@@ -78,31 +79,153 @@ Object toObject(FieldValue value) {
78
79
case BINARY -> value .asBinary ();
79
80
case ARRAY -> value .asArray ();
80
81
case MAP -> value .asMap ();
81
- default -> throw new UnsupportedOperationException ("There is not support to : " + value .getType ());
82
+ default -> throw new UnsupportedOperationException ("Unsupported FieldValue type : " + value .getType ());
82
83
};
83
84
}
84
- private MapValue entries (Map <String , ?> value ) {
85
- MapValue mapValue = new MapValue ();
86
- for (Map .Entry <String , ?> entry : value .entrySet ()) {
87
- 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 .of (item ));
193
+ }
194
+ return array ;
88
195
}
89
- return mapValue ;
90
196
}
91
197
92
- private ArrayValue createArray (Object value ) {
93
- var arrayValue = new ArrayValue ();
94
- int length = Array .getLength (value );
95
- for (int i = 0 ; i < length ; i ++) {
96
- 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 .of (Array .get (value , i )));
208
+ }
209
+ return array ;
97
210
}
98
- return arrayValue ;
99
211
}
100
212
101
- private ArrayValue createList (Iterable <?> values ) {
102
- var arrayValue = new ArrayValue ();
103
- for (Object value : values ) {
104
- 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 .of (entry .getValue ()));
227
+ }
228
+ return mapValue ;
105
229
}
106
- return arrayValue ;
107
230
}
108
231
}
0 commit comments