Skip to content

Commit 3243cab

Browse files
authored
Merge pull request OSGeo#12211 from rouault/gdal_vector_pipeline_read_vector
gdal vector pipeline: make sure read step opens in vector mode
2 parents b0c7330 + 4a897ba commit 3243cab

14 files changed

+391
-313
lines changed

apps/gdalalg_raster_pipeline.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,8 +98,8 @@ void GDALRasterPipelineStepAlgorithm::AddOutputArgs(bool hiddenForCLI)
9898
.SetHiddenForCLI(hiddenForCLI));
9999
AddOutputDatasetArg(&m_outputDataset, GDAL_OF_RASTER,
100100
/* positionalAndRequired = */ !hiddenForCLI)
101-
.SetHiddenForCLI(hiddenForCLI);
102-
m_outputDataset.SetInputFlags(GADV_NAME | GADV_OBJECT);
101+
.SetHiddenForCLI(hiddenForCLI)
102+
.SetDatasetInputFlags(GADV_NAME | GADV_OBJECT);
103103
AddCreationOptionsArg(&m_creationOptions).SetHiddenForCLI(hiddenForCLI);
104104
AddOverwriteArg(&m_overwrite).SetHiddenForCLI(hiddenForCLI);
105105
}

apps/gdalalg_raster_polygonize.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,8 @@ GDALRasterPolygonizeAlgorithm::GDALRasterPolygonizeAlgorithm()
3939
AddInputFormatsArg(&m_inputFormats)
4040
.AddMetadataItem(GAAMDI_REQUIRED_CAPABILITIES, {GDAL_DCAP_RASTER});
4141
AddInputDatasetArg(&m_inputDataset, GDAL_OF_RASTER);
42-
AddOutputDatasetArg(&m_outputDataset, GDAL_OF_VECTOR);
43-
m_outputDataset.SetInputFlags(GADV_NAME | GADV_OBJECT);
42+
AddOutputDatasetArg(&m_outputDataset, GDAL_OF_VECTOR)
43+
.SetDatasetInputFlags(GADV_NAME | GADV_OBJECT);
4444
AddCreationOptionsArg(&m_creationOptions);
4545
AddLayerCreationOptionsArg(&m_layerCreationOptions);
4646
AddOverwriteArg(&m_overwrite);

apps/gdalalg_vector_convert.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,8 @@ GDALVectorConvertAlgorithm::GDALVectorConvertAlgorithm()
3737
AddInputFormatsArg(&m_inputFormats)
3838
.AddMetadataItem(GAAMDI_REQUIRED_CAPABILITIES, {GDAL_DCAP_VECTOR});
3939
AddInputDatasetArg(&m_inputDataset, GDAL_OF_VECTOR);
40-
AddOutputDatasetArg(&m_outputDataset, GDAL_OF_VECTOR);
41-
m_outputDataset.SetInputFlags(GADV_NAME | GADV_OBJECT);
40+
AddOutputDatasetArg(&m_outputDataset, GDAL_OF_VECTOR)
41+
.SetDatasetInputFlags(GADV_NAME | GADV_OBJECT);
4242
AddCreationOptionsArg(&m_creationOptions);
4343
AddLayerCreationOptionsArg(&m_layerCreationOptions);
4444
AddOverwriteArg(&m_overwrite);

apps/gdalalg_vector_output_abstract.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@ void GDALVectorOutputAbstractAlgorithm::AddAllOutputArgs()
3030
AddOutputFormatArg(&m_outputFormat)
3131
.AddMetadataItem(GAAMDI_REQUIRED_CAPABILITIES,
3232
{GDAL_DCAP_VECTOR, GDAL_DCAP_CREATE});
33-
AddOutputDatasetArg(&m_outputDataset, GDAL_OF_VECTOR);
34-
m_outputDataset.SetInputFlags(GADV_NAME | GADV_OBJECT);
33+
AddOutputDatasetArg(&m_outputDataset, GDAL_OF_VECTOR)
34+
.SetDatasetInputFlags(GADV_NAME | GADV_OBJECT);
3535
AddCreationOptionsArg(&m_creationOptions);
3636
AddLayerCreationOptionsArg(&m_layerCreationOptions);
3737
AddOverwriteArg(&m_overwrite).SetMutualExclusionGroup("overwrite-update");

apps/gdalalg_vector_pipeline.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,8 +94,8 @@ void GDALVectorPipelineStepAlgorithm::AddOutputArgs(
9494
.SetHiddenForCLI(hiddenForCLI);
9595
AddOutputDatasetArg(&m_outputDataset, GDAL_OF_VECTOR,
9696
/* positionalAndRequired = */ !hiddenForCLI)
97-
.SetHiddenForCLI(hiddenForCLI);
98-
m_outputDataset.SetInputFlags(GADV_NAME | GADV_OBJECT);
97+
.SetHiddenForCLI(hiddenForCLI)
98+
.SetDatasetInputFlags(GADV_NAME | GADV_OBJECT);
9999
AddCreationOptionsArg(&m_creationOptions).SetHiddenForCLI(hiddenForCLI);
100100
AddLayerCreationOptionsArg(&m_layerCreationOptions)
101101
.SetHiddenForCLI(hiddenForCLI);

apps/gdalalg_vector_rasterize.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,8 @@ GDALVectorRasterizeAlgorithm::GDALVectorRasterizeAlgorithm()
4040
AddInputFormatsArg(&m_inputFormats)
4141
.AddMetadataItem(GAAMDI_REQUIRED_CAPABILITIES, {GDAL_DCAP_VECTOR});
4242
AddInputDatasetArg(&m_inputDataset, GDAL_OF_VECTOR);
43-
AddOutputDatasetArg(&m_outputDataset, GDAL_OF_RASTER);
44-
m_outputDataset.SetInputFlags(GADV_NAME | GADV_OBJECT);
43+
AddOutputDatasetArg(&m_outputDataset, GDAL_OF_RASTER)
44+
.SetDatasetInputFlags(GADV_NAME | GADV_OBJECT);
4545
AddCreationOptionsArg(&m_datasetCreationOptions);
4646
AddBandArg(&m_bands, _("The band(s) to burn values into (1-based index)"));
4747
AddArg("invert", 0, _("Invert the rasterization"), &m_invert)

autotest/cpp/test_gdal_algorithm.cpp

Lines changed: 35 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -44,27 +44,31 @@ TEST_F(test_gdal_algorithm, GDALAlgorithmArgTypeName)
4444
EXPECT_STREQ(GDALAlgorithmArgTypeName(GAAT_DATASET_LIST), "dataset_list");
4545
}
4646

47-
TEST_F(test_gdal_algorithm, GDALArgDatasetValueTypeName)
47+
TEST_F(test_gdal_algorithm, GDALAlgorithmArgDatasetTypeName)
4848
{
49-
EXPECT_STREQ(GDALArgDatasetValueTypeName(GDAL_OF_RASTER).c_str(), "raster");
50-
EXPECT_STREQ(GDALArgDatasetValueTypeName(GDAL_OF_VECTOR).c_str(), "vector");
51-
EXPECT_STREQ(GDALArgDatasetValueTypeName(GDAL_OF_MULTIDIM_RASTER).c_str(),
52-
"multidimensional raster");
49+
EXPECT_STREQ(GDALAlgorithmArgDatasetTypeName(GDAL_OF_RASTER).c_str(),
50+
"raster");
51+
EXPECT_STREQ(GDALAlgorithmArgDatasetTypeName(GDAL_OF_VECTOR).c_str(),
52+
"vector");
5353
EXPECT_STREQ(
54-
GDALArgDatasetValueTypeName(GDAL_OF_RASTER | GDAL_OF_VECTOR).c_str(),
55-
"raster or vector");
54+
GDALAlgorithmArgDatasetTypeName(GDAL_OF_MULTIDIM_RASTER).c_str(),
55+
"multidimensional raster");
5656
EXPECT_STREQ(
57-
GDALArgDatasetValueTypeName(GDAL_OF_RASTER | GDAL_OF_MULTIDIM_RASTER)
57+
GDALAlgorithmArgDatasetTypeName(GDAL_OF_RASTER | GDAL_OF_VECTOR)
5858
.c_str(),
59-
"raster or multidimensional raster");
60-
EXPECT_STREQ(GDALArgDatasetValueTypeName(GDAL_OF_RASTER | GDAL_OF_VECTOR |
61-
GDAL_OF_MULTIDIM_RASTER)
59+
"raster or vector");
60+
EXPECT_STREQ(GDALAlgorithmArgDatasetTypeName(GDAL_OF_RASTER |
61+
GDAL_OF_MULTIDIM_RASTER)
62+
.c_str(),
63+
"raster or multidimensional raster");
64+
EXPECT_STREQ(GDALAlgorithmArgDatasetTypeName(
65+
GDAL_OF_RASTER | GDAL_OF_VECTOR | GDAL_OF_MULTIDIM_RASTER)
6266
.c_str(),
6367
"raster, vector or multidimensional raster");
64-
EXPECT_STREQ(
65-
GDALArgDatasetValueTypeName(GDAL_OF_VECTOR | GDAL_OF_MULTIDIM_RASTER)
66-
.c_str(),
67-
"vector or multidimensional raster");
68+
EXPECT_STREQ(GDALAlgorithmArgDatasetTypeName(GDAL_OF_VECTOR |
69+
GDAL_OF_MULTIDIM_RASTER)
70+
.c_str(),
71+
"vector or multidimensional raster");
6872
}
6973

7074
TEST_F(test_gdal_algorithm, GDALAlgorithmArgDecl_SetMinCount)
@@ -637,9 +641,14 @@ TEST_F(test_gdal_algorithm, GDALAlgorithmArg_Set)
637641
val2.Set("baz");
638642
arg.SetFrom(arg2);
639643
EXPECT_STREQ(val.GetName().c_str(), "baz");
644+
}
640645

641-
val.SetInputFlags(GADV_NAME);
642-
val.SetOutputFlags(GADV_OBJECT);
646+
{
647+
GDALArgDatasetValue val;
648+
auto decl = GDALAlgorithmArgDecl("", 0, "", GAAT_DATASET);
649+
decl.SetDatasetInputFlags(GADV_NAME);
650+
decl.SetDatasetOutputFlags(GADV_OBJECT);
651+
auto arg = GDALAlgorithmArg(decl, &val);
643652
{
644653
CPLErrorStateBackuper oBackuper(CPLQuietErrorHandler);
645654
CPLErrorReset();
@@ -1863,8 +1872,8 @@ TEST_F(test_gdal_algorithm, same_input_output_dataset_sqlite)
18631872
MyAlgorithm()
18641873
{
18651874
AddInputDatasetArg(&m_input);
1866-
AddOutputDatasetArg(&m_output);
1867-
m_output.SetInputFlags(GADV_NAME | GADV_OBJECT);
1875+
AddOutputDatasetArg(&m_output).SetDatasetInputFlags(GADV_NAME |
1876+
GADV_OBJECT);
18681877
AddUpdateArg(&m_update);
18691878
}
18701879
};
@@ -1909,9 +1918,9 @@ TEST_F(test_gdal_algorithm, output_dataset_created_by_alg)
19091918

19101919
MyAlgorithm()
19111920
{
1912-
AddOutputDatasetArg(&m_output);
1913-
m_output.SetInputFlags(GADV_NAME);
1914-
m_output.SetOutputFlags(GADV_OBJECT);
1921+
AddOutputDatasetArg(&m_output)
1922+
.SetDatasetInputFlags(GADV_NAME)
1923+
.SetDatasetOutputFlags(GADV_OBJECT);
19151924
}
19161925
};
19171926

@@ -3961,12 +3970,12 @@ TEST_F(test_gdal_algorithm, algorithm_c_api)
39613970
{
39623971
auto hArg = GDALAlgorithmGetArg(hAlg.get(), "dataset");
39633972
ASSERT_NE(hArg, nullptr);
3964-
GDALArgDatasetValueH hVal = GDALArgDatasetValueCreate();
3965-
EXPECT_EQ(GDALArgDatasetValueGetType(hVal),
3973+
EXPECT_EQ(GDALAlgorithmArgGetDatasetType(hArg),
39663974
GDAL_OF_RASTER | GDAL_OF_VECTOR | GDAL_OF_MULTIDIM_RASTER);
3967-
EXPECT_EQ(GDALArgDatasetValueGetInputFlags(hVal),
3975+
EXPECT_EQ(GDALAlgorithmArgGetDatasetInputFlags(hArg),
39683976
GADV_NAME | GADV_OBJECT);
3969-
EXPECT_EQ(GDALArgDatasetValueGetOutputFlags(hVal), GADV_OBJECT);
3977+
EXPECT_EQ(GDALAlgorithmArgGetDatasetOutputFlags(hArg), GADV_OBJECT);
3978+
GDALArgDatasetValueH hVal = GDALArgDatasetValueCreate();
39703979
GDALArgDatasetValueSetName(hVal, "foo");
39713980

39723981
{

autotest/gcore/algorithm.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,12 @@ def my_progress(pct, msg, user_data):
131131
with pytest.raises(Exception, match="must only be called on arguments of type"):
132132
arg.GetAsStringList()
133133
assert arg.Get() is False
134+
assert (
135+
arg.GetDatasetType()
136+
== gdal.OF_RASTER | gdal.OF_VECTOR | gdal.OF_MULTIDIM_RASTER
137+
)
138+
assert arg.GetDatasetInputFlags() == gdal.GADV_NAME | gdal.GADV_OBJECT
139+
assert arg.GetDatasetOutputFlags() == gdal.GADV_OBJECT
134140

135141
arg = convert.GetArg("input")
136142
with pytest.raises(Exception, match="must only be called on arguments of type"):

autotest/ogr/ogr_pg.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6329,3 +6329,26 @@ def test_ogr_pg_findfield(pg_ds):
63296329
relaxedFieldNameMatch=True,
63306330
)
63316331
assert [f.GetField(0) for f in lyr] == ["foo", None, "foo"]
6332+
6333+
6334+
###############################################################################
6335+
# Test that we open the PG driver and not the PostGISRaster one with
6336+
# "gdal vector pipeline"
6337+
6338+
6339+
@gdaltest.enable_exceptions()
6340+
def test_ogr_pg_gdal_vector_pipeline(pg_ds):
6341+
6342+
pg_ds.CreateLayer("test")
6343+
6344+
with gdal.Run(
6345+
"vector",
6346+
"pipeline",
6347+
{
6348+
"pipeline": "read ! write",
6349+
"input": pg_ds,
6350+
"output_format": "stream",
6351+
"output": "",
6352+
},
6353+
) as alg:
6354+
assert alg.Output().GetLayerCount() == 1

doc/source/development/rfc/rfc104_gdal_cli.rst

Lines changed: 16 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1311,6 +1311,22 @@ Below is an extract of the beginning of https://github.com/rouault/gdal/blob/rfc
13111311
bool CPL_DLL GDALAlgorithmArgSetAsDoubleList(GDALAlgorithmArgH, size_t nCount,
13121312
const double *pnValues);
13131313
1314+
/** Binary-or combination of GDAL_OF_RASTER, GDAL_OF_VECTOR,
1315+
* GDAL_OF_MULTIDIM_RASTER, possibly with GDAL_OF_UPDATE.
1316+
*/
1317+
typedef int GDALArgDatasetType;
1318+
1319+
GDALArgDatasetType CPL_DLL GDALAlgorithmArgGetDatasetType(GDALAlgorithmArgH);
1320+
1321+
/** Bit indicating that the name component of GDALArgDatasetValue is accepted. */
1322+
#define GADV_NAME (1 << 0)
1323+
/** Bit indicating that the dataset component of GDALArgDatasetValue is accepted. */
1324+
#define GADV_OBJECT (1 << 1)
1325+
1326+
int CPL_DLL GDALAlgorithmArgGetDatasetInputFlags(GDALAlgorithmArgH);
1327+
1328+
int CPL_DLL GDALAlgorithmArgGetDatasetOutputFlags(GDALAlgorithmArgH);
1329+
13141330
/************************************************************************/
13151331
/* GDALArgDatasetValueH API */
13161332
/************************************************************************/
@@ -1326,23 +1342,6 @@ Below is an extract of the beginning of https://github.com/rouault/gdal/blob/rfc
13261342
GDALDatasetH
13271343
CPL_DLL GDALArgDatasetValueGetDatasetIncreaseRefCount(GDALArgDatasetValueH);
13281344
1329-
/** Bit indicating that the name component of GDALArgDatasetValue is accepted. */
1330-
#define GADV_NAME (1 << 0)
1331-
/** Bit indicating that the dataset component of GDALArgDatasetValue is accepted. */
1332-
#define GADV_OBJECT (1 << 1)
1333-
1334-
/** Binary-or combination of GDAL_OF_RASTER, GDAL_OF_VECTOR and
1335-
* GDAL_OF_MULTIDIM_RASTER.
1336-
*/
1337-
typedef int GDALArgDatasetValueType;
1338-
1339-
GDALArgDatasetValueType
1340-
CPL_DLL GDALArgDatasetValueGetType(GDALArgDatasetValueH);
1341-
1342-
int CPL_DLL GDALArgDatasetValueGetInputFlags(GDALArgDatasetValueH);
1343-
1344-
int CPL_DLL GDALArgDatasetValueGetOutputFlags(GDALArgDatasetValueH);
1345-
13461345
void CPL_DLL GDALArgDatasetValueSetName(GDALArgDatasetValueH, const char *);
13471346
13481347
void CPL_DLL GDALArgDatasetValueSetDataset(GDALArgDatasetValueH, GDALDatasetH);

0 commit comments

Comments
 (0)