blob: 2ac2f0ba2f61db42261ccc885bae66a6f2e2ded2 [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.
*/
namespace Apache.Ignite.Tests.Linq;
using System.Collections.Generic;
using System.Linq;
using Internal.Linq;
using NUnit.Framework;
/// <summary>
/// Linq GROUP BY tests.
/// </summary>
public partial class LinqTests
{
[Test]
public void TestGroupBySimple()
{
var query = PocoByteView.AsQueryable()
.GroupBy(x => x.Val)
.Select(x => x.Key)
.OrderBy(x => x);
List<sbyte?> res = query.ToList();
Assert.AreEqual(new[] { 0, 1, 2, 3 }, res);
StringAssert.Contains(
"select _T0.VAL as _G0 " +
"from PUBLIC.TBL_INT8 as _T0 " +
"group by _G0 " +
"order by _G0 asc",
query.ToString());
}
[Test]
public void TestGroupByMultiple()
{
var query = PocoByteView.AsQueryable()
.GroupBy(x => new {x.Val, x.Key})
.Select(x => x.Key.Key)
.OrderBy(x => x)
.Take(3);
List<sbyte> res = query.ToList();
Assert.AreEqual(new[] { 0, 1, 2 }, res);
StringAssert.Contains(
"select _T0.KEY " +
"from PUBLIC.TBL_INT8 as _T0 " +
"group by (_T0.VAL, _T0.KEY) " +
"order by _T0.KEY asc",
query.ToString());
}
[Test]
public void TestGroupByWithAggregates()
{
var query = PocoByteView.AsQueryable()
.GroupBy(x => x.Val)
.Select(x => new { x.Key, Cnt = x.Count(), SumC = x.Sum(e => e.Key), AvgC = x.Average(e => e.Key) })
.OrderBy(x => x.Key);
var res = query.ToList();
Assert.AreEqual(1, res[1].Key);
Assert.AreEqual(3, res[1].Cnt);
Assert.AreEqual(4.0d, res[1].AvgC);
StringAssert.Contains(
"select _T0.VAL as _G0, count(*) as CNT, sum(cast(_T0.KEY as int)) as SUMC, avg(cast(_T0.KEY as int)) as AVGC " +
"from PUBLIC.TBL_INT8 as _T0 " +
"group by _G0 " +
"order by _G0 asc",
query.ToString());
}
[Test]
public void TestGroupBySubQuery()
{
var query = PocoByteView.AsQueryable()
.Select(x => new {Id = x.Key + 1, Price = x.Val * 10})
.GroupBy(x => x.Price)
.Select(x => new { x.Key, Cnt = x.Count() })
.OrderBy(x => x.Key);
var res = query.ToList();
Assert.AreEqual(10, res[1].Key);
Assert.AreEqual(3, res[1].Cnt);
Assert.AreEqual(20, res[2].Key);
Assert.AreEqual(3, res[2].Cnt);
StringAssert.Contains(
"select (cast(_T0.VAL as int) * ?) as _G0, count(*) as CNT " +
"from PUBLIC.TBL_INT8 as _T0 " +
"group by _G0 " +
"order by _G0 asc",
query.ToString());
}
[Test]
public void TestGroupByWithJoinAndProjection()
{
var query1 = PocoView.AsQueryable();
var query2 = PocoIntView.AsQueryable();
var query = query1.Join(
inner: query2,
outerKeySelector: a => a.Key,
innerKeySelector: b => b.Key,
resultSelector: (a, b) => new
{
Id = a.Key,
Category = b.Val,
Price = a.Val
})
.GroupBy(x => x.Category)
.Select(g => new {Cat = g.Key, Cnt = g.Count()})
.OrderBy(x => x.Cat);
var res = query.ToList();
Assert.AreEqual(0, res[0].Cat);
Assert.AreEqual(1, res[0].Cnt);
Assert.AreEqual(10, res.Count);
StringAssert.Contains(
"select _T0.VAL as _G0, count(*) as CNT " +
"from PUBLIC.TBL1 as _T1 " +
"inner join PUBLIC.TBL_INT32 as _T0 on (cast(_T0.KEY as bigint) = _T1.KEY) " +
"group by _G0 " +
"order by _G0 asc",
query.ToString());
}
/// <summary>
/// Tests grouping combined with join in a reverse order followed by a projection to an anonymous type with
/// custom projected column names.
/// <para />
/// Covers <see cref="ExpressionWalker.GetProjectedMember"/>.
/// </summary>
[Test]
public void TestGroupByWithReverseJoinAndAnonymousProjectionWithRename()
{
var query1 = PocoView.AsQueryable();
var query2 = PocoIntView.AsQueryable();
var query = query1.Join(
query2,
o => o.Key,
p => p.Key,
(org, person) => new
{
Cat = org.Val,
Price = person.Val
})
.GroupBy(x => x.Cat)
.Select(g => new {Category = g.Key, MaxPrice = g.Max(x => x.Price)})
.OrderByDescending(x => x.MaxPrice);
var res = query.ToList();
Assert.AreEqual("v-9", res[0].Category);
Assert.AreEqual(900, res[0].MaxPrice);
StringAssert.Contains(
"select _T0.VAL as _G0, max(_T1.VAL) as MAXPRICE " +
"from PUBLIC.TBL1 as _T0 " +
"inner join PUBLIC.TBL_INT32 as _T1 on (cast(_T1.KEY as bigint) = _T0.KEY) " +
"group by _G0 " +
"order by max(_T1.VAL) desc",
query.ToString());
}
}