From 16171b3e65be5211bd2e42d04621b589d1688c57 Mon Sep 17 00:00:00 2001 From: Todd Gruben Date: Mon, 2 Dec 2019 20:51:56 -0600 Subject: [PATCH 1/2] return total match counts for either min or max --- executor.go | 12 +++++-- executor_test.go | 87 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 97 insertions(+), 2 deletions(-) diff --git a/executor.go b/executor.go index 5d8c94c75..9a39d7697 100644 --- a/executor.go +++ b/executor.go @@ -3769,9 +3769,13 @@ func (vc *ValCount) smaller(other ValCount) ValCount { if vc.Count == 0 || (other.Val < vc.Val && other.Count > 0) { return other } + extra := int64(0) + if vc.Val == other.Val { + extra += other.Count + } return ValCount{ Val: vc.Val, - Count: vc.Count, + Count: vc.Count + extra, } } @@ -3780,9 +3784,13 @@ func (vc *ValCount) larger(other ValCount) ValCount { if vc.Count == 0 || (other.Val > vc.Val && other.Count > 0) { return other } + extra := int64(0) + if vc.Val == other.Val { + extra += other.Count + } return ValCount{ Val: vc.Val, - Count: vc.Count, + Count: vc.Count + extra, } } diff --git a/executor_test.go b/executor_test.go index 212b1eebf..8eae51f1c 100644 --- a/executor_test.go +++ b/executor_test.go @@ -4254,3 +4254,90 @@ func TestExecutor_Execute_IncludesColumn(t *testing.T) { }) }) } + +func TestExecutor_Execute_MinMaxCountEqual(t *testing.T) { + t.Run("ColumnID", func(t *testing.T) { + c := test.MustRunCluster(t, 1) + defer c.Close() + hldr := test.Holder{Holder: c[0].Server.Holder()} + + idx, err := hldr.CreateIndex("i", pilosa.IndexOptions{}) + if err != nil { + t.Fatal(err) + } + + if _, err := idx.CreateField("x", pilosa.OptFieldTypeDefault()); err != nil { + t.Fatal(err) + } + + if _, err := idx.CreateField("f", pilosa.OptFieldTypeInt(-1100, 1000)); err != nil { + t.Fatal(err) + } + + if _, err := c[0].API.Query(context.Background(), &pilosa.QueryRequest{Index: "i", Query: ` + Set(0, f=3) + Set(1, f=3) + Set(2, f=4) + Set(3, f=5) + Set(4, f=5) + Set(` + strconv.Itoa(ShardWidth+1) + `, f=3) + Set(` + strconv.Itoa(ShardWidth+2) + `, f=5) + Set(` + strconv.Itoa(ShardWidth+3) + `, f=5) + Set(` + strconv.Itoa(ShardWidth+4) + `, f=5) + Set(` + strconv.Itoa(ShardWidth+5) + `, f=4) + Set(` + strconv.Itoa(2*ShardWidth+1) + `, f=3) + Set(0, x=3) + Set(1, x=3) + + `}); err != nil { + t.Fatal(err) + } + + t.Run("Min", func(t *testing.T) { + tests := []struct { + filter string + exp int64 + cnt int64 + }{ + {filter: ``, exp: 3, cnt: 4}, + {filter: `Row(x=3)`, exp: 3, cnt: 2}, + } + for i, tt := range tests { + var pql string + if tt.filter == "" { + pql = `Min(field=f)` + } else { + pql = fmt.Sprintf(`Min(%s, field=f)`, tt.filter) + } + if result, err := c[0].API.Query(context.Background(), &pilosa.QueryRequest{Index: "i", Query: pql}); err != nil { + t.Fatal(err) + } else if !reflect.DeepEqual(result.Results[0], pilosa.ValCount{Val: tt.exp, Count: tt.cnt}) { + t.Fatalf("unexpected result, test %d: %s", i, spew.Sdump(result)) + } + } + }) + + t.Run("Max", func(t *testing.T) { + tests := []struct { + filter string + exp int64 + cnt int64 + }{ + {filter: ``, exp: 5, cnt: 5}, + } + for i, tt := range tests { + var pql string + if tt.filter == "" { + pql = `Max(field=f)` + } else { + pql = fmt.Sprintf(`Max(%s, field=f)`, tt.filter) + } + if result, err := c[0].API.Query(context.Background(), &pilosa.QueryRequest{Index: "i", Query: pql}); err != nil { + t.Fatal(err) + } else if !reflect.DeepEqual(result.Results[0], pilosa.ValCount{Val: tt.exp, Count: tt.cnt}) { + t.Fatalf("unexpected result, test %d: %s", i, spew.Sdump(result)) + } + } + }) + }) +} From 4523a4d6932a3c23f0f51fc0c37c3d347b025188 Mon Sep 17 00:00:00 2001 From: Todd Gruben Date: Mon, 2 Dec 2019 21:46:41 -0600 Subject: [PATCH 2/2] removed uneeded test run --- executor_test.go | 118 +++++++++++++++++++++++------------------------ 1 file changed, 58 insertions(+), 60 deletions(-) diff --git a/executor_test.go b/executor_test.go index 8eae51f1c..cea26c8af 100644 --- a/executor_test.go +++ b/executor_test.go @@ -4256,25 +4256,24 @@ func TestExecutor_Execute_IncludesColumn(t *testing.T) { } func TestExecutor_Execute_MinMaxCountEqual(t *testing.T) { - t.Run("ColumnID", func(t *testing.T) { - c := test.MustRunCluster(t, 1) - defer c.Close() - hldr := test.Holder{Holder: c[0].Server.Holder()} + c := test.MustRunCluster(t, 1) + defer c.Close() + hldr := test.Holder{Holder: c[0].Server.Holder()} - idx, err := hldr.CreateIndex("i", pilosa.IndexOptions{}) - if err != nil { - t.Fatal(err) - } + idx, err := hldr.CreateIndex("i", pilosa.IndexOptions{}) + if err != nil { + t.Fatal(err) + } - if _, err := idx.CreateField("x", pilosa.OptFieldTypeDefault()); err != nil { - t.Fatal(err) - } + if _, err := idx.CreateField("x", pilosa.OptFieldTypeDefault()); err != nil { + t.Fatal(err) + } - if _, err := idx.CreateField("f", pilosa.OptFieldTypeInt(-1100, 1000)); err != nil { - t.Fatal(err) - } + if _, err := idx.CreateField("f", pilosa.OptFieldTypeInt(-1100, 1000)); err != nil { + t.Fatal(err) + } - if _, err := c[0].API.Query(context.Background(), &pilosa.QueryRequest{Index: "i", Query: ` + if _, err := c[0].API.Query(context.Background(), &pilosa.QueryRequest{Index: "i", Query: ` Set(0, f=3) Set(1, f=3) Set(2, f=4) @@ -4290,54 +4289,53 @@ func TestExecutor_Execute_MinMaxCountEqual(t *testing.T) { Set(1, x=3) `}); err != nil { - t.Fatal(err) + t.Fatal(err) + } + + t.Run("Min", func(t *testing.T) { + tests := []struct { + filter string + exp int64 + cnt int64 + }{ + {filter: ``, exp: 3, cnt: 4}, + {filter: `Row(x=3)`, exp: 3, cnt: 2}, } + for i, tt := range tests { + var pql string + if tt.filter == "" { + pql = `Min(field=f)` + } else { + pql = fmt.Sprintf(`Min(%s, field=f)`, tt.filter) + } + if result, err := c[0].API.Query(context.Background(), &pilosa.QueryRequest{Index: "i", Query: pql}); err != nil { + t.Fatal(err) + } else if !reflect.DeepEqual(result.Results[0], pilosa.ValCount{Val: tt.exp, Count: tt.cnt}) { + t.Fatalf("unexpected result, test %d: %s", i, spew.Sdump(result)) + } + } + }) - t.Run("Min", func(t *testing.T) { - tests := []struct { - filter string - exp int64 - cnt int64 - }{ - {filter: ``, exp: 3, cnt: 4}, - {filter: `Row(x=3)`, exp: 3, cnt: 2}, + t.Run("Max", func(t *testing.T) { + tests := []struct { + filter string + exp int64 + cnt int64 + }{ + {filter: ``, exp: 5, cnt: 5}, + } + for i, tt := range tests { + var pql string + if tt.filter == "" { + pql = `Max(field=f)` + } else { + pql = fmt.Sprintf(`Max(%s, field=f)`, tt.filter) } - for i, tt := range tests { - var pql string - if tt.filter == "" { - pql = `Min(field=f)` - } else { - pql = fmt.Sprintf(`Min(%s, field=f)`, tt.filter) - } - if result, err := c[0].API.Query(context.Background(), &pilosa.QueryRequest{Index: "i", Query: pql}); err != nil { - t.Fatal(err) - } else if !reflect.DeepEqual(result.Results[0], pilosa.ValCount{Val: tt.exp, Count: tt.cnt}) { - t.Fatalf("unexpected result, test %d: %s", i, spew.Sdump(result)) - } + if result, err := c[0].API.Query(context.Background(), &pilosa.QueryRequest{Index: "i", Query: pql}); err != nil { + t.Fatal(err) + } else if !reflect.DeepEqual(result.Results[0], pilosa.ValCount{Val: tt.exp, Count: tt.cnt}) { + t.Fatalf("unexpected result, test %d: %s", i, spew.Sdump(result)) } - }) - - t.Run("Max", func(t *testing.T) { - tests := []struct { - filter string - exp int64 - cnt int64 - }{ - {filter: ``, exp: 5, cnt: 5}, - } - for i, tt := range tests { - var pql string - if tt.filter == "" { - pql = `Max(field=f)` - } else { - pql = fmt.Sprintf(`Max(%s, field=f)`, tt.filter) - } - if result, err := c[0].API.Query(context.Background(), &pilosa.QueryRequest{Index: "i", Query: pql}); err != nil { - t.Fatal(err) - } else if !reflect.DeepEqual(result.Results[0], pilosa.ValCount{Val: tt.exp, Count: tt.cnt}) { - t.Fatalf("unexpected result, test %d: %s", i, spew.Sdump(result)) - } - } - }) + } }) }