77import org .enso .table .data .column .operation .StorageIterators ;
88import org .enso .table .data .column .operation .map .BinaryMapOperation ;
99import org .enso .table .data .column .operation .map .MapOperationProblemAggregator ;
10- import org .enso .table .data .column .storage .*;
10+ import org .enso .table .data .column .storage .ColumnDoubleStorage ;
11+ import org .enso .table .data .column .storage .ColumnLongStorage ;
12+ import org .enso .table .data .column .storage .ColumnStorage ;
13+ import org .enso .table .data .column .storage .ColumnStorageFacade ;
14+ import org .enso .table .data .column .storage .Storage ;
1115import org .enso .table .data .column .storage .numeric .BigDecimalStorage ;
1216import org .enso .table .data .column .storage .numeric .BigIntegerStorage ;
1317import org .enso .table .data .column .storage .numeric .DoubleStorage ;
2024/** An operation expecting a numeric argument and returning a numeric column. */
2125public abstract class NumericBinaryOpImplementation <T extends Number , I extends Storage <? super T >>
2226 extends BinaryMapOperation <T , I > {
27+ public static ColumnStorage <BigDecimal > asBigDecimal (ColumnStorage <BigInteger > storage ) {
28+ return new ColumnStorageFacade <>(storage , BigDecimal ::new );
29+ }
30+
31+ public static ColumnStorage <BigDecimal > asBigDecimal (ColumnDoubleStorage storage ) {
32+ return new ColumnStorageFacade <>(storage , BigDecimal ::valueOf );
33+ }
34+
35+ public static ColumnStorage <BigDecimal > asBigDecimal (ColumnLongStorage storage ) {
36+ return new ColumnStorageFacade <>(storage , BigDecimal ::valueOf );
37+ }
38+
39+ public static ColumnStorage <BigInteger > asBigInteger (ColumnLongStorage storage ) {
40+ return new ColumnStorageFacade <>(storage , BigInteger ::valueOf );
41+ }
2342
2443 protected abstract double doDouble (
2544 double a , double b , long ix , MapOperationProblemAggregator problemAggregator );
@@ -76,20 +95,17 @@ public Storage<?> runBinaryMap(
7695 case BigDecimalStorage s -> runBigDecimalMap (
7796 s , BigDecimal .valueOf (argAsDouble ), problemAggregator );
7897 case BigIntegerStorage s -> runDoubleMap (
79- new DoubleStorageFacade <>( s , BigInteger :: doubleValue ), argAsDouble , problemAggregator );
98+ DoubleStorageFacade . forBigInteger ( s ), argAsDouble , problemAggregator );
8099 case ColumnDoubleStorage s -> runDoubleMap (s , argAsDouble , problemAggregator );
81100 case ColumnLongStorage s -> runDoubleLongMap (s , argAsDouble , problemAggregator );
82101 default -> throw newUnsupported (storage );
83102 };
84103 } else if (arg instanceof BigDecimal bd ) {
85104 return switch (storage ) {
86105 case BigDecimalStorage s -> runBigDecimalMap (s , bd , problemAggregator );
87- case BigIntegerStorage s -> runBigDecimalMap (
88- new ColumnStorageFacade <>(s , BigDecimal ::new ), bd , problemAggregator );
89- case ColumnDoubleStorage s -> runBigDecimalMap (
90- new ColumnStorageFacade <>(s , BigDecimal ::valueOf ), bd , problemAggregator );
91- case ColumnLongStorage s -> runBigDecimalMap (
92- new ColumnStorageFacade <>(s , BigDecimal ::valueOf ), bd , problemAggregator );
106+ case BigIntegerStorage s -> runBigDecimalMap (asBigDecimal (s ), bd , problemAggregator );
107+ case ColumnDoubleStorage s -> runBigDecimalMap (asBigDecimal (s ), bd , problemAggregator );
108+ case ColumnLongStorage s -> runBigDecimalMap (asBigDecimal (s ), bd , problemAggregator );
93109 default -> throw newUnsupported (storage );
94110 };
95111 } else {
@@ -102,46 +118,38 @@ public Storage<? extends Number> runZip(
102118 I storage , Storage <?> arg , MapOperationProblemAggregator problemAggregator ) {
103119 if (storage instanceof ColumnDoubleStorage lhs ) {
104120 return switch (arg ) {
105- case BigDecimalStorage rhs -> runBigDecimalZip (
106- new ColumnStorageFacade <>(lhs , BigDecimal ::valueOf ), rhs , problemAggregator );
121+ case BigDecimalStorage rhs -> runBigDecimalZip (asBigDecimal (lhs ), rhs , problemAggregator );
107122 case BigIntegerStorage rhs -> runDoubleZip (
108- lhs , new DoubleStorageFacade <> (rhs , BigInteger :: doubleValue ), problemAggregator );
123+ lhs , DoubleStorageFacade . forBigInteger (rhs ), problemAggregator );
109124 case ColumnDoubleStorage rhs -> runDoubleZip (lhs , rhs , problemAggregator );
110125 case ColumnLongStorage rhs -> runDoubleZip (
111- lhs , new DoubleStorageFacade <> (rhs , Long :: doubleValue ), problemAggregator );
126+ lhs , DoubleStorageFacade . forLong (rhs ), problemAggregator );
112127 default -> throw newUnsupported (arg );
113128 };
114129 } else if (storage instanceof ColumnLongStorage lhs ) {
115130 return switch (arg ) {
116- case BigDecimalStorage rhs -> runBigDecimalZip (
117- new ColumnStorageFacade <>(lhs , BigDecimal ::valueOf ), rhs , problemAggregator );
118- case BigIntegerStorage rhs -> runBigIntegerZip (
119- new ColumnStorageFacade <>(lhs , BigInteger ::valueOf ), rhs , problemAggregator );
131+ case BigDecimalStorage rhs -> runBigDecimalZip (asBigDecimal (lhs ), rhs , problemAggregator );
132+ case BigIntegerStorage rhs -> runBigIntegerZip (asBigInteger (lhs ), rhs , problemAggregator );
120133 case ColumnDoubleStorage rhs -> runDoubleZip (
121- new DoubleStorageFacade <> (lhs , Long :: doubleValue ), rhs , problemAggregator );
134+ DoubleStorageFacade . forLong (lhs ), rhs , problemAggregator );
122135 case ColumnLongStorage rhs -> runLongZip (lhs , rhs , problemAggregator );
123136 default -> throw newUnsupported (arg );
124137 };
125138 } else if (storage instanceof BigIntegerStorage lhs ) {
126139 return switch (arg ) {
127- case BigDecimalStorage rhs -> runBigDecimalZip (
128- new ColumnStorageFacade <>(lhs , BigDecimal ::new ), rhs , problemAggregator );
140+ case BigDecimalStorage rhs -> runBigDecimalZip (asBigDecimal (lhs ), rhs , problemAggregator );
129141 case BigIntegerStorage rhs -> runBigIntegerZip (lhs , rhs , problemAggregator );
130142 case ColumnDoubleStorage rhs -> runDoubleZip (
131- new DoubleStorageFacade <>(lhs , BigInteger ::doubleValue ), rhs , problemAggregator );
132- case ColumnLongStorage rhs -> runBigIntegerZip (
133- lhs , new ColumnStorageFacade <>(rhs , BigInteger ::valueOf ), problemAggregator );
143+ DoubleStorageFacade .forBigInteger (lhs ), rhs , problemAggregator );
144+ case ColumnLongStorage rhs -> runBigIntegerZip (lhs , asBigInteger (rhs ), problemAggregator );
134145 default -> throw newUnsupported (arg );
135146 };
136147 } else if (storage instanceof BigDecimalStorage lhs ) {
137148 return switch (arg ) {
138149 case BigDecimalStorage rhs -> runBigDecimalZip (lhs , rhs , problemAggregator );
139- case BigIntegerStorage rhs -> runBigDecimalZip (
140- lhs , new ColumnStorageFacade <>(rhs , BigDecimal ::new ), problemAggregator );
141- case ColumnDoubleStorage rhs -> runBigDecimalZip (
142- lhs , new ColumnStorageFacade <>(rhs , BigDecimal ::valueOf ), problemAggregator );
143- case ColumnLongStorage rhs -> runBigDecimalZip (
144- lhs , new ColumnStorageFacade <>(rhs , BigDecimal ::valueOf ), problemAggregator );
150+ case BigIntegerStorage rhs -> runBigDecimalZip (lhs , asBigDecimal (rhs ), problemAggregator );
151+ case ColumnDoubleStorage rhs -> runBigDecimalZip (lhs , asBigDecimal (rhs ), problemAggregator );
152+ case ColumnLongStorage rhs -> runBigDecimalZip (lhs , asBigDecimal (rhs ), problemAggregator );
145153 default -> throw newUnsupported (arg );
146154 };
147155 } else {
@@ -155,8 +163,7 @@ private static Storage<? extends Number> allNullStorageOfSameType(Storage<?> sto
155163 case BigIntegerStorage s -> BigIntegerStorage .makeEmpty (storage .getSize ());
156164 case BigDecimalStorage s -> BigDecimalStorage .makeEmpty (storage .getSize ());
157165 case ColumnDoubleStorage s -> DoubleStorage .makeEmpty (storage .getSize ());
158- default -> throw new IllegalStateException (
159- "Unsupported storage: " + storage .getClass ().getCanonicalName ());
166+ default -> throw newUnsupported (storage );
160167 };
161168 }
162169
0 commit comments