diff --git a/pkg/storage/donut/bucket.go b/pkg/storage/donut/bucket.go index bac6baa06..8116c1c89 100644 --- a/pkg/storage/donut/bucket.go +++ b/pkg/storage/donut/bucket.go @@ -160,36 +160,36 @@ func (b bucket) ListObjects(prefix, marker, delimiter string, maxkeys int) ([]st for objectName := range bucketMetadata.Buckets[b.getBucketName()].BucketObjects { if strings.HasPrefix(objectName, strings.TrimSpace(prefix)) { if objectName > marker { - objects = appendUniq(objects, objectName) + objects = AppendU(objects, objectName) } } } if strings.TrimSpace(prefix) != "" { - objects = removePrefix(objects, prefix) + objects = TrimPrefix(objects, prefix) } var prefixes []string var filteredObjects []string if strings.TrimSpace(delimiter) != "" { - filteredObjects = filterDelimited(objects, delimiter) - prefixes = filterNotDelimited(objects, delimiter) - prefixes = extractDelimited(prefixes, delimiter) - prefixes = uniqueObjects(prefixes) + filteredObjects = HasNoDelimiter(objects, delimiter) + prefixes = HasDelimiter(objects, delimiter) + prefixes = SplitDelimiter(prefixes, delimiter) + prefixes = SortU(prefixes) } else { filteredObjects = objects } var results []string var commonPrefixes []string + for _, commonPrefix := range prefixes { + commonPrefixes = AppendU(commonPrefixes, prefix+commonPrefix) + } sort.Strings(filteredObjects) for _, objectName := range filteredObjects { if len(results) >= maxkeys { isTruncated = true break } - results = appendUniq(results, prefix+objectName) - } - for _, commonPrefix := range prefixes { - commonPrefixes = appendUniq(commonPrefixes, prefix+commonPrefix) + results = AppendU(results, prefix+objectName) } sort.Strings(results) sort.Strings(commonPrefixes) diff --git a/pkg/storage/donut/common.go b/pkg/storage/donut/common.go index fcafb7177..9fbb18eb6 100644 --- a/pkg/storage/donut/common.go +++ b/pkg/storage/donut/common.go @@ -1,3 +1,19 @@ +/* + * Minimalist Object Storage, (C) 2015 Minio, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package donut import ( @@ -5,7 +21,8 @@ import ( "strings" ) -func appendUniq(slice []string, i string) []string { +// AppendU append to an input slice if the element is unique and provides a new slice +func AppendU(slice []string, i string) []string { for _, ele := range slice { if ele == i { return slice @@ -14,17 +31,8 @@ func appendUniq(slice []string, i string) []string { return append(slice, i) } -func filterPrefix(objects []string, prefix string) []string { - var results []string - for _, object := range objects { - if strings.HasPrefix(object, prefix) { - results = append(results, object) - } - } - return results -} - -func removePrefix(objects []string, prefix string) []string { +// TrimPrefix trims off a prefix string from all the elements in a given slice +func TrimPrefix(objects []string, prefix string) []string { var results []string for _, object := range objects { results = append(results, strings.TrimPrefix(object, prefix)) @@ -32,7 +40,8 @@ func removePrefix(objects []string, prefix string) []string { return results } -func filterDelimited(objects []string, delim string) []string { +// HasNoDelimiter provides a new slice from an input slice which has elements without delimiter +func HasNoDelimiter(objects []string, delim string) []string { var results []string for _, object := range objects { if !strings.Contains(object, delim) { @@ -42,7 +51,8 @@ func filterDelimited(objects []string, delim string) []string { return results } -func filterNotDelimited(objects []string, delim string) []string { +// HasDelimiter provides a new slice from an input slice which has elements with a delimiter +func HasDelimiter(objects []string, delim string) []string { var results []string for _, object := range objects { if strings.Contains(object, delim) { @@ -52,7 +62,8 @@ func filterNotDelimited(objects []string, delim string) []string { return results } -func extractDelimited(objects []string, delim string) []string { +// SplitDelimiter provides a new slice from an input slice by splitting a delimiter +func SplitDelimiter(objects []string, delim string) []string { var results []string for _, object := range objects { parts := strings.Split(object, delim) @@ -61,7 +72,8 @@ func extractDelimited(objects []string, delim string) []string { return results } -func uniqueObjects(objects []string) []string { +// SortU sort a slice in lexical order, removing duplicate elements +func SortU(objects []string) []string { objectMap := make(map[string]string) for _, v := range objects { objectMap[v] = v