1 module hunt.database.base.impl.RowImpl;
2 
3 import hunt.database.base.Numeric;
4 import hunt.database.base.impl.ArrayTuple;
5 import hunt.database.base.impl.RowDesc;
6 import hunt.database.base.impl.RowInternal;
7 
8 import hunt.collection.List;
9 import hunt.Exceptions;
10 import hunt.math.BigDecimal;
11 
12 import std.algorithm;
13 import std.string;
14 import std.variant;
15 
16 class RowImpl : ArrayTuple, RowInternal {
17 
18     // Linked list
19     protected RowInternal next;
20     protected RowDesc desc;
21 
22     this(RowDesc desc) {
23         super(cast(int)desc.columnNames().length);
24         this.desc = desc;
25     }
26 
27     this(RowImpl row) {
28         super(row);
29         this.desc = row.desc;
30     }
31 
32     override
33     string getColumnName(int pos) {
34         string[] columnNames = desc.columnNames();
35         return pos < 0 || cast(int)columnNames.length < pos + 1 ? null : columnNames[pos];
36     }
37 
38     override
39     int getColumnIndex(string name) {
40         if (name.empty()) {
41             throw new NullPointerException(name);
42         }
43 
44         return desc.columnIndex(name);
45         // return cast(int)desc.columnNames().countUntil(name);
46     }
47 
48     // override
49     // T get(T)(TypeInfo type, int pos) {
50     //     if (type == typeid(bool)) {
51     //         return type.cast(getBoolean(pos));
52     //     } else if (type == Short.class) {
53     //         return type.cast(getShort(pos));
54     //     } else if (type == Integer.class) {
55     //         return type.cast(getInteger(pos));
56     //     } else if (type == Long.class) {
57     //         return type.cast(getLong(pos));
58     //     } else if (type == Float.class) {
59     //         return type.cast(getFloat(pos));
60     //     } else if (type == Double.class) {
61     //         return type.cast(getDouble(pos));
62     //     } else if (type == Character.class) {
63     //         return type.cast(getChar(pos));
64     //     } else if (type == Numeric.class) {
65     //         return type.cast(getNumeric(pos));
66     //     } else if (type == string.class) {
67     //         return type.cast(getString(pos));
68     //     } else if (type == Buffer.class) {
69     //         return type.cast(getBuffer(pos));
70     //     } else if (type == UUID.class) {
71     //         return type.cast(getUUID(pos));
72     //     } else if (type == LocalDate.class) {
73     //         return type.cast(getLocalDate(pos));
74     //     } else if (type == LocalTime.class) {
75     //         return type.cast(getLocalTime(pos));
76     //     } else if (type == OffsetTime.class) {
77     //         return type.cast(getOffsetTime(pos));
78     //     } else if (type == LocalDateTime.class) {
79     //         return type.cast(getLocalDateTime(pos));
80     //     } else if (type == OffsetDateTime.class) {
81     //         return type.cast(getOffsetDateTime(pos));
82     //     } else if (type == Interval.class) {
83     //         return type.cast(getInterval(pos));
84     //     } else if (type == Point.class) {
85     //         return type.cast(getPoint(pos));
86     //     } else if (type == Line.class) {
87     //         return type.cast(getLine(pos));
88     //     } else if (type == LineSegment.class) {
89     //         return type.cast(getLineSegment(pos));
90     //     } else if (type == Path.class) {
91     //         return type.cast(getPath(pos));
92     //     } else if (type == Polygon.class) {
93     //         return type.cast(getPolygon(pos));
94     //     } else if (type == Circle.class) {
95     //         return type.cast(getCircle(pos));
96     //     } else if (type == Box.class) {
97     //         return type.cast(getBox(pos));
98     //     } else if (type == JsonObject.class) {
99     //         return type.cast(getJson(pos));
100     //     } else if (type == JsonArray.class) {
101     //         return type.cast(getJson(pos));
102     //     } else if (type == Object.class) {
103     //         return type.cast(get(pos));
104     //     }
105     //     throw new UnsupportedOperationException("Unsupported type " ~ type.getName());
106     // }
107 
108     // override
109     // <T> T[] getValues(Class!(T) type, int pos) {
110     //     if (type == Boolean.class) {
111     //         return (T[]) getBooleanArray(pos);
112     //     } else if (type == Short.class) {
113     //         return (T[]) getShortArray(pos);
114     //     } else if (type == Integer.class) {
115     //         return (T[]) getIntegerArray(pos);
116     //     } else if (type == Long.class) {
117     //         return (T[]) getLongArray(pos);
118     //     } else if (type == Float.class) {
119     //         return (T[]) getFloatArray(pos);
120     //     } else if (type == Double.class) {
121     //         return (T[]) getDoubleArray(pos);
122     //     } else if (type == Character.class) {
123     //         return (T[]) getCharArray(pos);
124     //     } else if (type == string.class) {
125     //         return (T[]) getStringArray(pos);
126     //     } else if (type == Buffer.class) {
127     //         return (T[]) getBufferArray(pos);
128     //     } else if (type == UUID.class) {
129     //         return (T[]) getUUIDArray(pos);
130     //     } else if (type == LocalDate.class) {
131     //         return (T[]) getLocalDateArray(pos);
132     //     } else if (type == LocalTime.class) {
133     //         return (T[]) getLocalTimeArray(pos);
134     //     } else if (type == OffsetTime.class) {
135     //         return (T[]) getOffsetTimeArray(pos);
136     //     } else if (type == LocalDateTime.class) {
137     //         return (T[]) getLocalDateTimeArray(pos);
138     //     } else if (type == OffsetDateTime.class) {
139     //         return (T[]) getOffsetDateTimeArray(pos);
140     //     } else if (type == Interval.class) {
141     //         return (T[]) getIntervalArray(pos);
142     //     } else if (type == Numeric.class) {
143     //         return (T[]) getNumericArray(pos);
144     //     } else if (type == Point.class) {
145     //         return (T[]) getPointArray(pos);
146     //     } else if (type == Line.class) {
147     //         return (T[]) getLineArray(pos);
148     //     } else if (type == LineSegment.class) {
149     //         return (T[]) getLineSegmentArray(pos);
150     //     } else if (type == Path.class) {
151     //         return (T[]) getPathArray(pos);
152     //     } else if (type == Polygon.class) {
153     //         return (T[]) getPolygonArray(pos);
154     //     } else if (type == Circle.class) {
155     //         return (T[]) getCircleArray(pos);
156     //     } else if (type == Interval.class) {
157     //         return (T[]) getIntervalArray(pos);
158     //     } else if (type == Box.class) {
159     //         return (T[]) getBoxArray(pos);
160     //     } else if (type == Object.class) {
161     //         return (T[]) getJsonArray(pos);
162     //     }
163     //     throw new UnsupportedOperationException("Unsupported type " ~ type.getName());
164     // }
165 
166     override
167     bool getBoolean(string name) {
168         int pos = desc.columnIndex(name);
169         if(pos == -1)
170             throw new Exception("Not exsited field: " ~ name);
171         else
172             return getBoolean(pos);
173         // return pos == -1 ? null : getBoolean(pos);
174     }
175     alias getBoolean = ArrayTuple.getBoolean;
176 
177     // override
178     Variant getValue(string name) {
179         int pos = desc.columnIndex(name);
180         return pos == -1 ? Variant() : getValue(pos);
181     }
182     alias getValue = ArrayTuple.getValue;
183 
184     override
185     short getShort(string name) {
186         int pos = desc.columnIndex(name);
187         if(pos == -1)
188             throw new Exception("Not exsited field: " ~ name);
189         else
190             return getShort(pos);
191     }
192     alias getShort = ArrayTuple.getShort;
193 
194     override
195     int getInteger(string name) {
196         int pos = desc.columnIndex(name);
197 
198         if(pos == -1)
199             throw new Exception("Not exsited field: " ~ name);
200         else
201             return getInteger(pos);
202     }
203     alias getInteger = ArrayTuple.getInteger;
204 
205     override
206     long getLong(string name) {
207         int pos = desc.columnIndex(name);
208         if(pos == -1)
209             throw new Exception("Not exsited field: " ~ name);
210         else
211             return getLong(pos);
212         // return pos == -1 ? null : getLong(pos);
213     }
214     alias getLong = ArrayTuple.getLong;
215 
216     override
217     float getFloat(string name) {
218         int pos = desc.columnIndex(name);
219         if(pos == -1)
220             throw new Exception("Not exsited field: " ~ name);
221         else
222             return getFloat(pos);
223         // return pos == -1 ? null : getFloat(pos);
224     }
225     alias getFloat = ArrayTuple.getFloat;
226 
227     override
228     double getDouble(string name) {
229         int pos = desc.columnIndex(name);
230         if(pos == -1)
231             throw new Exception("Not exsited field: " ~ name);
232         else
233             return getDouble(pos);
234         // return pos == -1 ? null : getDouble(pos);
235     }
236     alias getDouble = ArrayTuple.getDouble;
237 
238     override
239     string getString(string name) {
240         int pos = desc.columnIndex(name);
241         if(pos == -1)
242             throw new Exception("Not exsited field: " ~ name);
243         else
244             return getString(pos);
245         // return pos == -1 ? null : getString(pos);
246     }
247     alias getString = ArrayTuple.getString;
248 
249     override
250     byte[] getBuffer(string name) {
251         int pos = desc.columnIndex(name);
252         if(pos == -1)
253             throw new Exception("Not exsited field: " ~ name);
254         else
255             return getBuffer(pos);
256         // return pos == -1 ? null : getBuffer(pos);
257     }
258     alias getBuffer = ArrayTuple.getBuffer;
259 
260     // override
261     // Temporal getTemporal(string name) {
262     //     int pos = desc.columnIndex(name);
263     //     return pos == -1 ? null : getTemporal(pos);
264     // }
265 
266     // override
267     // LocalDate getLocalDate(string name) {
268     //     int pos = desc.columnIndex(name);
269     //     return pos == -1 ? null : getLocalDate(pos);
270     // }
271 
272     // override
273     // LocalTime getLocalTime(string name) {
274     //     int pos = desc.columnIndex(name);
275     //     return pos == -1 ? null : getLocalTime(pos);
276     // }
277 
278     // override
279     // LocalDateTime getLocalDateTime(string name) {
280     //     int pos = desc.columnIndex(name);
281     //     return pos == -1 ? null : getLocalDateTime(pos);
282     // }
283 
284     // override
285     // OffsetTime getOffsetTime(string name) {
286     //     int pos = desc.columnIndex(name);
287     //     return pos == -1 ? null : getOffsetTime(pos);
288     // }
289 
290     // override
291     // OffsetDateTime getOffsetDateTime(string name) {
292     //     int pos = desc.columnIndex(name);
293     //     return pos == -1 ? null : getOffsetDateTime(pos);
294     // }
295 
296     // override
297     // UUID getUUID(string name) {
298     //     int pos = desc.columnIndex(name);
299     //     return pos == -1 ? null : getUUID(pos);
300     // }
301 
302     // override
303     // BigDecimal getBigDecimal(string name) {
304     //     int pos = desc.columnIndex(name);
305     //     return pos == -1 ? null : getBigDecimal(pos);
306     // }
307 
308     // Numeric getNumeric(string name) {
309     //     int pos = desc.columnIndex(name);
310     //     return pos == -1 ? null : getNumeric(pos);
311     // }
312 
313     // Point getPoint(string name) {
314     //     int pos = desc.columnIndex(name);
315     //     return pos == -1 ? null : getPoint(pos);
316     // }
317 
318     // Line getLine(string name) {
319     //     int pos = desc.columnIndex(name);
320     //     return pos == -1 ? null : getLine(pos);
321     // }
322 
323     // LineSegment getLineSegment(string name) {
324     //     int pos = desc.columnIndex(name);
325     //     return pos == -1 ? null : getLineSegment(pos);
326     // }
327 
328     // Box getBox(string name) {
329     //     int pos = desc.columnIndex(name);
330     //     return pos == -1 ? null : getBox(pos);
331     // }
332 
333     // Path getPath(string name) {
334     //     int pos = desc.columnIndex(name);
335     //     return pos == -1 ? null : getPath(pos);
336     // }
337 
338     // Polygon getPolygon(string name) {
339     //     int pos = desc.columnIndex(name);
340     //     return pos == -1 ? null : getPolygon(pos);
341     // }
342 
343     // Circle getCircle(string name) {
344     //     int pos = desc.columnIndex(name);
345     //     return pos == -1 ? null : getCircle(pos);
346     // }
347 
348     // Interval getInterval(string name) {
349     //     int pos = desc.columnIndex(name);
350     //     return pos == -1 ? null : getInterval(pos);
351     // }
352 
353     // override
354     // Boolean[] getBooleanArray(string name) {
355     //     int pos = desc.columnIndex(name);
356     //     return pos == -1 ? null : getBooleanArray(pos);
357     // }
358 
359     // override
360     // Short[] getShortArray(string name) {
361     //     int pos = desc.columnIndex(name);
362     //     return pos == -1 ? null : getShortArray(pos);
363     // }
364 
365     // override
366     // Integer[] getIntegerArray(string name) {
367     //     int pos = desc.columnIndex(name);
368     //     return pos == -1 ? null : getIntegerArray(pos);
369     // }
370 
371     // override
372     // Long[] getLongArray(string name) {
373     //     int pos = desc.columnIndex(name);
374     //     return pos == -1 ? null : getLongArray(pos);
375     // }
376 
377     // override
378     // Float[] getFloatArray(string name) {
379     //     int pos = desc.columnIndex(name);
380     //     return pos == -1 ? null : getFloatArray(pos);
381     // }
382 
383     // override
384     // Double[] getDoubleArray(string name) {
385     //     int pos = desc.columnIndex(name);
386     //     return pos == -1 ? null : getDoubleArray(pos);
387     // }
388 
389     // override
390     // string[] getStringArray(string name) {
391     //     int pos = desc.columnIndex(name);
392     //     return pos == -1 ? null : getStringArray(pos);
393     // }
394 
395     // override
396     // LocalDate[] getLocalDateArray(string name) {
397     //     int pos = desc.columnIndex(name);
398     //     return pos == -1 ? null : getLocalDateArray(pos);
399     // }
400 
401     // override
402     // LocalTime[] getLocalTimeArray(string name) {
403     //     int pos = desc.columnIndex(name);
404     //     return pos == -1 ? null : getLocalTimeArray(pos);
405     // }
406 
407     // override
408     // OffsetTime[] getOffsetTimeArray(string name) {
409     //     int pos = desc.columnIndex(name);
410     //     return pos == -1 ? null : getOffsetTimeArray(pos);
411     // }
412 
413     // override
414     // LocalDateTime[] getLocalDateTimeArray(string name) {
415     //     int pos = desc.columnIndex(name);
416     //     return pos == -1 ? null : getLocalDateTimeArray(pos);
417     // }
418 
419     // override
420     // OffsetDateTime[] getOffsetDateTimeArray(string name) {
421     //     int pos = desc.columnIndex(name);
422     //     return pos == -1 ? null : getOffsetDateTimeArray(pos);
423     // }
424 
425     // override
426     // Buffer[] getBufferArray(string name) {
427     //     int pos = desc.columnIndex(name);
428     //     return pos == -1 ? null : getBufferArray(pos);
429     // }
430 
431     // override
432     // UUID[] getUUIDArray(string name) {
433     //     int pos = desc.columnIndex(name);
434     //     return pos == -1 ? null : getUUIDArray(pos);
435     // }
436 
437     // Object[] getJsonArray(string name) {
438     //     int pos = desc.columnIndex(name);
439     //     return pos == -1 ? null : getJsonArray(pos);
440     // }
441 
442     // Numeric[] getNumericArray(string name) {
443     //     int pos = desc.columnIndex(name);
444     //     return pos == -1 ? null : getNumericArray(pos);
445     // }
446 
447     // Point[] getPointArray(string name) {
448     //     int pos = desc.columnIndex(name);
449     //     return pos == -1 ? null : getPointArray(pos);
450     // }
451 
452     // Line[] getLineArray(string name) {
453     //     int pos = desc.columnIndex(name);
454     //     return pos == -1 ? null : getLineArray(pos);
455     // }
456 
457     // LineSegment[] getLineSegmentArray(string name) {
458     //     int pos = desc.columnIndex(name);
459     //     return pos == -1 ? null : getLineSegmentArray(pos);
460     // }
461 
462     // Box[] getBoxArray(string name) {
463     //     int pos = desc.columnIndex(name);
464     //     return pos == -1 ? null : getBoxArray(pos);
465     // }
466 
467     // Path[] getPathArray(string name) {
468     //     int pos = desc.columnIndex(name);
469     //     return pos == -1 ? null : getPathArray(pos);
470     // }
471 
472     // Polygon[] getPolygonArray(string name) {
473     //     int pos = desc.columnIndex(name);
474     //     return pos == -1 ? null : getPolygonArray(pos);
475     // }
476 
477     // Circle[] getCircleArray(string name) {
478     //     int pos = desc.columnIndex(name);
479     //     return pos == -1 ? null : getCircleArray(pos);
480     // }
481 
482     // Interval[] getIntervalArray(string name) {
483     //     int pos = desc.columnIndex(name);
484     //     return pos == -1 ? null : getIntervalArray(pos);
485     // }
486 
487     // Character[] getCharArray(string name) {
488     //     int pos = desc.columnIndex(name);
489     //     return pos == -1 ? null : getCharArray(pos);
490     // }
491 
492     // Character getChar(int pos) {
493     //     Object val = get(pos);
494     //     if (val instanceof Character) {
495     //         return (Character) val;
496     //     } else {
497     //         return null;
498     //     }
499     // }
500 
501     // Numeric getNumeric(int pos) {
502     //     Object val = get(pos);
503     //     if (val instanceof Numeric) {
504     //         return (Numeric) val;
505     //     } else if (val instanceof Number) {
506     //         return Numeric.parse(val.toString());
507     //     }
508     //     return null;
509     // }
510 
511     // /**
512     //  * Get a {@link io.vertx.core.json.JsonObject} or {@link io.vertx.core.json.JsonArray} value.
513     //  */
514     // Object getJson(int pos) {
515     //     Object val = get(pos);
516     //     if (val instanceof JsonObject) {
517     //         return val;
518     //     } else if (val instanceof JsonArray) {
519     //         return val;
520     //     } else {
521     //         return null;
522     //     }
523     // }
524 
525     // Point getPoint(int pos) {
526     //     Object val = get(pos);
527     //     if (val instanceof Point) {
528     //         return (Point) val;
529     //     } else {
530     //         return null;
531     //     }
532     // }
533 
534     // Line getLine(int pos) {
535     //     Object val = get(pos);
536     //     if (val instanceof Line) {
537     //         return (Line) val;
538     //     } else {
539     //         return null;
540     //     }
541     // }
542 
543     // LineSegment getLineSegment(int pos) {
544     //     Object val = get(pos);
545     //     if (val instanceof LineSegment) {
546     //         return (LineSegment) val;
547     //     } else {
548     //         return null;
549     //     }
550     // }
551 
552     // Box getBox(int pos) {
553     //     Object val = get(pos);
554     //     if (val instanceof Box) {
555     //         return (Box) val;
556     //     } else {
557     //         return null;
558     //     }
559     // }
560 
561     // Path getPath(int pos) {
562     //     Object val = get(pos);
563     //     if (val instanceof Path) {
564     //         return (Path) val;
565     //     } else {
566     //         return null;
567     //     }
568     // }
569 
570     // Polygon getPolygon(int pos) {
571     //     Object val = get(pos);
572     //     if (val instanceof Polygon) {
573     //         return (Polygon) val;
574     //     } else {
575     //         return null;
576     //     }
577     // }
578 
579     // Circle getCircle(int pos) {
580     //     Object val = get(pos);
581     //     if (val instanceof Circle) {
582     //         return (Circle) val;
583     //     } else {
584     //         return null;
585     //     }
586     // }
587 
588     // Interval getInterval(int pos) {
589     //     Object val = get(pos);
590     //     if (val instanceof Interval) {
591     //         return (Interval) val;
592     //     } else {
593     //         return null;
594     //     }
595     // }
596 
597     // Character[] getCharArray(int pos) {
598     //     Object val = get(pos);
599     //     if (val instanceof Character[]) {
600     //         return (Character[]) val;
601     //     } else {
602     //         return null;
603     //     }
604     // }
605 
606     // /**
607     //  * Get a {@code Json} array value, the {@code Json} value may be a string, number, JSON object, array, boolean or null.
608     //  */
609     // Object[] getJsonArray(int pos) {
610     //     Object val = get(pos);
611     //     if (val instanceof Object[]) {
612     //         return (Object[]) val;
613     //     } else {
614     //         return null;
615     //     }
616     // }
617 
618     // Numeric[] getNumericArray(int pos) {
619     //     Object val = get(pos);
620     //     if (val instanceof Numeric[]) {
621     //         return (Numeric[]) val;
622     //     } else {
623     //         return null;
624     //     }
625     // }
626 
627     // Point[] getPointArray(int pos) {
628     //     Object val = get(pos);
629     //     if (val instanceof Point[]) {
630     //         return (Point[]) val;
631     //     } else {
632     //         return null;
633     //     }
634     // }
635 
636     // Line[] getLineArray(int pos) {
637     //     Object val = get(pos);
638     //     if (val instanceof Line[]) {
639     //         return (Line[]) val;
640     //     } else {
641     //         return null;
642     //     }
643     // }
644 
645     // LineSegment[] getLineSegmentArray(int pos) {
646     //     Object val = get(pos);
647     //     if (val instanceof LineSegment[]) {
648     //         return (LineSegment[]) val;
649     //     } else {
650     //         return null;
651     //     }
652     // }
653 
654     // Box[] getBoxArray(int pos) {
655     //     Object val = get(pos);
656     //     if (val instanceof Box[]) {
657     //         return (Box[]) val;
658     //     } else {
659     //         return null;
660     //     }
661     // }
662 
663     // Path[] getPathArray(int pos) {
664     //     Object val = get(pos);
665     //     if (val instanceof Path[]) {
666     //         return (Path[]) val;
667     //     } else {
668     //         return null;
669     //     }
670     // }
671 
672     // Polygon[] getPolygonArray(int pos) {
673     //     Object val = get(pos);
674     //     if (val instanceof Polygon[]) {
675     //         return (Polygon[]) val;
676     //     } else {
677     //         return null;
678     //     }
679     // }
680 
681     // Circle[] getCircleArray(int pos) {
682     //     Object val = get(pos);
683     //     if (val instanceof Circle[]) {
684     //         return (Circle[]) val;
685     //     } else {
686     //         return null;
687     //     }
688     // }
689 
690     // Interval[] getIntervalArray(int pos) {
691     //     Object val = get(pos);
692     //     if (val instanceof Interval[]) {
693     //         return (Interval[]) val;
694     //     } else {
695     //         return null;
696     //     }
697     // }
698 
699     override
700     void setNext(RowInternal next) {
701         this.next = next;
702     }
703 
704     override
705     RowInternal getNext() {
706         return next;
707     }
708 }