@@ -347,6 +347,11 @@ void throwExceptionAboutNumpyVersion(int row_index, const string &value, const s
347347 }
348348}
349349
350+ static inline void createAllNullVector (VectorSP &ddbVec, DATA_TYPE type, INDEX size, int exparam=0 ) {
351+ ddbVec = Util::createVector (type, size, size, true , exparam);
352+ ddbVec->fill (0 , size, Constant::void_);
353+ }
354+
350355bool addBoolVector (const py::array &pyVec, size_t size, size_t offset, char nullValue, const Type &type,
351356 std::function<void (char *, int )> f, const TableVectorInfo &info) {
352357 int bufsize = std::min (65535 , (int )size);
@@ -1145,35 +1150,35 @@ ConstantSP toDolphinDB_NDArray(py::array obj, Type typeIndicator, const CHILD_VE
11451150 switch (typeInfer) {
11461151 case DT_BOOL:
11471152 case DT_CHAR: {
1148- py::array_t <int8_t > series_array = py::cast<py::array_t <int8_t >>(obj);
1153+ py::array_t <int8_t > series_array = py::cast<py::array_t <int8_t , py::array::f_style | py::array::forcecast >>(obj);
11491154 size_t size = series_array.size ();
11501155 ddbVec = Util::createVector (typeInfer, 0 , size);
11511156 ddbVec->appendChar (reinterpret_cast <char *>(const_cast <int8_t *>(series_array.data ())), size);
11521157 break ;
11531158 }
11541159 case DT_SHORT: {
1155- py::array_t <int16_t > series_array = py::cast<py::array_t <int16_t >>(obj);
1160+ py::array_t <int16_t > series_array = py::cast<py::array_t <int16_t , py::array::f_style | py::array::forcecast >>(obj);
11561161 size_t size = series_array.size ();
11571162 ddbVec = Util::createVector (typeInfer, 0 , size);
11581163 ddbVec->appendShort (reinterpret_cast <short *>(const_cast <int16_t *>(series_array.data ())), size);
11591164 break ;
11601165 }
11611166 case DT_INT: {
1162- py::array_t <int32_t > series_array = py::cast<py::array_t <int32_t >>(obj);
1167+ py::array_t <int32_t > series_array = py::cast<py::array_t <int32_t , py::array::f_style | py::array::forcecast >>(obj);
11631168 size_t size = series_array.size ();
11641169 ddbVec = Util::createVector (typeInfer, 0 , size);
11651170 ddbVec->appendInt (reinterpret_cast <int *>(const_cast <int32_t *>(series_array.data ())), size);
11661171 break ;
11671172 }
11681173 case DT_LONG: {
1169- py::array_t <int64_t > series_array = py::cast<py::array_t <int64_t >>(obj);
1174+ py::array_t <int64_t > series_array = py::cast<py::array_t <int64_t , py::array::f_style | py::array::forcecast >>(obj);
11701175 size_t size = series_array.size ();
11711176 ddbVec = Util::createVector (typeInfer, 0 , size);
11721177 ddbVec->appendLong (reinterpret_cast <long long *>(const_cast <int64_t *>(series_array.data ())), size);
11731178 break ;
11741179 }
11751180 case DT_MONTH: {
1176- py::array_t <int64_t > series_array = py::cast<py::array_t <int64_t >>(obj);
1181+ py::array_t <int64_t > series_array = py::cast<py::array_t <int64_t , py::array::f_style | py::array::forcecast >>(obj);
11771182 size_t size = series_array.size ();
11781183 int64_t * buf = series_array.mutable_data ();
11791184 for (int i = 0 ; i < size; ++i) {
@@ -1194,14 +1199,14 @@ ConstantSP toDolphinDB_NDArray(py::array obj, Type typeIndicator, const CHILD_VE
11941199 case DT_TIMESTAMP:
11951200 case DT_NANOTIME:
11961201 case DT_NANOTIMESTAMP: {
1197- py::array_t <int64_t > series_array = py::cast<py::array_t <int64_t >>(obj);
1202+ py::array_t <int64_t > series_array = py::cast<py::array_t <int64_t , py::array::f_style | py::array::forcecast >>(obj);
11981203 size_t size = series_array.size ();
11991204 ddbVec = Util::createVector (typeInfer, 0 , size);
12001205 ddbVec->appendLong (reinterpret_cast <long long *>(const_cast <int64_t *>(series_array.data ())), size);
12011206 break ;
12021207 }
12031208 case DT_FLOAT: {
1204- py::array_t <float_t > series_array = py::cast<py::array_t <float_t >>(obj);
1209+ py::array_t <float_t > series_array = py::cast<py::array_t <float_t , py::array::f_style | py::array::forcecast >>(obj);
12051210 size_t size = series_array.size ();
12061211 ddbVec = Util::createVector (typeInfer, 0 , size);
12071212 bool hasNull = false ;
@@ -1218,7 +1223,7 @@ ConstantSP toDolphinDB_NDArray(py::array obj, Type typeIndicator, const CHILD_VE
12181223 break ;
12191224 }
12201225 case DT_DOUBLE: {
1221- py::array_t <double_t > series_array = py::cast<py::array_t <double_t >>(obj);
1226+ py::array_t <double_t > series_array = py::cast<py::array_t <double_t , py::array::f_style | py::array::forcecast >>(obj);
12221227 size_t size = series_array.size ();
12231228 ddbVec = Util::createVector (typeInfer, 0 , size);
12241229 bool hasNull = false ;
@@ -1304,8 +1309,8 @@ ConstantSP toDolphinDB_NDArray(py::array obj, Type typeIndicator, const CHILD_VE
13041309 }
13051310 if (all_Null) {
13061311 DLOG (" nullType: " , Util::getDataTypeString (nullType.first ), nullType.second );
1307- ddbVec = Util::createVector ( typeInfer == DT_UNK || typeInfer == DT_OBJECT ? DT_DOUBLE : typeInfer, size, size) ;
1308- ddbVec-> fill ( 0 , size, Constant::void_ );
1312+ DATA_TYPE finalType = typeInfer == DT_UNK || typeInfer == DT_OBJECT ? DT_DOUBLE : typeInfer;
1313+ createAllNullVector (ddbVec, finalType, size );
13091314 return ddbVec;
13101315 }
13111316 py::array &series_array = obj;
@@ -1444,8 +1449,7 @@ ConstantSP toDolphinDB_NDArray(py::array obj, Type typeIndicator, const CHILD_VE
14441449 }
14451450 }
14461451 if (index == size) { // All None
1447- ddbVec = Util::createVector (typeInfer, size, size, true , 0 );
1448- ddbVec->fill (0 , size, Constant::void_);
1452+ createAllNullVector (ddbVec, typeInfer, size, 0 );
14491453 break ;
14501454 }
14511455 if (exparam != -1 ) { // Infer exparam
@@ -1535,8 +1539,8 @@ toDolphinDB_Vector_TupleOrList(T obj,
15351539 typeIndicator = nullType;
15361540 }
15371541 if (all_Null) {
1538- ddbVec = Util::createVector ( typeInfer == DT_UNK ? DT_DOUBLE : typeInfer, size, size) ;
1539- ddbVec-> fill ( 0 , size, Constant::void_ );
1542+ DATA_TYPE finalType = typeInfer == DT_UNK ? DT_DOUBLE : typeInfer;
1543+ createAllNullVector (ddbVec, finalType, size );
15401544 return ddbVec;
15411545 }
15421546 DLOG (" typeInfer: " , typeInfer);
@@ -2009,28 +2013,28 @@ ConstantSP toDolphinDB_Vector_SeriesOrIndex(py::object obj, Type typeIndicator,
20092013 switch (typeInfer) {
20102014 case DT_BOOL:
20112015 case DT_CHAR: {
2012- py::array_t <int8_t > series_array = py::cast<py::array_t <int8_t >>(obj);
2016+ py::array_t <int8_t > series_array = py::cast<py::array_t <int8_t , py::array::f_style | py::array::forcecast >>(obj);
20132017 size_t size = series_array.size ();
20142018 ddbVec = Util::createVector (typeInfer, 0 , size);
20152019 ddbVec->appendChar (reinterpret_cast <char *>(const_cast <int8_t *>(series_array.data ())), size);
20162020 break ;
20172021 }
20182022 case DT_SHORT: {
2019- py::array_t <int16_t > series_array = py::cast<py::array_t <int16_t >>(obj);
2023+ py::array_t <int16_t > series_array = py::cast<py::array_t <int16_t , py::array::f_style | py::array::forcecast >>(obj);
20202024 size_t size = series_array.size ();
20212025 ddbVec = Util::createVector (typeInfer, 0 , size);
20222026 ddbVec->appendShort (reinterpret_cast <short *>(const_cast <int16_t *>(series_array.data ())), size);
20232027 break ;
20242028 }
20252029 case DT_INT: {
2026- py::array_t <int32_t > series_array = py::cast<py::array_t <int32_t >>(obj);
2030+ py::array_t <int32_t > series_array = py::cast<py::array_t <int32_t , py::array::f_style | py::array::forcecast >>(obj);
20272031 size_t size = series_array.size ();
20282032 ddbVec = Util::createVector (typeInfer, 0 , size);
20292033 ddbVec->appendInt (reinterpret_cast <int *>(const_cast <int32_t *>(series_array.data ())), size);
20302034 break ;
20312035 }
20322036 case DT_LONG: {
2033- py::array_t <int64_t > series_array = py::cast<py::array_t <int64_t >>(obj);
2037+ py::array_t <int64_t > series_array = py::cast<py::array_t <int64_t , py::array::f_style | py::array::forcecast >>(obj);
20342038 size_t size = series_array.size ();
20352039 ddbVec = Util::createVector (typeInfer, 0 , size);
20362040 ddbVec->appendLong (reinterpret_cast <long long *>(const_cast <int64_t *>(series_array.data ())), size);
@@ -2049,31 +2053,31 @@ ConstantSP toDolphinDB_Vector_SeriesOrIndex(py::object obj, Type typeIndicator,
20492053 // dtype = datetime64[ns] | datetime64[s] | datetime64[ms]
20502054 // In Pandas2.0 : s -> int32 | ms -> int64, need special case
20512055 if (!DdbPythonUtil::preserved_->pd_above_2_00_ || dtype.equal (DdbPythonUtil::preserved_->npdatetime64ns_ ())) {
2052- py::array_t <int64_t > series_array = py::cast<py::array_t <int64_t >>(obj);
2056+ py::array_t <int64_t > series_array = py::cast<py::array_t <int64_t , py::array::f_style | py::array::forcecast >>(obj);
20532057 size_t size = series_array.size ();
20542058 ddbVec = Util::createVector (DT_NANOTIMESTAMP, 0 , size);
20552059 ddbVec->appendLong (reinterpret_cast <long long *>(const_cast <int64_t *>(series_array.data ())), size);
20562060 if (typeInfer != DT_NANOTIMESTAMP)
20572061 ddbVec = ddbVec->castTemporal (typeInfer);
20582062 }
20592063 else if (dtype.equal (DdbPythonUtil::preserved_->npdatetime64ms_ ())) {
2060- py::array_t <int64_t > series_array = py::cast<py::array_t <int64_t >>(obj);
2064+ py::array_t <int64_t > series_array = py::cast<py::array_t <int64_t , py::array::f_style | py::array::forcecast >>(obj);
20612065 size_t size = series_array.size ();
20622066 ddbVec = Util::createVector (DT_TIMESTAMP, 0 , size);
20632067 ddbVec->appendLong (reinterpret_cast <long long *>(const_cast <int64_t *>(series_array.data ())), size);
20642068 if (typeInfer != DT_TIMESTAMP)
20652069 ddbVec = ddbVec->castTemporal (typeInfer);
20662070 }
20672071 else if (dtype.equal (DdbPythonUtil::preserved_->npdatetime64s_ ())) {
2068- py::array_t <int64_t > series_array = py::cast<py::array_t <int64_t >>(obj);
2072+ py::array_t <int64_t > series_array = py::cast<py::array_t <int64_t , py::array::f_style | py::array::forcecast >>(obj);
20692073 size_t size = series_array.size ();
20702074 ddbVec = Util::createVector (DT_DATETIME, 0 , size);
20712075 ddbVec->appendLong (reinterpret_cast <long long *>(const_cast <int64_t *>(series_array.data ())), size);
20722076 if (typeInfer != DT_DATETIME)
20732077 ddbVec = ddbVec->castTemporal (typeInfer);
20742078 }
20752079 else if (dtype.equal (DdbPythonUtil::preserved_->npdatetime64us_ ())) {
2076- py::array_t <int64_t > series_array = py::cast<py::array_t <int64_t >>(obj);
2080+ py::array_t <int64_t > series_array = py::cast<py::array_t <int64_t , py::array::f_style | py::array::forcecast >>(obj);
20772081 size_t size = series_array.size ();
20782082 ddbVec = Util::createVector (DT_NANOTIMESTAMP, 0 , size);
20792083 processData<long long >((long long *)series_array.data (), size, [&](long long *buf, int _size) {
@@ -2088,7 +2092,7 @@ ConstantSP toDolphinDB_Vector_SeriesOrIndex(py::object obj, Type typeIndicator,
20882092 ddbVec = ddbVec->castTemporal (typeInfer);
20892093 }
20902094 else if (dtype.equal (DdbPythonUtil::preserved_->npint64_ )) {
2091- py::array_t <int64_t > series_array = py::cast<py::array_t <int64_t >>(obj);
2095+ py::array_t <int64_t > series_array = py::cast<py::array_t <int64_t , py::array::f_style | py::array::forcecast >>(obj);
20922096 size_t size = series_array.size ();
20932097 ddbVec = Util::createVector (DT_NANOTIMESTAMP, 0 , size);
20942098 ddbVec->appendLong (reinterpret_cast <long long *>(const_cast <int64_t *>(series_array.data ())), size);
@@ -2102,7 +2106,7 @@ ConstantSP toDolphinDB_Vector_SeriesOrIndex(py::object obj, Type typeIndicator,
21022106 break ;
21032107 }
21042108 case DT_FLOAT: {
2105- py::array_t <float_t > series_array = py::cast<py::array_t <float_t >>(obj);
2109+ py::array_t <float_t > series_array = py::cast<py::array_t <float_t , py::array::f_style | py::array::forcecast >>(obj);
21062110 size_t size = series_array.size ();
21072111 ddbVec = Util::createVector (typeInfer, 0 , size);
21082112 bool hasNull = false ;
@@ -2119,7 +2123,7 @@ ConstantSP toDolphinDB_Vector_SeriesOrIndex(py::object obj, Type typeIndicator,
21192123 break ;
21202124 }
21212125 case DT_DOUBLE: {
2122- py::array_t <double_t > series_array = py::cast<py::array_t <double_t >>(obj);
2126+ py::array_t <double_t > series_array = py::cast<py::array_t <double_t , py::array::f_style | py::array::forcecast >>(obj);
21232127 size_t size = series_array.size ();
21242128 ddbVec = Util::createVector (typeInfer, 0 , size);
21252129 bool hasNull = false ;
@@ -2233,10 +2237,7 @@ ConstantSP toDolphinDB_Vector_SeriesOrIndex(py::object obj, Type typeIndicator,
22332237
22342238 if (noneCounts.size () > 0 ) {
22352239 for (auto count : noneCounts) {
2236- pChildVector = Util::createVector (elemType.first , 0 , count);
2237- for (int i = 0 ; i < count; ++i) {
2238- pChildVector->append (Constant::void_);
2239- }
2240+ createAllNullVector (pChildVector, elemType.first , count);
22402241 ddbVec->append (pChildVector);
22412242 }
22422243 noneCounts.clear ();
@@ -2262,8 +2263,7 @@ ConstantSP toDolphinDB_Vector_SeriesOrIndex(py::object obj, Type typeIndicator,
22622263 }
22632264 if (noneCounts.size () > 0 ) {
22642265 for (auto count : noneCounts) {
2265- pChildVector = Util::createVector (elemType.first , 0 , count);
2266- pChildVector->fill (0 , count, Constant::void_);
2266+ createAllNullVector (pChildVector, elemType.first , count);
22672267 ddbVec->append (pChildVector);
22682268 }
22692269 noneCounts.clear ();
@@ -2431,8 +2431,7 @@ ConstantSP toDolphinDB_Vector_SeriesOrIndex(py::object obj, Type typeIndicator,
24312431 }
24322432 }
24332433 if (index == size) { // All None
2434- ddbVec = Util::createVector (typeInfer, size, size, true , 0 );
2435- ddbVec->fill (0 , size, Constant::void_);
2434+ createAllNullVector (ddbVec, typeInfer, size, 0 );
24362435 break ;
24372436 }
24382437 if (exparam != -1 ) { // Infer exparam
@@ -2499,8 +2498,7 @@ ConstantSP toDolphinDB_Vector_SeriesOrIndex(py::object obj, Type typeIndicator,
24992498 if (typeInfer == DT_UNK || typeInfer == DT_OBJECT) {
25002499 typeInfer = DT_DOUBLE;
25012500 }
2502- ddbVec = Util::createVector (typeInfer, size, size);
2503- ddbVec->fill (0 , size, Constant::void_);
2501+ createAllNullVector (ddbVec, typeInfer, size);
25042502 return ddbVec;
25052503 }
25062504 if (typeInfer == DT_ANY && options == CHILD_VECTOR_OPTION::ARRAY_VECTOR) {
@@ -2547,8 +2545,7 @@ ConstantSP toDolphinDB_Vector_SeriesOrIndex(py::object obj, Type typeIndicator,
25472545 ddbVec = Util::createArrayVector ((DATA_TYPE)(typeInfer + 64 ), 0 , size, true , typeIndicator.second == -1 ? 0 : typeIndicator.second );
25482546 if (noneCounts.size () > 0 ) {
25492547 for (auto count : noneCounts) {
2550- pChildVector = Util::createVector (typeInfer, 0 , count);
2551- pChildVector->fill (0 , count, Constant::void_);
2548+ createAllNullVector (pChildVector, typeInfer, count);
25522549 ddbVec->append (pChildVector);
25532550 }
25542551 noneCounts.clear ();
@@ -2573,8 +2570,7 @@ ConstantSP toDolphinDB_Vector_SeriesOrIndex(py::object obj, Type typeIndicator,
25732570 }
25742571 if (noneCounts.size () > 0 ) {
25752572 for (auto count : noneCounts) {
2576- pChildVector = Util::createVector (typeInfer, 0 , count);
2577- pChildVector->fill (0 , count, Constant::void_);
2573+ createAllNullVector (pChildVector, typeInfer, count);
25782574 ddbVec->append (pChildVector);
25792575 }
25802576 noneCounts.clear ();
@@ -2717,8 +2713,7 @@ ConstantSP toDolphinDB_Vector_SeriesOrIndex(py::object obj, Type typeIndicator,
27172713 }
27182714 }
27192715 if (index == size) { // All None
2720- ddbVec = Util::createVector (typeInfer, size, size, true , 0 );
2721- ddbVec->fill (0 , size, Constant::void_);
2716+ createAllNullVector (ddbVec, typeInfer, size, 0 );
27222717 break ;
27232718 }
27242719 if (exparam != -1 ) { // Infer exparam
0 commit comments