This is an automated email from the ASF dual-hosted git repository.
curth pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/arrow-adbc.git
The following commit(s) were added to refs/heads/main by this push:
new 251ce770 test(csharp): add more tests for verifying GetObjects (Depths
and Patterns) (#1299)
251ce770 is described below
commit 251ce770c810963d56315728a8d9b57552b135f6
Author: Ryan Syed <[email protected]>
AuthorDate: Mon Nov 20 17:17:53 2023 -0800
test(csharp): add more tests for verifying GetObjects (Depths and Patterns)
(#1299)
Added tests to verify GetObjects for different depths like: Catalogs
DbSchemas
Tables
All
Also added tests to verify GetObjects with catalog, schema, and table
names passed as patterns
---
.../Metadata/GetObjectsParser.cs | 6 +
csharp/test/Drivers/Snowflake/DriverTests.cs | 318 +++++++++++++++------
2 files changed, 244 insertions(+), 80 deletions(-)
diff --git a/csharp/test/Apache.Arrow.Adbc.Tests/Metadata/GetObjectsParser.cs
b/csharp/test/Apache.Arrow.Adbc.Tests/Metadata/GetObjectsParser.cs
index 214ec9df..c783ba19 100644
--- a/csharp/test/Apache.Arrow.Adbc.Tests/Metadata/GetObjectsParser.cs
+++ b/csharp/test/Apache.Arrow.Adbc.Tests/Metadata/GetObjectsParser.cs
@@ -52,6 +52,8 @@ namespace Apache.Arrow.Adbc.Tests.Metadata
private static List<AdbcDbSchema> ParseDbSchema(StructArray
dbSchemaArray, string schemaName)
{
+ if (dbSchemaArray == null) return null;
+
StringArray schemaNameArray =
(StringArray)dbSchemaArray.Fields[0]; // db_schema_name
ListArray tablesArray = (ListArray)dbSchemaArray.Fields[1]; //
db_schema_tables
@@ -71,6 +73,8 @@ namespace Apache.Arrow.Adbc.Tests.Metadata
private static List<AdbcTable> ParseTables(StructArray tablesArray)
{
+ if (tablesArray == null) return null;
+
StringArray tableNameArray = (StringArray)tablesArray.Fields[0];
// table_name
StringArray tableTypeArray = (StringArray)tablesArray.Fields[1];
// table_type
ListArray columnsArray = (ListArray)tablesArray.Fields[2]; //
table_columns
@@ -93,6 +97,8 @@ namespace Apache.Arrow.Adbc.Tests.Metadata
private static List<AdbcColumn> ParseColumns(StructArray columnsArray)
{
+ if (columnsArray == null) return null;
+
List<AdbcColumn> columns = new List<AdbcColumn>();
StringArray column_name =
(StringArray)columnsArray.Fields[StandardSchemas.ColumnSchema.FindIndex(f =>
f.Name == "column_name")]; // column_name | utf8 not null
diff --git a/csharp/test/Drivers/Snowflake/DriverTests.cs
b/csharp/test/Drivers/Snowflake/DriverTests.cs
index 0312fff9..a6c8818c 100644
--- a/csharp/test/Drivers/Snowflake/DriverTests.cs
+++ b/csharp/test/Drivers/Snowflake/DriverTests.cs
@@ -33,11 +33,30 @@ namespace Apache.Arrow.Adbc.Tests.Drivers.Interop.Snowflake
/// queries to run.
/// </remarks>
[TestCaseOrderer("Apache.Arrow.Adbc.Tests.Xunit.TestOrderer",
"Apache.Arrow.Adbc.Tests")]
- public class DriverTests
+ public class DriverTests : IDisposable
{
+ readonly SnowflakeTestConfiguration _testConfiguration;
+ readonly AdbcDriver _snowflakeDriver;
+ readonly AdbcDatabase _database;
+ readonly AdbcConnection _connection;
+
public DriverTests()
{
-
Skip.IfNot(Utils.CanExecuteTestConfig(SnowflakeTestingUtils.SNOWFLAKE_TEST_CONFIG_VARIABLE));
+
Skip.IfNot(Utils.CanExecuteTestConfig(SnowflakeTestingUtils.SNOWFLAKE_TEST_CONFIG_VARIABLE));
+ _testConfiguration =
Utils.LoadTestConfiguration<SnowflakeTestConfiguration>(SnowflakeTestingUtils.SNOWFLAKE_TEST_CONFIG_VARIABLE);
+
+ Dictionary<string, string> parameters = new Dictionary<string,
string>();
+ Dictionary<string, string> options = new Dictionary<string,
string>();
+ _snowflakeDriver =
SnowflakeTestingUtils.GetSnowflakeAdbcDriver(_testConfiguration, out
parameters);
+
+ string databaseName = _testConfiguration.Metadata.Catalog;
+ string schemaName = _testConfiguration.Metadata.Schema;
+
+ parameters[SnowflakeParameters.DATABASE] = databaseName;
+ parameters[SnowflakeParameters.SCHEMA] = schemaName;
+
+ _database = _snowflakeDriver.Open(parameters);
+ _connection = _database.Connect(options);
}
/// <summary>
@@ -51,24 +70,14 @@ namespace Apache.Arrow.Adbc.Tests.Drivers.Interop.Snowflake
[SkippableFact, Order(1)]
public void CanExecuteUpdate()
{
- SnowflakeTestConfiguration testConfiguration =
Utils.LoadTestConfiguration<SnowflakeTestConfiguration>(SnowflakeTestingUtils.SNOWFLAKE_TEST_CONFIG_VARIABLE);
-
- Dictionary<string, string> parameters = new Dictionary<string,
string>();
- Dictionary<string, string> options = new Dictionary<string,
string>();
-
- AdbcDriver snowflakeDriver =
SnowflakeTestingUtils.GetSnowflakeAdbcDriver(testConfiguration, out parameters);
-
- AdbcDatabase adbcDatabase = snowflakeDriver.Open(parameters);
- AdbcConnection adbcConnection = adbcDatabase.Connect(options);
-
- string[] queries =
SnowflakeTestingUtils.GetQueries(testConfiguration);
+ string[] queries =
SnowflakeTestingUtils.GetQueries(_testConfiguration);
List<int> expectedResults = new List<int>() { -1, 1, 1 };
for (int i = 0; i < queries.Length; i++)
{
string query = queries[i];
- AdbcStatement statement = adbcConnection.CreateStatement();
+ using AdbcStatement statement = _connection.CreateStatement();
statement.SqlQuery = query;
UpdateResult updateResult = statement.ExecuteUpdate();
@@ -83,18 +92,8 @@ namespace Apache.Arrow.Adbc.Tests.Drivers.Interop.Snowflake
[SkippableFact, Order(2)]
public void CanGetInfo()
{
- Dictionary<string, string> parameters = new Dictionary<string,
string>();
-
- SnowflakeTestConfiguration testConfiguration =
Utils.LoadTestConfiguration<SnowflakeTestConfiguration>(SnowflakeTestingUtils.SNOWFLAKE_TEST_CONFIG_VARIABLE);
-
- AdbcDriver driver =
SnowflakeTestingUtils.GetSnowflakeAdbcDriver(testConfiguration, out parameters);
-
- AdbcDatabase adbcDatabase = driver.Open(parameters);
- AdbcConnection adbcConnection = adbcDatabase.Connect(new
Dictionary<string, string>());
-
- IArrowArrayStream stream = adbcConnection.GetInfo(new
List<AdbcInfoCode>() { AdbcInfoCode.DriverName, AdbcInfoCode.DriverVersion,
AdbcInfoCode.VendorName });
-
- RecordBatch recordBatch = stream.ReadNextRecordBatchAsync().Result;
+ using IArrowArrayStream stream = _connection.GetInfo(new
List<AdbcInfoCode>() { AdbcInfoCode.DriverName, AdbcInfoCode.DriverVersion,
AdbcInfoCode.VendorName });
+ using RecordBatch recordBatch =
stream.ReadNextRecordBatchAsync().Result;
UInt32Array infoNameArray =
(UInt32Array)recordBatch.Column("info_name");
List<string> expectedValues = new List<string>() { "DriverName",
"DriverVersion", "VendorName" };
@@ -112,30 +111,205 @@ namespace
Apache.Arrow.Adbc.Tests.Drivers.Interop.Snowflake
}
/// <summary>
- /// Validates if the driver can call GetObjects.
+ /// Validates if the driver can call GetObjects with GetObjectsDepth
as Catalogs.
/// </summary>
[SkippableFact, Order(3)]
- public void CanGetObjects()
+ public void CanGetObjectsCatalogs()
{
- Dictionary<string, string> parameters = new Dictionary<string,
string>();
+ string databaseName = _testConfiguration.Metadata.Catalog;
+
+ using IArrowArrayStream stream = _connection.GetObjects(
+ depth: AdbcConnection.GetObjectsDepth.Catalogs,
+ catalogPattern: databaseName,
+ dbSchemaPattern: null,
+ tableNamePattern: null,
+ tableTypes: new List<string> { "BASE TABLE", "VIEW" },
+ columnNamePattern: null);
+
+ using RecordBatch recordBatch =
stream.ReadNextRecordBatchAsync().Result;
+
+ List<AdbcCatalog> catalogs =
GetObjectsParser.ParseCatalog(recordBatch, databaseName, null);
+
+ AdbcCatalog catalog = catalogs.FirstOrDefault();
- SnowflakeTestConfiguration testConfiguration =
Utils.LoadTestConfiguration<SnowflakeTestConfiguration>(SnowflakeTestingUtils.SNOWFLAKE_TEST_CONFIG_VARIABLE);
+ Assert.True(catalog != null, "catalog should not be null");
+ Assert.Equal(databaseName, catalog.Name);
+ }
+
+ /// <summary>
+ /// Validates if the driver can call GetObjects with GetObjectsDepth
as Catalogs and CatalogName passed as a pattern.
+ /// </summary>
+ [SkippableFact, Order(3)]
+ public void CanGetObjectsCatalogsWithPattern()
+ {
+ string databaseName = _testConfiguration.Metadata.Catalog;
+ string schemaName = _testConfiguration.Metadata.Schema;
+ string partialDatabaseName =
GetPartialNameForPatternMatch(databaseName);
+
+
+ using IArrowArrayStream stream = _connection.GetObjects(
+ depth: AdbcConnection.GetObjectsDepth.Catalogs,
+ catalogPattern: $"{partialDatabaseName}%",
+ dbSchemaPattern: null,
+ tableNamePattern: null,
+ tableTypes: new List<string> { "BASE TABLE", "VIEW" },
+ columnNamePattern: null);
- AdbcDriver driver =
SnowflakeTestingUtils.GetSnowflakeAdbcDriver(testConfiguration, out parameters);
+ using RecordBatch recordBatch =
stream.ReadNextRecordBatchAsync().Result;
+ List<AdbcCatalog> catalogs =
GetObjectsParser.ParseCatalog(recordBatch, databaseName, null);
+
+ AdbcCatalog catalog = catalogs.FirstOrDefault();
+
+ Assert.True(catalog != null, "catalog should not be null");
+ Assert.StartsWith(databaseName, catalog.Name);
+ }
+
+ /// <summary>
+ /// Validates if the driver can call GetObjects with GetObjectsDepth
as DbSchemas.
+ /// </summary>
+ [SkippableFact, Order(3)]
+ public void CanGetObjectsDbSchemas()
+ {
// need to add the database
- string databaseName = testConfiguration.Metadata.Catalog;
- string schemaName = testConfiguration.Metadata.Schema;
- string tableName = testConfiguration.Metadata.Table;
- string columnName = null;
+ string databaseName = _testConfiguration.Metadata.Catalog;
+ string schemaName = _testConfiguration.Metadata.Schema;
- parameters[SnowflakeParameters.DATABASE] = databaseName;
- parameters[SnowflakeParameters.SCHEMA] = schemaName;
+ using IArrowArrayStream stream = _connection.GetObjects(
+ depth: AdbcConnection.GetObjectsDepth.DbSchemas,
+ catalogPattern: databaseName,
+ dbSchemaPattern: schemaName,
+ tableNamePattern: null,
+ tableTypes: new List<string> { "BASE TABLE", "VIEW" },
+ columnNamePattern: null);
+
+ using RecordBatch recordBatch =
stream.ReadNextRecordBatchAsync().Result;
+
+ List<AdbcCatalog> catalogs =
GetObjectsParser.ParseCatalog(recordBatch, databaseName, schemaName);
+
+ List<AdbcDbSchema> dbSchemas = catalogs
+ .Select(s => s.DbSchemas)
+ .FirstOrDefault();
+ AdbcDbSchema dbSchema = dbSchemas.FirstOrDefault();
+
+ Assert.True(dbSchema != null, "dbSchema should not be null");
+ Assert.Equal(schemaName, dbSchema.Name);
+ }
+
+ /// <summary>
+ /// Validates if the driver can call GetObjects with GetObjectsDepth
as DbSchemas with DbSchemaName as a pattern.
+ /// </summary>
+ [SkippableFact, Order(3)]
+ public void CanGetObjectsDbSchemasWithPattern()
+ {
+ // need to add the database
+ string databaseName = _testConfiguration.Metadata.Catalog;
+ string schemaName = _testConfiguration.Metadata.Schema;
+ string partialSchemaName =
GetPartialNameForPatternMatch(schemaName);
+
+ using IArrowArrayStream stream = _connection.GetObjects(
+ depth: AdbcConnection.GetObjectsDepth.DbSchemas,
+ catalogPattern: databaseName,
+ dbSchemaPattern: $"{partialSchemaName}%",
+ tableNamePattern: null,
+ tableTypes: new List<string> { "BASE TABLE", "VIEW" },
+ columnNamePattern: null);
+
+ using RecordBatch recordBatch =
stream.ReadNextRecordBatchAsync().Result;
- AdbcDatabase adbcDatabase = driver.Open(parameters);
- AdbcConnection adbcConnection = adbcDatabase.Connect(new
Dictionary<string, string>());
+ List<AdbcCatalog> catalogs =
GetObjectsParser.ParseCatalog(recordBatch, databaseName, schemaName);
+
+ List<AdbcDbSchema> dbSchemas = catalogs
+ .Select(s => s.DbSchemas)
+ .FirstOrDefault();
+ AdbcDbSchema dbSchema = dbSchemas.FirstOrDefault();
- IArrowArrayStream stream = adbcConnection.GetObjects(
+ Assert.True(dbSchema != null, "dbSchema should not be null");
+ Assert.StartsWith(partialSchemaName, dbSchema.Name);
+ }
+
+ /// <summary>
+ /// Validates if the driver can call GetObjects with GetObjectsDepth
as Tables.
+ /// </summary>
+ [SkippableFact, Order(3)]
+ public void CanGetObjectsTables()
+ {
+ // need to add the database
+ string databaseName = _testConfiguration.Metadata.Catalog;
+ string schemaName = _testConfiguration.Metadata.Schema;
+ string tableName = _testConfiguration.Metadata.Table;
+
+ using IArrowArrayStream stream = _connection.GetObjects(
+ depth: AdbcConnection.GetObjectsDepth.All,
+ catalogPattern: databaseName,
+ dbSchemaPattern: schemaName,
+ tableNamePattern: tableName,
+ tableTypes: new List<string> { "BASE TABLE", "VIEW" },
+ columnNamePattern: null);
+
+ using RecordBatch recordBatch =
stream.ReadNextRecordBatchAsync().Result;
+
+ List<AdbcCatalog> catalogs =
GetObjectsParser.ParseCatalog(recordBatch, databaseName, schemaName);
+
+ List<AdbcTable> tables = catalogs
+ .Select(s => s.DbSchemas)
+ .FirstOrDefault()
+ .Select(t => t.Tables)
+ .FirstOrDefault();
+ AdbcTable table = tables.FirstOrDefault();
+
+ Assert.True(table != null, "table should not be null");
+ Assert.Equal(tableName, table.Name);
+ }
+
+ /// <summary>
+ /// Validates if the driver can call GetObjects with GetObjectsDepth
as Tables with TableName as a pattern.
+ /// </summary>
+ [SkippableFact, Order(3)]
+ public void CanGetObjectsTablesWithPattern()
+ {
+ // need to add the database
+ string databaseName = _testConfiguration.Metadata.Catalog;
+ string schemaName = _testConfiguration.Metadata.Schema;
+ string tableName = _testConfiguration.Metadata.Table;
+ string partialTableName = GetPartialNameForPatternMatch(tableName);
+
+ using IArrowArrayStream stream = _connection.GetObjects(
+ depth: AdbcConnection.GetObjectsDepth.All,
+ catalogPattern: databaseName,
+ dbSchemaPattern: schemaName,
+ tableNamePattern: $"{partialTableName}%",
+ tableTypes: new List<string> { "BASE TABLE", "VIEW" },
+ columnNamePattern: null);
+
+ using RecordBatch recordBatch =
stream.ReadNextRecordBatchAsync().Result;
+
+ List<AdbcCatalog> catalogs =
GetObjectsParser.ParseCatalog(recordBatch, databaseName, schemaName);
+
+ List<AdbcTable> tables = catalogs
+ .Select(s => s.DbSchemas)
+ .FirstOrDefault()
+ .Select(t => t.Tables)
+ .FirstOrDefault();
+ AdbcTable table = tables.FirstOrDefault();
+
+ Assert.True(table != null, "table should not be null");
+ Assert.StartsWith(partialTableName, table.Name);
+ }
+
+ /// <summary>
+ /// Validates if the driver can call GetObjects for GetObjectsDepth as
All.
+ /// </summary>
+ [SkippableFact, Order(3)]
+ public void CanGetObjectsAll()
+ {
+ // need to add the database
+ string databaseName = _testConfiguration.Metadata.Catalog;
+ string schemaName = _testConfiguration.Metadata.Schema;
+ string tableName = _testConfiguration.Metadata.Table;
+ string columnName = null;
+
+ using IArrowArrayStream stream = _connection.GetObjects(
depth: AdbcConnection.GetObjectsDepth.All,
catalogPattern: databaseName,
dbSchemaPattern: schemaName,
@@ -143,7 +317,7 @@ namespace Apache.Arrow.Adbc.Tests.Drivers.Interop.Snowflake
tableTypes: new List<string> { "BASE TABLE", "VIEW" },
columnNamePattern: columnName);
- RecordBatch recordBatch = stream.ReadNextRecordBatchAsync().Result;
+ using RecordBatch recordBatch =
stream.ReadNextRecordBatchAsync().Result;
List<AdbcCatalog> catalogs =
GetObjectsParser.ParseCatalog(recordBatch, databaseName, schemaName);
@@ -157,7 +331,7 @@ namespace Apache.Arrow.Adbc.Tests.Drivers.Interop.Snowflake
Assert.True(columns != null, "Columns cannot be null");
- Assert.Equal(testConfiguration.Metadata.ExpectedColumnCount,
columns.Count);
+ Assert.Equal(_testConfiguration.Metadata.ExpectedColumnCount,
columns.Count);
}
/// <summary>
@@ -166,24 +340,15 @@ namespace
Apache.Arrow.Adbc.Tests.Drivers.Interop.Snowflake
[SkippableFact, Order(4)]
public void CanGetTableSchema()
{
- Dictionary<string, string> parameters = new Dictionary<string,
string>();
-
- SnowflakeTestConfiguration testConfiguration =
Utils.LoadTestConfiguration<SnowflakeTestConfiguration>(SnowflakeTestingUtils.SNOWFLAKE_TEST_CONFIG_VARIABLE);
+ string databaseName = _testConfiguration.Metadata.Catalog;
+ string schemaName = _testConfiguration.Metadata.Schema;
+ string tableName = _testConfiguration.Metadata.Table;
- AdbcDriver driver =
SnowflakeTestingUtils.GetSnowflakeAdbcDriver(testConfiguration, out parameters);
-
- AdbcDatabase adbcDatabase = driver.Open(parameters);
- AdbcConnection adbcConnection = adbcDatabase.Connect(new
Dictionary<string, string>());
-
- string databaseName = testConfiguration.Metadata.Catalog;
- string schemaName = testConfiguration.Metadata.Schema;
- string tableName = testConfiguration.Metadata.Table;
-
- Schema schema = adbcConnection.GetTableSchema(databaseName,
schemaName, tableName);
+ Schema schema = _connection.GetTableSchema(databaseName,
schemaName, tableName);
int numberOfFields = schema.FieldsList.Count;
- Assert.Equal(testConfiguration.Metadata.ExpectedColumnCount,
numberOfFields);
+ Assert.Equal(_testConfiguration.Metadata.ExpectedColumnCount,
numberOfFields);
}
/// <summary>
@@ -192,18 +357,9 @@ namespace Apache.Arrow.Adbc.Tests.Drivers.Interop.Snowflake
[SkippableFact, Order(5)]
public void CanGetTableTypes()
{
- Dictionary<string, string> parameters = new Dictionary<string,
string>();
-
- SnowflakeTestConfiguration testConfiguration =
Utils.LoadTestConfiguration<SnowflakeTestConfiguration>(SnowflakeTestingUtils.SNOWFLAKE_TEST_CONFIG_VARIABLE);
+ using IArrowArrayStream arrowArrayStream =
_connection.GetTableTypes();
- AdbcDriver driver =
SnowflakeTestingUtils.GetSnowflakeAdbcDriver(testConfiguration, out parameters);
-
- AdbcDatabase adbcDatabase = driver.Open(parameters);
- AdbcConnection adbcConnection = adbcDatabase.Connect(new
Dictionary<string, string>());
-
- IArrowArrayStream arrowArrayStream =
adbcConnection.GetTableTypes();
-
- RecordBatch recordBatch =
arrowArrayStream.ReadNextRecordBatchAsync().Result;
+ using RecordBatch recordBatch =
arrowArrayStream.ReadNextRecordBatchAsync().Result;
StringArray stringArray =
(StringArray)recordBatch.Column("table_type");
@@ -234,24 +390,26 @@ namespace
Apache.Arrow.Adbc.Tests.Drivers.Interop.Snowflake
[SkippableFact, Order(6)]
public void CanExecuteQuery()
{
- SnowflakeTestConfiguration testConfiguration =
Utils.LoadTestConfiguration<SnowflakeTestConfiguration>(SnowflakeTestingUtils.SNOWFLAKE_TEST_CONFIG_VARIABLE);
-
- Dictionary<string, string> parameters = new Dictionary<string,
string>();
- Dictionary<string, string> options = new Dictionary<string,
string>();
-
- AdbcDriver snowflakeDriver =
SnowflakeTestingUtils.GetSnowflakeAdbcDriver(testConfiguration, out parameters);
+ using AdbcStatement statement = _connection.CreateStatement();
+ statement.SqlQuery = _testConfiguration.Query;
- AdbcDatabase adbcDatabase = snowflakeDriver.Open(parameters);
- AdbcConnection adbcConnection = adbcDatabase.Connect(options);
+ QueryResult queryResult = statement.ExecuteQuery();
- Console.WriteLine(testConfiguration.Query);
+ Tests.DriverTests.CanExecuteQuery(queryResult,
_testConfiguration.ExpectedResultsCount);
+ }
- AdbcStatement statement = adbcConnection.CreateStatement();
- statement.SqlQuery = testConfiguration.Query;
+ private string GetPartialNameForPatternMatch(string name)
+ {
+ if (string.IsNullOrEmpty(name) || name.Length == 1) return name;
- QueryResult queryResult = statement.ExecuteQuery();
+ return name.Substring(0, name.Length / 2);
+ }
- Tests.DriverTests.CanExecuteQuery(queryResult,
testConfiguration.ExpectedResultsCount);
+ public void Dispose()
+ {
+ _connection.Dispose();
+ _database.Dispose();
+ _snowflakeDriver.Dispose();
}
}
}