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();
         }
     }
 }

Reply via email to