From ac38d13f04ff7f4c1680f82675108945f3f8c489 Mon Sep 17 00:00:00 2001 From: Leonard Lyubich Date: Tue, 27 Oct 2020 21:11:58 +0300 Subject: [PATCH] [#182] sdk/object: Refactor a way to add filters by properties Signed-off-by: Leonard Lyubich --- pkg/object/search.go | 47 +++++++++++++++++++++++++++------ pkg/object/search_test.go | 17 ++++++------ pkg/object/wellknown_filters.go | 31 ---------------------- pkg/object/wellknown_headers.go | 31 ---------------------- 4 files changed, 47 insertions(+), 79 deletions(-) delete mode 100644 pkg/object/wellknown_filters.go delete mode 100644 pkg/object/wellknown_headers.go diff --git a/pkg/object/search.go b/pkg/object/search.go index dcf7cc9..ac83220 100644 --- a/pkg/object/search.go +++ b/pkg/object/search.go @@ -54,6 +54,8 @@ type filterKey struct { // enumeration of reserved filter keys. type filterKeyType int +type boolStringer bool + type SearchFilters []SearchFilter const ( @@ -67,6 +69,9 @@ const ( fKeyType fKeyHomomorphicHash fKeyParent + fKeyPropRoot + fKeyPropLeaf + fKeyPropChildfree ) func (k filterKey) String() string { @@ -91,6 +96,12 @@ func (k filterKey) String() string { return v2object.FilterHeaderHomomorphicHash case fKeyParent: return v2object.FilterHeaderParent + case fKeyPropRoot: + return v2object.FilterPropertyRoot + case fKeyPropLeaf: + return v2object.FilterPropertyLeaf + case fKeyPropChildfree: + return v2object.FilterPropertyChildfree } } @@ -98,6 +109,14 @@ func (s staticStringer) String() string { return string(s) } +func (s boolStringer) String() string { + if s { + return v2object.BooleanPropertyValueTrue + } + + return v2object.BooleanPropertyValueFalse +} + func (f *SearchFilter) Header() string { return f.header.String() } @@ -180,26 +199,38 @@ func (f SearchFilters) ToV2() []*v2object.SearchFilter { return result } -func (f *SearchFilters) addRootFilter(val string) { - f.AddFilter(KeyRoot, val, MatchStringEqual) +func (f *SearchFilters) addRootFilter(val bool) { + f.addReservedFilter(MatchStringEqual, fKeyPropRoot, boolStringer(val)) } func (f *SearchFilters) AddRootFilter() { - f.addRootFilter(ValRoot) + f.addRootFilter(true) } func (f *SearchFilters) AddNonRootFilter() { - f.addRootFilter(ValNonRoot) + f.addRootFilter(false) } -func (f *SearchFilters) addLeafFilter(val string) { - f.AddFilter(KeyLeaf, val, MatchStringEqual) +func (f *SearchFilters) addLeafFilter(val bool) { + f.addReservedFilter(MatchStringEqual, fKeyPropLeaf, boolStringer(val)) } func (f *SearchFilters) AddLeafFilter() { - f.addLeafFilter(ValLeaf) + f.addLeafFilter(true) } func (f *SearchFilters) AddNonLeafFilter() { - f.addLeafFilter(ValNonLeaf) + f.addLeafFilter(false) +} + +func (f *SearchFilters) addChildFreeFilter(val bool) { + f.addReservedFilter(MatchStringEqual, fKeyPropChildfree, boolStringer(val)) +} + +func (f *SearchFilters) AddChildfreeFilter() { + f.addChildFreeFilter(true) +} + +func (f *SearchFilters) AddNonChildfreeFilter() { + f.addChildFreeFilter(false) } diff --git a/pkg/object/search_test.go b/pkg/object/search_test.go index d3916ad..8abce4b 100644 --- a/pkg/object/search_test.go +++ b/pkg/object/search_test.go @@ -32,7 +32,6 @@ func TestMatch(t *testing.T) { func TestFilter(t *testing.T) { inputs := [][]string{ {"user-header", "user-value"}, - {object.HdrSysNameID, "objectID"}, } filters := object.NewSearchFilters() @@ -62,8 +61,8 @@ func TestSearchFilters_AddRootFilter(t *testing.T) { f := (*fs)[0] require.Equal(t, object.MatchStringEqual, f.Operation()) - require.Equal(t, object.KeyRoot, f.Header()) - require.Equal(t, object.ValRoot, f.Value()) + require.Equal(t, v2object.FilterPropertyRoot, f.Header()) + require.Equal(t, v2object.BooleanPropertyValueTrue, f.Value()) } func TestSearchFilters_AddNonRootFilter(t *testing.T) { @@ -76,8 +75,8 @@ func TestSearchFilters_AddNonRootFilter(t *testing.T) { f := (*fs)[0] require.Equal(t, object.MatchStringEqual, f.Operation()) - require.Equal(t, object.KeyRoot, f.Header()) - require.Equal(t, object.ValNonRoot, f.Value()) + require.Equal(t, v2object.FilterPropertyRoot, f.Header()) + require.Equal(t, v2object.BooleanPropertyValueFalse, f.Value()) } func TestSearchFilters_AddLeafFilter(t *testing.T) { @@ -90,8 +89,8 @@ func TestSearchFilters_AddLeafFilter(t *testing.T) { f := (*fs)[0] require.Equal(t, object.MatchStringEqual, f.Operation()) - require.Equal(t, object.KeyLeaf, f.Header()) - require.Equal(t, object.ValLeaf, f.Value()) + require.Equal(t, v2object.FilterPropertyLeaf, f.Header()) + require.Equal(t, v2object.BooleanPropertyValueTrue, f.Value()) } func TestSearchFilters_AddNonLeafFilter(t *testing.T) { @@ -104,6 +103,6 @@ func TestSearchFilters_AddNonLeafFilter(t *testing.T) { f := (*fs)[0] require.Equal(t, object.MatchStringEqual, f.Operation()) - require.Equal(t, object.KeyLeaf, f.Header()) - require.Equal(t, object.ValNonLeaf, f.Value()) + require.Equal(t, v2object.FilterPropertyLeaf, f.Header()) + require.Equal(t, v2object.BooleanPropertyValueFalse, f.Value()) } diff --git a/pkg/object/wellknown_filters.go b/pkg/object/wellknown_filters.go deleted file mode 100644 index 734a196..0000000 --- a/pkg/object/wellknown_filters.go +++ /dev/null @@ -1,31 +0,0 @@ -package object - -const ( - valFalse = "false" - valTrue = "true" -) - -// ReservedFilterPrefix is a reserved prefix for system search filter keys. -const ReservedFilterPrefix = "$Object:" - -const ( - // KeyRoot is a reserved search filter key to source objects. - KeyRoot = ReservedFilterPrefix + "ROOT" - - // ValRoot is a value of root object filter. - ValRoot = valTrue - - // ValNonRoot is a value of non-root object filter. - ValNonRoot = valFalse -) - -const ( - // KeyLeaf is a reserved search filter key to physically stored objects. - KeyLeaf = ReservedFilterPrefix + "LEAF" - - // ValLeaf is a value of physically stored object filter. - ValLeaf = valTrue - - // ValNonLeaf is a value of virtual object filter. - ValNonLeaf = valFalse -) diff --git a/pkg/object/wellknown_headers.go b/pkg/object/wellknown_headers.go deleted file mode 100644 index 02e2e78..0000000 --- a/pkg/object/wellknown_headers.go +++ /dev/null @@ -1,31 +0,0 @@ -package object - -// This file contains well-known header names for eACL filters and search -// request filters. Both of them encode header type as string. There are -// constant strings for well-known object headers. - -const ( - // ReservedHeaderNamePrefix used in filter names to specify well known - // headers such as container id, object id, owner id, etc. - // All names without this prefix used to lookup through user defined headers - // in object or x-headers in request. - ReservedHeaderNamePrefix = "_" - - // HdrSysNameID is a name of ID field in system header of object. - HdrSysNameID = ReservedHeaderNamePrefix + "ID" - - // HdrSysNameCID is a name of cid field in system header of object. - HdrSysNameCID = ReservedHeaderNamePrefix + "CID" - - // HdrSysNameOwnerID is a name of OwnerID field in system header of object. - HdrSysNameOwnerID = ReservedHeaderNamePrefix + "OWNER_ID" - - // HdrSysNameVersion is a name of version field in system header of object. - HdrSysNameVersion = ReservedHeaderNamePrefix + "VERSION" - - // HdrSysNamePayloadLength is a name of PayloadLength field in system header of object. - HdrSysNamePayloadLength = ReservedHeaderNamePrefix + "PAYLOAD_LENGTH" - - // HdrSysNameCreatedEpoch is a name of CreatedAt.Epoch field in system header of object. - HdrSysNameCreatedEpoch = ReservedHeaderNamePrefix + "CREATED_EPOCH" -)