package dataselect // DataSelectQuery is options for GenericDataSelect which takes []GenericDataCell and returns selected data. // Can be extended to include any kind of selection - for example filtering. // Currently included only Pagination and Sort options. type DataSelectQuery struct { PaginationQuery *PaginationQuery SortQuery *SortQuery FilterQuery *FilterQuery } // PaginationQuery structure represents pagination settings type PaginationQuery struct { // How many items per page should be returned ItemsPerPage int // Number of page that should be returned when pagination is applied to the list Page int } // SortQuery holds options for sort functionality of data select. type SortQuery struct { SortByList []SortBy } // SortBy holds the name of the property that should be sorted and whether order should be ascending or descending. type SortBy struct { Property PropertyName Ascending bool } type FilterQuery struct { FilterByList []FilterBy } type FilterBy struct { Property PropertyName Value ComparableValue } var NoFilter = &FilterQuery{ FilterByList: []FilterBy{}, } // NoSort is as option for no sort. var NoSort = &SortQuery{ SortByList: []SortBy{}, } // NewFilterQuery takes raw filter options list and returns FilterQuery object. For example: // ["parameter1", "value1", "parameter2", "value2"] - means that the data should be filtered by // parameter1 equals value1 and parameter2 equals value2 func NewFilterQuery(filterByListRaw []string) *FilterQuery { if filterByListRaw == nil || len(filterByListRaw)%2 == 1 { return NoFilter } filterByList := []FilterBy{} for i := 0; i+1 < len(filterByListRaw); i += 2 { propertyName := filterByListRaw[i] propertyValue := filterByListRaw[i+1] filterBy := FilterBy{ Property: PropertyName(propertyName), Value: StdComparableString(propertyValue), } // Add to the filter options. filterByList = append(filterByList, filterBy) } return &FilterQuery{ FilterByList: filterByList, } } // NewSortQuery takes raw sort options list and returns SortQuery object. For example: // ["a", "parameter1", "d", "parameter2"] - means that the data should be sorted by // parameter1 (ascending) and later - for results that return equal under parameter 1 sort - by parameter2 (descending) func NewSortQuery(sortByListRaw []string) *SortQuery { if sortByListRaw == nil || len(sortByListRaw)%2 == 1 { // Empty sort list or invalid (odd) length return NoSort } sortByList := []SortBy{} for i := 0; i+1 < len(sortByListRaw); i += 2 { // parse order option var ascending bool orderOption := sortByListRaw[i] if orderOption == "a" { ascending = true } else if orderOption == "d" { ascending = false } else { // Invalid order option. Only ascending (a), descending (d) options are supported return NoSort } // parse property name propertyName := sortByListRaw[i+1] sortBy := SortBy{ Property: PropertyName(propertyName), Ascending: ascending, } // Add to the sort options. sortByList = append(sortByList, sortBy) } return &SortQuery{ SortByList: sortByList, } } // NewDataSelectQuery creates DataSelectQuery object from simpler data select queries. func NewDataSelectQuery(paginationQuery *PaginationQuery, sortQuery *SortQuery, filterQuery *FilterQuery) *DataSelectQuery { return &DataSelectQuery{ PaginationQuery: paginationQuery, SortQuery: sortQuery, FilterQuery: filterQuery, } } // DefaultDataSelect downloads first 10 items from page 1 with no sort and no metrics. var DefaultDataSelect = NewDataSelectQuery(DefaultPagination, NoSort, NoFilter)