blob: 21decdacc058839af6d52432588a1761775675b8 [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.Linq;
using Apache.Arrow.Types;
using Xunit;
namespace Apache.Arrow.Tests
{
public class MapArrayTests
{
[Fact]
public void MapArray_Should_GetTuple()
{
MapType type = new MapType(StringType.Default, Int64Type.Default);
MapArray.Builder builder = new MapArray.Builder(type);
var keyBuilder = builder.KeyBuilder as StringArray.Builder;
var valueBuilder = builder.ValueBuilder as Int64Array.Builder;
Tuple<string, long?> kv0 = Tuple.Create("test", (long?)1);
Tuple<string, long?> kv1 = Tuple.Create("other", (long?)123);
Tuple<string, long?> kv2 = Tuple.Create("kv", (long?)null);
builder.Append();
keyBuilder.Append("test");
valueBuilder.Append(1);
builder.AppendNull();
builder.Append();
keyBuilder.Append("other");
valueBuilder.Append(123);
keyBuilder.Append("kv");
valueBuilder.AppendNull();
MapArray array = builder.Build();
Assert.Equal(new Tuple<string, long?>[] { kv0 }, array.GetTuples<StringArray, string, Int64Array, long?>(0, GetKey, GetValue).ToArray());
Assert.True(array.IsNull(1));
Assert.Equal(new Tuple<string, long?>[] { kv1, kv2 }, array.GetTuples<StringArray, string, Int64Array, long?>(2, GetKey, GetValue).ToArray());
}
[Fact]
public void MapArray_Should_GetKeyValuePairs()
{
MapType type = new MapType(StringType.Default, Int32Type.Default);
MapArray.Builder builder = new MapArray.Builder(type);
var keyBuilder = builder.KeyBuilder as StringArray.Builder;
var valueBuilder = builder.ValueBuilder as Int32Array.Builder;
KeyValuePair<string, int?> kv0 = new KeyValuePair<string, int?>("test", (int?)1);
KeyValuePair<string, int?> kv1 = new KeyValuePair<string, int?>("other", (int?)123);
KeyValuePair<string, int?> kv2 = new KeyValuePair<string, int?>("kv", (int?)null);
builder.Append();
keyBuilder.Append("test");
valueBuilder.Append(1);
builder.AppendNull();
builder.Append();
keyBuilder.Append("other");
valueBuilder.Append(123);
keyBuilder.Append("kv");
valueBuilder.AppendNull();
MapArray array = builder.Build();
Assert.Equal(new KeyValuePair<string, int?>[] { kv0 }, array.GetKeyValuePairs<StringArray, string, Int32Array, int?>(0, GetKey, GetValue).ToArray());
Assert.True(array.IsNull(1));
Assert.Equal(new KeyValuePair<string, int?>[] { kv1, kv2 }, array.GetKeyValuePairs<StringArray, string, Int32Array, int?>(2, GetKey, GetValue).ToArray());
}
[Fact]
public void MapArray_Should_AcceptMapVisitor()
{
var mapArray = BuildMapArray();
var visitor = new MapOnlyVisitor();
mapArray.Accept(visitor);
Assert.True(visitor.MapVisited);
Assert.False(visitor.BaseVisited);
}
[Fact]
public void MapArray_Should_AcceptListVisitor()
{
var mapArray = BuildMapArray();
var visitor = new ListOnlyVisitor();
mapArray.Accept(visitor);
Assert.True(visitor.ListVisited);
Assert.False(visitor.BaseVisited);
}
[Fact]
public void MapArray_Should_AcceptListAndMapVisitor()
{
var mapArray = BuildMapArray();
var visitor = new MapAndListVisitor();
mapArray.Accept(visitor);
Assert.True(visitor.MapVisited);
Assert.False(visitor.ListVisited);
Assert.False(visitor.BaseVisited);
}
private static MapArray BuildMapArray()
{
MapType type = new MapType(StringType.Default, Int64Type.Default);
MapArray.Builder builder = new MapArray.Builder(type);
var keyBuilder = builder.KeyBuilder as StringArray.Builder;
var valueBuilder = builder.ValueBuilder as Int64Array.Builder;
builder.Append();
keyBuilder.Append("test");
valueBuilder.Append(1);
builder.AppendNull();
builder.Append();
keyBuilder.Append("other");
valueBuilder.Append(123);
keyBuilder.Append("kv");
valueBuilder.AppendNull();
return builder.Build();
}
private static string GetKey(StringArray array, int index) => array.GetString(index);
private static int? GetValue(Int32Array array, int index) => array.GetValue(index);
private static long? GetValue(Int64Array array, int index) => array.GetValue(index);
private sealed class MapOnlyVisitor : IArrowArrayVisitor<MapArray>
{
public bool MapVisited = false;
public bool BaseVisited = false;
public void Visit(MapArray array)
{
MapVisited = true;
}
public void Visit(IArrowArray array)
{
BaseVisited = true;
}
}
private sealed class ListOnlyVisitor : IArrowArrayVisitor<ListArray>
{
public bool ListVisited = false;
public bool BaseVisited = false;
public void Visit(ListArray array)
{
ListVisited = true;
}
public void Visit(IArrowArray array)
{
BaseVisited = true;
}
}
private sealed class MapAndListVisitor : IArrowArrayVisitor<MapArray>, IArrowArrayVisitor<ListArray>
{
public bool MapVisited = false;
public bool ListVisited = false;
public bool BaseVisited = false;
public void Visit(MapArray array)
{
MapVisited = true;
}
public void Visit(ListArray array)
{
ListVisited = true;
}
public void Visit(IArrowArray array)
{
BaseVisited = true;
}
}
}
}