From 787cdb33cfce7c229a5d6a63083f233d33b09d0a Mon Sep 17 00:00:00 2001 From: Pijus Kamandulis Date: Sat, 8 Feb 2025 15:28:06 +0200 Subject: [PATCH] Fix OFFSET clause --- query_executors/memory_executor/memory_executor.go | 9 +++++++++ query_executors/memory_executor/select_test.go | 12 ++++++------ 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/query_executors/memory_executor/memory_executor.go b/query_executors/memory_executor/memory_executor.go index 0ba71ff..2f34449 100644 --- a/query_executors/memory_executor/memory_executor.go +++ b/query_executors/memory_executor/memory_executor.go @@ -60,6 +60,15 @@ func ExecuteQuery(query parsers.SelectStmt, documents []RowType) []RowType { projectedDocuments = deduplicate(projectedDocuments) } + // Apply offset + if query.Offset > 0 { + if query.Offset < len(projectedDocuments) { + projectedDocuments = projectedDocuments[query.Offset:] + } else { + projectedDocuments = []RowType{} + } + } + // Apply result limit if query.Count > 0 && len(projectedDocuments) > query.Count { projectedDocuments = projectedDocuments[:query.Count] diff --git a/query_executors/memory_executor/select_test.go b/query_executors/memory_executor/select_test.go index 550ac73..3b9e83d 100644 --- a/query_executors/memory_executor/select_test.go +++ b/query_executors/memory_executor/select_test.go @@ -10,10 +10,10 @@ import ( func Test_Execute_Select(t *testing.T) { mockData := []memoryexecutor.RowType{ - map[string]interface{}{"id": "12345", "pk": 123, "_self": "self1", "_rid": "rid1", "_ts": 123456, "isCool": false}, - map[string]interface{}{"id": "67890", "pk": 456, "_self": "self2", "_rid": "rid2", "_ts": 789012, "isCool": true}, - map[string]interface{}{"id": "456", "pk": 456, "_self": "self2", "_rid": "rid2", "_ts": 789012, "isCool": true}, - map[string]interface{}{"id": "123", "pk": 456, "_self": "self2", "_rid": "rid2", "_ts": 789012, "isCool": true}, + map[string]interface{}{"id": "12345", "pk": 123, "_self": "self1", "_rid": "rid1", "_ts": 123456, "isCool": false, "order": 1}, + map[string]interface{}{"id": "67890", "pk": 456, "_self": "self2", "_rid": "rid2", "_ts": 789012, "isCool": true, "order": 2}, + map[string]interface{}{"id": "456", "pk": 456, "_self": "self2", "_rid": "rid2", "_ts": 789012, "isCool": true, "order": 3}, + map[string]interface{}{"id": "123", "pk": 456, "_self": "self2", "_rid": "rid2", "_ts": 789012, "isCool": true, "order": 4}, } t.Run("Should execute simple SELECT", func(t *testing.T) { @@ -108,15 +108,15 @@ func Test_Execute_Select(t *testing.T) { Offset: 1, OrderExpressions: []parsers.OrderExpression{ { - SelectItem: parsers.SelectItem{Path: []string{"c", "id"}}, + SelectItem: parsers.SelectItem{Path: []string{"c", "order"}}, Direction: parsers.OrderDirectionDesc, }, }, }, mockData, []memoryexecutor.RowType{ - map[string]interface{}{"id": "67890", "pk": 456}, map[string]interface{}{"id": "456", "pk": 456}, + map[string]interface{}{"id": "67890", "pk": 456}, }, ) })