2727import  oracle .nosql .driver .values .StringValue ;
2828
2929import  java .lang .reflect .Array ;
30+ import  java .util .List ;
3031import  java .util .Map ;
3132
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+     );
3348
34-     INSTANCE ;
49+     private  FieldValueConverter () {
50+         throw  new  AssertionError ("Utility class" );
51+     }
3552
36-     FieldValue  of (Object  value ){
37-         if (value  == null ){
53+     static   FieldValue  of (Object  value )  {
54+         if   (value  == null )  {
3855            return  NullValue .getInstance ();
3956        }
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+             }
6462        }
63+ 
64+         throw  new  UnsupportedOperationException ("Unsupported value type: "  + value .getClass ());
6565    }
6666
67-     Object  toObject (FieldValue  value ) {
68-         if  (value .isNull ()) {
67+     public   static   Object  toJavaObject (FieldValue  value ) {
68+         if  (value  ==  null  ||  value .isNull ()) {
6969            return  null ;
7070        }
71+ 
7172        return  switch  (value .getType ()) {
7273            case  STRING  -> value .asString ();
7374            case  INTEGER  -> value .asInteger ();
@@ -78,31 +79,153 @@ Object toObject(FieldValue value) {
7879            case  BINARY  -> value .asBinary ();
7980            case  ARRAY  -> value .asArray ();
8081            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 ());
8283        };
8384    }
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 ;
88195        }
89-         return  mapValue ;
90196    }
91197
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 ;
97210        }
98-         return  arrayValue ;
99211    }
100212
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 ;
105229        }
106-         return  arrayValue ;
107230    }
108231}
0 commit comments