|
1 | 1 | import useSWR, { Fetcher, SWRResponse } from 'swr'; |
2 | 2 | import { AggregationsData, JSONObject, StatsData } from '../../types'; |
3 | 3 | import { Accessibility, GEN3_GUPPY_API } from '../../constants'; |
4 | | -import { |
5 | | - convertFilterSetToGqlFilter, |
6 | | - FilterSet, |
7 | | - GQLFilter, |
8 | | - isFilterEmpty, |
9 | | -} from '../filters'; |
| 4 | +import { convertFilterSetToGqlFilter, FilterSet, GQLFilter, isFilterEmpty, } from '../filters'; |
10 | 5 | import { guppyApi, guppyApiSliceRequest } from './guppyApi'; |
11 | 6 | import { RangeQueryRequest, SharedFieldMapping } from './types'; |
12 | 7 | import { groupSharedFields } from './utils'; |
@@ -111,6 +106,11 @@ interface ObjectIdQueryResponse { |
111 | 106 | index: string; |
112 | 107 | } |
113 | 108 |
|
| 109 | +interface MultiIndexFieldQueryRequest { |
| 110 | + indexAndFields: Array<QueryAggsParams>; |
| 111 | + accessibility?: Accessibility; |
| 112 | +} |
| 113 | + |
114 | 114 | export const explorerTags = guppyApi.enhanceEndpoints({ |
115 | 115 | addTagTypes: ['AGGS', 'COUNTS', 'STATS', 'TABLE_DATA', 'RAW_DATA'] as const, |
116 | 116 | }); |
@@ -616,6 +616,35 @@ export const explorerApi = explorerTags.injectEndpoints({ |
616 | 616 | }; |
617 | 617 | }, |
618 | 618 | }), |
| 619 | + getGetMultiIndexAggregation: builder.query< |
| 620 | + ObjectIdQueryResponse, |
| 621 | + MultiIndexFieldQueryRequest |
| 622 | + >({ |
| 623 | + query: ({ |
| 624 | + indexAndFields, |
| 625 | + accessibility = Accessibility.ALL, |
| 626 | + }: MultiIndexFieldQueryRequest) => { |
| 627 | + // build each query |
| 628 | + const filters = indexAndFields.reduce( |
| 629 | + (acc, curr) => { |
| 630 | + acc[curr.type] = convertFilterSetToGqlFilter(curr.filters); |
| 631 | + return acc; |
| 632 | + }, |
| 633 | + {} as Record<string, GQLFilter>, |
| 634 | + ); |
| 635 | + const query = buildMultiIndexAggregationQuery(indexAndFields); |
| 636 | + return { |
| 637 | + query, |
| 638 | + variables: { |
| 639 | + ...filters, |
| 640 | + accessibility, |
| 641 | + }, |
| 642 | + }; |
| 643 | + }, |
| 644 | + transformResponse: (response: Record<string, any>) => { |
| 645 | + return response?.data?._aggregation ?? {}; |
| 646 | + }, |
| 647 | + }), |
619 | 648 | generalGQL: builder.query<Record<string, unknown>, guppyApiSliceRequest>({ |
620 | 649 | query: ({ query, variables }) => { |
621 | 650 | return { |
@@ -645,6 +674,32 @@ export const useGetIndexFields = (index: string, indexPrefix = '') => { |
645 | 674 | return data ?? []; |
646 | 675 | }; |
647 | 676 |
|
| 677 | +const buildMultiIndexAggregationQuery = ( |
| 678 | + indexesAndFields: Array<QueryAggsParams>, |
| 679 | + filterBasename: string = 'filter', |
| 680 | +) => { |
| 681 | + const filterNames = indexesAndFields.reduce( |
| 682 | + (acc, curr) => acc + `$${curr.type}${filterBasename}: JSON,`, |
| 683 | + '', |
| 684 | + ); |
| 685 | + |
| 686 | + let queryString = `query getAggs (${filterNames}) {`; |
| 687 | + |
| 688 | + indexesAndFields.forEach((indexQuery) => { |
| 689 | + queryString += ` ${indexQuery.type}_aggregation { |
| 690 | + ${indexQuery.type} (filter: ${indexQuery.type}${filterBasename}, filterSelf: ${indexQuery.filterSelf ? 'true' : 'false'}, accessibility: ${indexQuery.accessibility}) { _totalCount |
| 691 | + `; |
| 692 | + queryString += indexQuery.fields.map((field: string) => |
| 693 | + histogramQueryStrForEachField(field), |
| 694 | + ); |
| 695 | + queryString += ' } }'; |
| 696 | + }); |
| 697 | + |
| 698 | + queryString += '}'; |
| 699 | + |
| 700 | + return queryString; |
| 701 | +}; |
| 702 | + |
648 | 703 | export const buildGetAggregationQuery = ( |
649 | 704 | type: string, |
650 | 705 | fields: ReadonlyArray<string>, |
@@ -730,4 +785,6 @@ export const { |
730 | 785 | useLazyCustomRangeQuery, |
731 | 786 | useGetObjectIdsQuery, |
732 | 787 | useLazyGetObjectIdsQuery, |
| 788 | + useGetGetMultiIndexAggregationQuery, |
| 789 | + useLazyGetGetMultiIndexAggregationQuery, |
733 | 790 | } = explorerApi; |
0 commit comments