gooddata-js v13.5.0

File: src/DataLayer/utils/ResultSpecUtils.ts

                        // (C) 2007-2018 GoodData Corporation
                        import { AFM } from "@gooddata/typings";
                        import { normalizeAfm } from "./AfmUtils";
                        
                        /**
                         * Attaches sorts into resultSpec
                         *
                         * @method applySorting
                         * @param {AFM.IResultSpec} resultSpec
                         * @param {AFM.SortItem[]} sortItems
                         * @returns {AFM.IResultSpec}
                         */
                        export function applySorting(
                            resultSpec: AFM.IResultSpec = {},
                            sortItems: AFM.SortItem[] = [],
                        ): AFM.IResultSpec {
                            if (sortItems.length === 0) {
                                return resultSpec;
                            }
                            return {
                                ...resultSpec,
                                sorts: sortItems,
                            };
                        }
                        
                        function sortItemIsAttribute(sortItem: AFM.SortItem): sortItem is AFM.IAttributeSortItem {
                            return !!(sortItem as AFM.IAttributeSortItem).attributeSortItem;
                        }
                        
                        function sortItemIsMeasure(sortItem: AFM.SortItem): sortItem is AFM.IMeasureSortItem {
                            return !sortItemIsAttribute(sortItem);
                        }
                        
                        function locatorIsMeasure(locator: AFM.LocatorItem): locator is AFM.IMeasureLocatorItem {
                            return !!(locator as AFM.IMeasureLocatorItem).measureLocatorItem;
                        }
                        
                        function getSortItemIdentifier(sortItem: AFM.SortItem): string | null {
                            if (sortItemIsAttribute(sortItem)) {
                                return sortItem.attributeSortItem.attributeIdentifier;
                            }
                            if (sortItemIsMeasure(sortItem)) {
                                const locator: AFM.LocatorItem = sortItem.measureSortItem.locators[0];
                                if (locatorIsMeasure(locator)) {
                                    return locator.measureLocatorItem.measureIdentifier;
                                }
                            }
                        
                            return null;
                        }
                        
                        /**
                         * Returns true if sortItem fits to afm
                         *
                         * @method isSortValid
                         * @param {AFM.IAfm} afm
                         * @param {AFM.SortItem} sortItem
                         * @returns {boolean}
                         */
                        export function isSortValid(afm: AFM.IAfm, sortItem?: AFM.SortItem): boolean {
                            if (!sortItem) {
                                return true;
                            }
                            const sortIdentifier = getSortItemIdentifier(sortItem);
                            const normalizedAfm = normalizeAfm(afm);
                            return (
                                normalizedAfm.measures.some(m => m.localIdentifier === sortIdentifier) ||
                                normalizedAfm.attributes.some(a => a.localIdentifier === sortIdentifier)
                            );
                        }