blob: f074afc010103901a7abfb4c9b6d59aeddcfd9e7 [file] [log] [blame]
// Licensed to the Apache Software Foundation (ASF) under one or more
// contributor license agreements. See the NOTICE file distributed with
// this work for additional information regarding copyright ownership.
// The ASF licenses this file to You under the Apache License, Version 2.0
// (the "License"); you may not use this file except in compliance with
// the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
using System;
using System.Collections.Generic;
using System.Text.Json;
using System.Text.Json.Serialization;
namespace Apache.Arrow.IntegrationTest
{
public class JsonFile
{
public JsonSchema Schema { get; set; }
public List<JsonRecordBatch> Batches { get; set; }
//public List<DictionaryBatch> Dictionaries {get;set;}
}
public class JsonSchema
{
public List<JsonField> Fields { get; set; }
public JsonMetadata Metadata { get; set; }
}
public class JsonField
{
public string Name { get; set; }
public bool Nullable { get; set; }
public JsonArrowType Type { get; set; }
public List<JsonField> Children { get; set; }
public JsonDictionaryIndex Dictionary { get; set; }
public JsonMetadata Metadata { get; set; }
}
public class JsonArrowType
{
public string Name { get; set; }
// int fields
public int BitWidth { get; set; }
public bool IsSigned { get; set; }
// floating point fields
[JsonIgnore]
public string FloatingPointPrecision => ExtensionData["precision"].GetString();
// decimal fields
[JsonIgnore]
public int DecimalPrecision => ExtensionData["precision"].GetInt32();
public int Scale { get; set; }
// date and time fields
public string Unit { get; set; }
// timestamp fields
public string Timezone { get; set; }
// FixedSizeBinary fields
public int ByteWidth { get; set; }
[JsonExtensionData]
public Dictionary<string, JsonElement> ExtensionData { get; set; }
}
public class JsonDictionaryIndex
{
public int Id { get; set; }
public JsonArrowType Type { get; set; }
public bool IsOrdered { get; set; }
}
public class JsonMetadata : List<KeyValuePair<string, string>>
{
}
public class JsonRecordBatch
{
public int Count { get; set; }
public List<JsonFieldData> Columns { get; set; }
}
public class JsonFieldData
{
public string Name { get; set; }
public int Count { get; set; }
public bool[] Validity { get; set; }
public int[] Offset { get; set; }
public int[] TypeId { get; set; }
public JsonElement Data { get; set; }
public List<JsonFieldData> Children { get; set; }
}
internal sealed class ValidityConverter : JsonConverter<bool>
{
public override bool Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
if (reader.TokenType == JsonTokenType.True) return true;
if (reader.TokenType == JsonTokenType.False) return false;
if (typeToConvert != typeof(bool) || reader.TokenType != JsonTokenType.Number)
{
throw new InvalidOperationException($"Unexpected bool data: {reader.TokenType}");
}
int value = reader.GetInt32();
if (value == 0) return false;
if (value == 1) return true;
throw new InvalidOperationException($"Unexpected bool value: {value}");
}
public override void Write(Utf8JsonWriter writer, bool value, JsonSerializerOptions options) => throw new NotImplementedException();
}
internal sealed class ByteArrayConverter : JsonConverter<byte[]>
{
public override byte[] Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
if (reader.TokenType != JsonTokenType.StartArray)
{
throw new InvalidOperationException($"Unexpected byte[] token: {reader.TokenType}");
}
List<byte> values = new List<byte>();
while (reader.Read())
{
if (reader.TokenType == JsonTokenType.EndArray)
{
return values.ToArray();
}
if (reader.TokenType != JsonTokenType.Number)
{
throw new InvalidOperationException($"Unexpected byte token: {reader.TokenType}");
}
values.Add(reader.GetByte());
}
throw new InvalidOperationException("Unexpectedly reached the end of the reader");
}
public override void Write(Utf8JsonWriter writer, byte[] value, JsonSerializerOptions options) => throw new NotImplementedException();
}
internal sealed class JsonFileNamingPolicy : JsonNamingPolicy
{
public static JsonFileNamingPolicy Instance { get; } = new JsonFileNamingPolicy();
public override string ConvertName(string name)
{
if (name == "Validity")
{
return "VALIDITY";
}
else if (name == "Offset")
{
return "OFFSET";
}
else if (name == "TypeId")
{
return "TYPE_ID";
}
else if (name == "Data")
{
return "DATA";
}
else
{
return CamelCase.ConvertName(name);
}
}
}
}