Skip to content

Commit bb4dc21

Browse files
msrathore-dbclaude
andcommitted
feat(csharp): add shared schema factories and GetInfo builder
Add MetadataSchemaFactory to MetadataSchemaDefinitions.cs with: - Schema factories: CreateCatalogsSchema, CreateSchemasSchema, CreateTablesSchema, CreateColumnMetadataSchema, CreatePrimaryKeysSchema, CreateCrossReferenceSchema - Empty result helpers: CreateEmpty*Result for each schema type - Result builders: BuildPrimaryKeysResult, BuildCrossReferenceResult - BuildGetInfoResult: shared DenseUnionArray builder for GetInfo Refactor HiveServer2Connection.GetInfo to use BuildGetInfoResult, replacing ~150 lines of inline DenseUnionArray construction. Values are now lazily resolved per requested info code. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 9926495 commit bb4dc21

File tree

2 files changed

+375
-139
lines changed

2 files changed

+375
-139
lines changed

csharp/src/Hive2/HiveServer2Connection.cs

Lines changed: 16 additions & 139 deletions
Original file line numberDiff line numberDiff line change
@@ -1317,152 +1317,29 @@ public override IArrowArrayStream GetInfo(IReadOnlyList<AdbcInfoCode> codes)
13171317
{
13181318
return this.TraceActivity(activity =>
13191319
{
1320-
const int strValTypeID = 0;
1321-
const int boolValTypeId = 1;
1322-
1323-
UnionType infoUnionType = new UnionType(
1324-
new Field[]
1325-
{
1326-
new Field("string_value", StringType.Default, true),
1327-
new Field("bool_value", BooleanType.Default, true),
1328-
new Field("int64_value", Int64Type.Default, true),
1329-
new Field("int32_bitmask", Int32Type.Default, true),
1330-
new Field(
1331-
"string_list",
1332-
new ListType(
1333-
new Field("item", StringType.Default, true)
1334-
),
1335-
false
1336-
),
1337-
new Field(
1338-
"int32_to_int32_list_map",
1339-
new ListType(
1340-
new Field("entries", new StructType(
1341-
new Field[]
1342-
{
1343-
new Field("key", Int32Type.Default, false),
1344-
new Field("value", Int32Type.Default, true),
1345-
}
1346-
), false)
1347-
),
1348-
true
1349-
)
1350-
},
1351-
new int[] { 0, 1, 2, 3, 4, 5 },
1352-
UnionMode.Dense);
1353-
13541320
if (codes.Count == 0)
1355-
{
13561321
codes = infoSupportedCodes;
1357-
}
1358-
1359-
UInt32Array.Builder infoNameBuilder = new UInt32Array.Builder();
1360-
ArrowBuffer.Builder<byte> typeBuilder = new ArrowBuffer.Builder<byte>();
1361-
ArrowBuffer.Builder<int> offsetBuilder = new ArrowBuffer.Builder<int>();
1362-
StringArray.Builder stringInfoBuilder = new StringArray.Builder();
1363-
BooleanArray.Builder booleanInfoBuilder = new BooleanArray.Builder();
13641322

1365-
int nullCount = 0;
1366-
int arrayLength = codes.Count;
1367-
int offset = 0;
1368-
1369-
foreach (AdbcInfoCode code in codes)
1323+
var values = new Dictionary<AdbcInfoCode, object>();
1324+
foreach (var code in codes)
13701325
{
1371-
string tagKey = SemanticConventions.Db.Operation.Parameter(code.ToString().ToLowerInvariant());
1372-
Func<object?> tagValue = () => null;
1373-
switch (code)
1326+
object? val = code switch
13741327
{
1375-
case AdbcInfoCode.DriverName:
1376-
infoNameBuilder.Append((uint)code);
1377-
typeBuilder.Append(strValTypeID);
1378-
offsetBuilder.Append(offset++);
1379-
stringInfoBuilder.Append(InfoDriverName);
1380-
booleanInfoBuilder.AppendNull();
1381-
tagValue = () => InfoDriverName;
1382-
break;
1383-
case AdbcInfoCode.DriverVersion:
1384-
infoNameBuilder.Append((uint)code);
1385-
typeBuilder.Append(strValTypeID);
1386-
offsetBuilder.Append(offset++);
1387-
stringInfoBuilder.Append(ProductVersion);
1388-
booleanInfoBuilder.AppendNull();
1389-
tagValue = () => ProductVersion;
1390-
break;
1391-
case AdbcInfoCode.DriverArrowVersion:
1392-
infoNameBuilder.Append((uint)code);
1393-
typeBuilder.Append(strValTypeID);
1394-
offsetBuilder.Append(offset++);
1395-
stringInfoBuilder.Append(InfoDriverArrowVersion);
1396-
booleanInfoBuilder.AppendNull();
1397-
tagValue = () => InfoDriverArrowVersion;
1398-
break;
1399-
case AdbcInfoCode.VendorName:
1400-
infoNameBuilder.Append((uint)code);
1401-
typeBuilder.Append(strValTypeID);
1402-
offsetBuilder.Append(offset++);
1403-
string vendorName = VendorName;
1404-
stringInfoBuilder.Append(vendorName);
1405-
booleanInfoBuilder.AppendNull();
1406-
tagValue = () => vendorName;
1407-
break;
1408-
case AdbcInfoCode.VendorVersion:
1409-
infoNameBuilder.Append((uint)code);
1410-
typeBuilder.Append(strValTypeID);
1411-
offsetBuilder.Append(offset++);
1412-
string? vendorVersion = VendorVersion;
1413-
stringInfoBuilder.Append(vendorVersion);
1414-
booleanInfoBuilder.AppendNull();
1415-
tagValue = () => vendorVersion;
1416-
break;
1417-
case AdbcInfoCode.VendorSql:
1418-
infoNameBuilder.Append((uint)code);
1419-
typeBuilder.Append(boolValTypeId);
1420-
offsetBuilder.Append(offset++);
1421-
stringInfoBuilder.AppendNull();
1422-
booleanInfoBuilder.Append(InfoVendorSql);
1423-
tagValue = () => InfoVendorSql;
1424-
break;
1425-
default:
1426-
infoNameBuilder.Append((uint)code);
1427-
typeBuilder.Append(strValTypeID);
1428-
offsetBuilder.Append(offset++);
1429-
stringInfoBuilder.AppendNull();
1430-
booleanInfoBuilder.AppendNull();
1431-
nullCount++;
1432-
break;
1433-
}
1434-
ActivityExtensions.AddTag(activity, tagKey, tagValue);
1435-
}
1436-
1437-
StructType entryType = new StructType(
1438-
new Field[] {
1439-
new Field("key", Int32Type.Default, false),
1440-
new Field("value", Int32Type.Default, true)});
1441-
1442-
StructArray entriesDataArray = new StructArray(entryType, 0,
1443-
new[] { new Int32Array.Builder().Build(), new Int32Array.Builder().Build() },
1444-
new ArrowBuffer.BitmapBuilder().Build());
1445-
1446-
IArrowArray[] childrenArrays = new IArrowArray[]
1447-
{
1448-
stringInfoBuilder.Build(),
1449-
booleanInfoBuilder.Build(),
1450-
new Int64Array.Builder().Build(),
1451-
new Int32Array.Builder().Build(),
1452-
new ListArray.Builder(StringType.Default).Build(),
1453-
new List<IArrowArray?>(){ entriesDataArray }.BuildListArrayForType(entryType)
1454-
};
1455-
1456-
DenseUnionArray infoValue = new DenseUnionArray(infoUnionType, arrayLength, childrenArrays, typeBuilder.Build(), offsetBuilder.Build(), nullCount);
1328+
AdbcInfoCode.DriverName => InfoDriverName,
1329+
AdbcInfoCode.DriverVersion => ProductVersion,
1330+
AdbcInfoCode.DriverArrowVersion => InfoDriverArrowVersion,
1331+
AdbcInfoCode.VendorName => VendorName,
1332+
AdbcInfoCode.VendorVersion => VendorVersion ?? "",
1333+
AdbcInfoCode.VendorSql => InfoVendorSql,
1334+
_ => null
1335+
};
1336+
if (val != null) values[code] = val;
14571337

1458-
IArrowArray[] dataArrays = new IArrowArray[]
1459-
{
1460-
infoNameBuilder.Build(),
1461-
infoValue
1462-
};
1463-
StandardSchemas.GetInfoSchema.Validate(dataArrays);
1338+
string tagKey = SemanticConventions.Db.Operation.Parameter(code.ToString().ToLowerInvariant());
1339+
ActivityExtensions.AddTag(activity, tagKey, () => val);
1340+
}
14641341

1465-
return new HiveInfoArrowStream(StandardSchemas.GetInfoSchema, dataArrays);
1342+
return MetadataSchemaFactory.BuildGetInfoResult(codes, values);
14661343
}, ClassName + "." + nameof(GetInfo));
14671344
}
14681345

0 commit comments

Comments
 (0)