Skip to content

Commit

Permalink
CreateFieldFromArrowSchema(): take into account GDAL:OGR:Type=DataTim…
Browse files Browse the repository at this point in the history
…e when ArrowSchema.format='u' (string)
  • Loading branch information
rouault committed Nov 7, 2024
1 parent d881e74 commit d1ac855
Show file tree
Hide file tree
Showing 2 changed files with 76 additions and 1 deletion.
52 changes: 52 additions & 0 deletions autotest/ogr/ogr_mem.py
Original file line number Diff line number Diff line change
Expand Up @@ -1022,6 +1022,58 @@ def test_ogr_mem_arrow_stream_numpy_datetime_as_string():
assert batch["datetime"][3] == b"2022-05-31T12:34:56+12:30"


###############################################################################
# Test CreateFieldFromArrowSchema() when there is a GDAL:OGR:type=DateTime
# Arrow schema metadata.


@gdaltest.enable_exceptions()
def test_ogr_mem_arrow_write_with_datetime_as_string():

src_ds = ogr.GetDriverByName("Memory").CreateDataSource("")
src_lyr = src_ds.CreateLayer("src_lyr", geom_type=ogr.wkbNone)

field = ogr.FieldDefn("dt", ogr.OFTDateTime)
src_lyr.CreateField(field)

f = ogr.Feature(src_lyr.GetLayerDefn())
src_lyr.CreateFeature(f)

f = ogr.Feature(src_lyr.GetLayerDefn())
f.SetField("dt", "2022-05-31T12:34:56.789Z")
src_lyr.CreateFeature(f)

f = ogr.Feature(src_lyr.GetLayerDefn())
f.SetField("dt", "2022-05-31T12:34:56")
src_lyr.CreateFeature(f)

f = ogr.Feature(src_lyr.GetLayerDefn())
f.SetField("dt", "2022-05-31T12:34:56+12:30")
src_lyr.CreateFeature(f)

ds = ogr.GetDriverByName("Memory").CreateDataSource("")
dst_lyr = ds.CreateLayer("dst_lyr")

stream = src_lyr.GetArrowStream(["DATETIME_AS_STRING=YES"])
schema = stream.GetSchema()

for i in range(schema.GetChildrenCount()):
dst_lyr.CreateFieldFromArrowSchema(schema.GetChild(i))

while True:
array = stream.GetNextRecordBatch()
if array is None:
break
dst_lyr.WriteArrowBatch(schema, array)

assert [f.GetField("dt") for f in dst_lyr] == [
None,
"2022/05/31 12:34:56.789+00",
"2022/05/31 12:34:56",
"2022/05/31 12:34:56+1230",
]


###############################################################################


Expand Down
25 changes: 24 additions & 1 deletion ogr/ogrsf_frmts/generic/ogrlayerarrow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6160,7 +6160,23 @@ bool OGRLayer::CreateFieldFromArrowSchemaInternal(
const auto oMetadata = OGRParseArrowMetadata(schema->metadata);
for (const auto &oIter : oMetadata)
{
if (oIter.first == MD_GDAL_OGR_ALTERNATIVE_NAME)
if (oIter.first == MD_GDAL_OGR_TYPE)
{
const auto &osType = oIter.second;
for (auto eType = OFTInteger; eType <= OFTMaxType;)
{
if (OGRFieldDefn::GetFieldTypeName(eType) == osType)
{
oFieldDefn.SetType(eType);
break;
}
if (eType == OFTMaxType)
break;
else
eType = static_cast<OGRFieldType>(eType + 1);
}
}
else if (oIter.first == MD_GDAL_OGR_ALTERNATIVE_NAME)
oFieldDefn.SetAlternativeName(oIter.second.c_str());
else if (oIter.first == MD_GDAL_OGR_COMMENT)
oFieldDefn.SetComment(oIter.second);
Expand Down Expand Up @@ -6615,6 +6631,13 @@ static bool BuildOGRFieldInfo(
bTypeOK = true;
break;
}
else if (eOGRType == OFTDateTime &&
sType.eType == OFTString)
{
bFallbackTypesUsed = true;
bTypeOK = true;
break;
}
else
{
CPLError(CE_Failure, CPLE_AppDefined,
Expand Down

0 comments on commit d1ac855

Please sign in to comment.