package defs

import "github.com/featurebasedb/featurebase/v3/pql"

var selectHavingTests = TableTest{
	name: "select-having",
	Table: tbl(
		"having_test",
		srcHdrs(
			srcHdr("_id", fldTypeID),
			srcHdr("an_int", fldTypeInt, "min 0", "max 100"),
			srcHdr("an_id_set", fldTypeIDSet),
			srcHdr("an_id", fldTypeID),
			srcHdr("a_string", fldTypeString),
			srcHdr("a_string_set", fldTypeStringSet),
			srcHdr("a_decimal", fldTypeDecimal2),
		),
		srcRows(
			srcRow(int64(1), int64(11), []int64{11, 12, 13}, int64(101), "str1", []string{"a1", "b1", "c1"}, float64(123.45)),
			srcRow(int64(2), int64(22), []int64{21, 22, 23}, int64(201), "str2", []string{"a2", "b2", "c2"}, float64(234.56)),
			srcRow(int64(3), int64(33), []int64{31, 32, 33}, int64(301), "str3", []string{"a3", "b3", "c3"}, float64(345.67)),
			srcRow(int64(4), int64(44), []int64{41, 42, 43}, int64(401), "str4", []string{"a4", "b4", "c4"}, float64(456.78)),
			srcRow(int64(5), int64(11), []int64{11, 12, 13}, int64(101), "str1", []string{"a5", "b5", "c5"}, float64(567.89)),
		),
	),
	SQLTests: []SQLTest{
		{
			name: "countfieldincluded",
			SQLs: sqls(
				"select count(an_int), an_int from having_test group by an_int having count(an_int) = 1",
			),
			ExpHdrs: hdrs(
				hdr("", fldTypeInt),
				hdr("an_int", fldTypeInt),
			),
			ExpRows: rows(
				row(int64(1), int64(22)),
				row(int64(1), int64(33)),
				row(int64(1), int64(44)),
			),
			Compare:        CompareExactUnordered,
			SortStringKeys: true,
		},
		{
			name: "countfieldnotincluded",
			SQLs: sqls(
				"select an_int from having_test group by an_int having count(an_int) = 1",
			),
			ExpHdrs: hdrs(
				hdr("an_int", fldTypeInt),
			),
			ExpRows: rows(
				row(int64(22)),
				row(int64(33)),
				row(int64(44)),
			),
			Compare:        CompareExactUnordered,
			SortStringKeys: true,
		},
		{
			name: "countstarincluded",
			SQLs: sqls(
				"select count(*), an_int from having_test group by an_int having count(*) > 1",
			),
			ExpHdrs: hdrs(
				hdr("", fldTypeInt),
				hdr("an_int", fldTypeInt),
			),
			ExpRows: rows(
				row(int64(2), int64(11)),
			),
			Compare:        CompareExactUnordered,
			SortStringKeys: true,
		},
		{
			name: "countstarnotincluded",
			SQLs: sqls(
				"select an_int from having_test group by an_int having count(*) > 1",
			),
			ExpHdrs: hdrs(
				hdr("an_int", fldTypeInt),
			),
			ExpRows: rows(
				row(
					int64(11),
				),
			),
			Compare:        CompareExactUnordered,
			SortStringKeys: true,
		},
		{
			name: "sum-dec",
			SQLs: sqls(
				"select sum(a_decimal), an_int from having_test group by an_int having sum(a_decimal) < 250.00",
			),
			ExpHdrs: hdrs(
				hdr("", fldTypeDecimal2),
				hdr("an_int", fldTypeInt),
			),
			ExpRows: rows(
				row(pql.NewDecimal(23456, 2), int64(22)),
			),
			Compare:        CompareExactUnordered,
			SortStringKeys: true,
		},
		{
			name: "sum-int",
			SQLs: sqls(
				"select sum(an_int), an_int from having_test group by an_int having sum(an_int) < 25",
			),
			ExpHdrs: hdrs(
				hdr("", fldTypeInt),
				hdr("an_int", fldTypeInt),
			),
			ExpRows: rows(
				row(int64(22), int64(11)),
				row(int64(22), int64(22)),
			),
			Compare:        CompareExactUnordered,
			SortStringKeys: true,
		},
		// may fail in DAX due to missing string translation.
		{
			name: "string",
			SQLs: sqls(
				"select a_string, count(*) from having_test group by a_string having count(*) > 1",
			),
			ExpHdrs: hdrs(
				hdr("a_string", fldTypeString),
				hdr("", fldTypeInt),
			),
			ExpRows: rows(
				row(string("str1"), int64(2)),
			),
			Compare:        CompareExactUnordered,
			SortStringKeys: true,
		},
	},
}
