diff --git a/packages/cubejs-api-gateway/src/graphql.ts b/packages/cubejs-api-gateway/src/graphql.ts index da94b4f4c4ce1..a993443422553 100644 --- a/packages/cubejs-api-gateway/src/graphql.ts +++ b/packages/cubejs-api-gateway/src/graphql.ts @@ -377,8 +377,10 @@ export function getJsonQuery(metaConfig: any, args: Record, infos: if (orderBy) { Object.entries(orderBy).forEach(([cubeName, members]) => { + const cubeExists = metaConfig.find((cube) => cube.config.name === cubeName); + const normalizedCubeName = cubeExists ? cubeName : capitalize(cubeName); Object.entries(members).forEach(([member, value]) => { - order.push([`${capitalize(cubeName)}.${member}`, value]); + order.push([`${normalizedCubeName}.${member}`, value]); }); }); } diff --git a/packages/cubejs-api-gateway/test/graphql.test.ts b/packages/cubejs-api-gateway/test/graphql.test.ts index d7a519cfb75fe..ef596a148203b 100644 --- a/packages/cubejs-api-gateway/test/graphql.test.ts +++ b/packages/cubejs-api-gateway/test/graphql.test.ts @@ -9,7 +9,7 @@ import { GraphQLObjectType } from 'graphql'; import fs from 'fs-extra'; import request from 'supertest'; -import { makeSchema } from '../src/graphql'; +import { makeSchema, getJsonQueryFromGraphQLQuery } from '../src/graphql'; const metaConfig = [ { @@ -269,6 +269,30 @@ describe('GraphQL Schema', () => { }); }); + describe('root orderBy casing', () => { + test('preserves lowercase-first cube name when cube exists in metaConfig', () => { + const query = `query CubeQuery { + cube(orderBy: { orders: { count: desc } }) { + orders { count } + } + }`; + + const jsonQuery = getJsonQueryFromGraphQLQuery(query, metaConfigSnakeCase); + expect(jsonQuery.order).toEqual([['orders.count', 'desc']]); + }); + + test('capitalizes cube name when cube exists under capitalized name', () => { + const query = `query CubeQuery { + cube(orderBy: { orders: { count: desc } }) { + orders { count } + } + }`; + + const jsonQuery = getJsonQueryFromGraphQLQuery(query, metaConfig); + expect(jsonQuery.order).toEqual([['Orders.count', 'desc']]); + }); + }); + describe('extensions', () => { const mockAnnotation = { measures: {