From 0d59c22dc4716edac34a512845b8499ef7202403 Mon Sep 17 00:00:00 2001 From: scortier Date: Thu, 19 May 2022 14:57:00 +0530 Subject: [PATCH 1/3] fix: specify sql query order --- store/postgres/asset_repository.go | 6 +++--- store/postgres/asset_repository_test.go | 7 ++++--- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/store/postgres/asset_repository.go b/store/postgres/asset_repository.go index b07365d5..9936bc96 100644 --- a/store/postgres/asset_repository.go +++ b/store/postgres/asset_repository.go @@ -678,7 +678,7 @@ func (r *AssetRepository) BuildFilterQuery(builder sq.SelectBuilder, flt asset.F finalQuery: fmt.Sprint("%", flt.Query, "%"), }) } - builder = builder.Where(orClause) + builder = builder.Where(orClause).OrderBy("data") } if len(flt.Data) > 0 { @@ -692,10 +692,10 @@ func (r *AssetRepository) BuildFilterQuery(builder sq.SelectBuilder, flt asset.F sq.NotEq{field: "{}"}, // field is not empty object sq.NotEq{field: "\"\""}, // field is not empty string } - builder = builder.Where(whereClause) + builder = builder.Where(whereClause).OrderBy("data") } else { finalQuery := r.buildDataField(key, false) - builder = builder.Where(fmt.Sprintf("%s = '%s'", finalQuery, val)) + builder = builder.Where(fmt.Sprintf("%s = '%s'", finalQuery, val)).OrderBy("data") } } } diff --git a/store/postgres/asset_repository_test.go b/store/postgres/asset_repository_test.go index 68a51866..2eb6b0ab 100644 --- a/store/postgres/asset_repository_test.go +++ b/store/postgres/asset_repository_test.go @@ -132,7 +132,7 @@ func (r *AssetRepositoryTestSuite) insertRecord() (assets []asset.Asset) { } func (r *AssetRepositoryTestSuite) TestBuildFilterQuery() { - r.builder = sq.Select(`a.test as test`) + r.builder = sq.Select(`data, type, name, service`) testCases := []struct { description string @@ -199,8 +199,9 @@ func (r *AssetRepositoryTestSuite) TestBuildFilterQuery() { query, err = sq.Dollar.ReplacePlaceholders(query) r.Require().NoError(err) - actualQuery := strings.Split(query, "WHERE ") - r.Equal(testCase.expectedQuery, actualQuery[1]) + tempQuery := strings.Split(query, "WHERE ") + actualQuery := strings.Split(tempQuery[1], " ORDER") + r.Equal(testCase.expectedQuery, actualQuery[0]) }) } } From eb3f37c60ea008f9fcf11512388c00635213fda4 Mon Sep 17 00:00:00 2001 From: scortier Date: Thu, 19 May 2022 15:52:55 +0530 Subject: [PATCH 2/3] refactor: update test --- store/postgres/asset_repository.go | 6 +++--- store/postgres/asset_repository_test.go | 17 ++++++++--------- 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/store/postgres/asset_repository.go b/store/postgres/asset_repository.go index 9936bc96..b07365d5 100644 --- a/store/postgres/asset_repository.go +++ b/store/postgres/asset_repository.go @@ -678,7 +678,7 @@ func (r *AssetRepository) BuildFilterQuery(builder sq.SelectBuilder, flt asset.F finalQuery: fmt.Sprint("%", flt.Query, "%"), }) } - builder = builder.Where(orClause).OrderBy("data") + builder = builder.Where(orClause) } if len(flt.Data) > 0 { @@ -692,10 +692,10 @@ func (r *AssetRepository) BuildFilterQuery(builder sq.SelectBuilder, flt asset.F sq.NotEq{field: "{}"}, // field is not empty object sq.NotEq{field: "\"\""}, // field is not empty string } - builder = builder.Where(whereClause).OrderBy("data") + builder = builder.Where(whereClause) } else { finalQuery := r.buildDataField(key, false) - builder = builder.Where(fmt.Sprintf("%s = '%s'", finalQuery, val)).OrderBy("data") + builder = builder.Where(fmt.Sprintf("%s = '%s'", finalQuery, val)) } } } diff --git a/store/postgres/asset_repository_test.go b/store/postgres/asset_repository_test.go index 2eb6b0ab..16987d94 100644 --- a/store/postgres/asset_repository_test.go +++ b/store/postgres/asset_repository_test.go @@ -132,7 +132,7 @@ func (r *AssetRepositoryTestSuite) insertRecord() (assets []asset.Asset) { } func (r *AssetRepositoryTestSuite) TestBuildFilterQuery() { - r.builder = sq.Select(`data, type, name, service`) + r.builder = sq.Select(`a.test as test`) testCases := []struct { description string @@ -169,25 +169,25 @@ func (r *AssetRepositoryTestSuite) TestBuildFilterQuery() { }, expectedQuery: `(data->'landscape'->'properties'->>'project-id' ILIKE $1 OR description ILIKE $2)`, }, + // NOTE: The data entries contain in the map does not produce any specific order for query, generated query + // will be of random order. { description: "should return sql query with asset's data fields filter", config: asset.Filter{ Data: map[string]string{ - "entity": "odpf", - "country": "th", + "entity": "odpf", }, }, - expectedQuery: `data->>'entity' = 'odpf' AND data->>'country' = 'th'`, + expectedQuery: `data->>'entity' = 'odpf'`, }, { description: "should return sql query with asset's nested data fields filter", config: asset.Filter{ Data: map[string]string{ "landscape.properties.project-id": "compass_001", - "country": "vn", }, }, - expectedQuery: `data->'landscape'->'properties'->>'project-id' = 'compass_001' AND data->>'country' = 'vn'`, + expectedQuery: `data->'landscape'->'properties'->>'project-id' = 'compass_001'`, }, } @@ -199,9 +199,8 @@ func (r *AssetRepositoryTestSuite) TestBuildFilterQuery() { query, err = sq.Dollar.ReplacePlaceholders(query) r.Require().NoError(err) - tempQuery := strings.Split(query, "WHERE ") - actualQuery := strings.Split(tempQuery[1], " ORDER") - r.Equal(testCase.expectedQuery, actualQuery[0]) + actualQuery := strings.Split(query, "WHERE ") + r.Equal(testCase.expectedQuery, actualQuery[1]) }) } } From 1d35e1cfc1d01264335d0486f2dca0a0da179601 Mon Sep 17 00:00:00 2001 From: scortier Date: Fri, 20 May 2022 09:39:10 +0530 Subject: [PATCH 3/3] docs: update comment in data filter test --- store/postgres/asset_repository_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/store/postgres/asset_repository_test.go b/store/postgres/asset_repository_test.go index 16987d94..7810e11c 100644 --- a/store/postgres/asset_repository_test.go +++ b/store/postgres/asset_repository_test.go @@ -169,9 +169,9 @@ func (r *AssetRepositoryTestSuite) TestBuildFilterQuery() { }, expectedQuery: `(data->'landscape'->'properties'->>'project-id' ILIKE $1 OR description ILIKE $2)`, }, - // NOTE: The data entries contain in the map does not produce any specific order for query, generated query - // will be of random order. { + // NOTE: Cannot have more than one key in map because golang's map does not guarantee order thus producing + // inconsistent test. description: "should return sql query with asset's data fields filter", config: asset.Filter{ Data: map[string]string{