[GH-ISSUE #73] nested operations with alias doesn't work #45

Closed
opened 2026-03-03 00:02:56 +03:00 by kerem · 9 comments
Owner

Originally created by @ComLock on GitHub (Sep 1, 2022).
Original GitHub issue: https://github.com/atulmy/gql-query-builder/issues/73

Originally assigned to: @ComLock on GitHub.

The query string contains "[object Object](" rather than "alias: operation("

Originally created by @ComLock on GitHub (Sep 1, 2022). Original GitHub issue: https://github.com/atulmy/gql-query-builder/issues/73 Originally assigned to: @ComLock on GitHub. The query string contains "[object Object](" rather than "alias: operation("
kerem 2026-03-03 00:02:56 +03:00
Author
Owner

@atulmy commented on GitHub (Sep 1, 2022):

Can you share sample input?

<!-- gh-comment-id:1234326283 --> @atulmy commented on GitHub (Sep 1, 2022): Can you share sample input?
Author
Owner

@ComLock commented on GitHub (Sep 1, 2022):

{
    "operation": "querySynonyms",
    "variables": {
        "searchString": {
            "list": false,
            "required": true,
            "value": "covid"
        }
    },
    "fields": [
        {
            "operation": "search",
            "variables": {
                "aggregations": {
                    "list": true,
                    "required": false,
                    "type": "AggregationInput",
                    "value": []
                },
                "count": {
                    "list": false,
                    "required": false,
                    "type": "Int",
                    "value": 10
                },
                "highlight": {
                    "list": false,
                    "required": false,
                    "type": "InputTypeHighlight",
                    "value": {
                        "fields": [
                            {
                                "field": "title"
                            },
                            {
                                "field": "text"
                            },
                            {
                                "field": "uri"
                            }
                        ],
                        "fragmentSize": 255,
                        "noMatchSize": 255,
                        "numberOfFragments": 1,
                        "order": "score",
                        "postTag": "</b>",
                        "preTag": "<b>",
                        "requireFieldMatch": false
                    }
                },
                "start": {
                    "list": false,
                    "required": false,
                    "type": "Int",
                    "value": 0
                },
                "filters": {
                    "list": true,
                    "required": false,
                    "type": "FilterInput",
                    "value": {
                        "boolean": {
                            "must": [
                                {
                                    "exists": {
                                        "field": "information_type"
                                    }
                                },
                                {
                                    "exists": {
                                        "field": "language"
                                    }
                                },
                                {
                                    "exists": {
                                        "field": "source"
                                    }
                                },
                                {
                                    "exists": {
                                        "field": "text"
                                    }
                                },
                                {
                                    "exists": {
                                        "field": "title"
                                    }
                                },
                                {
                                    "exists": {
                                        "field": "uri"
                                    }
                                },
                                {
                                    "hasValue": {
                                        "field": "document_metadata.documentType",
                                        "stringValues": [
                                            "surgeon",
                                            "uptodate"
                                        ]
                                    }
                                },
                                {
                                    "hasValue": {
                                        "field": "information_type",
                                        "stringValues": [
                                            "annet",
                                            "artikler",
                                            "databaser",
                                            "fagprosedyrer",
                                            "forgiftninger",
                                            "kurs",
                                            "legemidler",
                                            "lover-og-regler",
                                            "metodevarsel",
                                            "metodevurdering",
                                            "mini-metodevurdering",
                                            "oppslagsverk",
                                            "oppsummert-forskning",
                                            "organisasjoner",
                                            "oversiktsartikkel",
                                            "pagaende-forskning",
                                            "pakkeforlop",
                                            "pasientinformasjon",
                                            "publisert-forskning",
                                            "rapporter",
                                            "retningslinjer",
                                            "statistikk",
                                            "tidsskrifter",
                                            "verktoy",
                                            "videoer"
                                        ]
                                    }
                                },
                                {
                                    "hasValue": {
                                        "field": "language",
                                        "stringValues": [
                                            "dansk",
                                            "engelsk",
                                            "fransk",
                                            "norsk",
                                            "svensk"
                                        ]
                                    }
                                },
                                {
                                    "hasValue": {
                                        "field": "source",
                                        "stringValues": [
                                            "bmj-best-practice",
                                            "folkehelseinstituttet",
                                            "helsebiblioteket",
                                            "metodebok-for-sykehjemsleger"
                                        ]
                                    }
                                }
                            ]
                        }
                    }
                }
            },
            "fields": [
                "aggregationsAsJson",
                "count",
                {
                    "hits": [
                        "_highlight",
                        {
                            "... on DocumentType_Surgeon": [
                                "information_type",
                                "language",
                                "source",
                                "uri"
                            ]
                        },
                        {
                            "... on DocumentType_Uptodate": [
                                "information_type",
                                "language",
                                "source",
                                "uri"
                            ]
                        }
                    ]
                },
                "start",
                "total"
            ]
        },
        {
            "operation": {
                "name": "search",
                "alias": "getInformationTypeAggregations"
            },
            "variables": {
                "aggregations2": {
                    "name": "aggregations",
                    "list": true,
                    "required": false,
                    "type": "AggregationInput",
                    "value": [
                        {
                            "name": "informationType",
                            "terms": {
                                "field": "information_type",
                                "order": "score desc",
                                "size": 100,
                                "minDocCount": 0
                            }
                        }
                    ]
                },
                "count2": {
                    "list": false,
                    "name": "count",
                    "required": false,
                    "type": "Int",
                    "value": 0
                },
                "filters2": {
                    "list": true,
                    "name": "filters",
                    "required": false,
                    "type": "FilterInput",
                    "value": {
                        "boolean": {
                            "must": [
                                {
                                    "exists": {
                                        "field": "information_type"
                                    }
                                },
                                {
                                    "exists": {
                                        "field": "language"
                                    }
                                },
                                {
                                    "exists": {
                                        "field": "source"
                                    }
                                },
                                {
                                    "exists": {
                                        "field": "text"
                                    }
                                },
                                {
                                    "exists": {
                                        "field": "title"
                                    }
                                },
                                {
                                    "exists": {
                                        "field": "uri"
                                    }
                                },
                                {
                                    "hasValue": {
                                        "field": "document_metadata.documentType",
                                        "stringValues": [
                                            "surgeon",
                                            "uptodate"
                                        ]
                                    }
                                },
                                {
                                    "hasValue": {
                                        "field": "language",
                                        "stringValues": [
                                            "dansk",
                                            "engelsk",
                                            "fransk",
                                            "norsk",
                                            "svensk"
                                        ]
                                    }
                                },
                                {
                                    "hasValue": {
                                        "field": "source",
                                        "stringValues": [
                                            "bmj-best-practice",
                                            "folkehelseinstituttet",
                                            "helsebiblioteket",
                                            "metodebok-for-sykehjemsleger"
                                        ]
                                    }
                                }
                            ]
                        }
                    }
                }
            },
            "fields": [
                "aggregationsAsJson"
            ]
        },
        {
            "operation": {
                "name": "search",
                "alias": "getLanguageAggregations"
            },
            "variables": {
                "aggregations3": {
                    "name": "aggregations",
                    "list": true,
                    "required": false,
                    "type": "AggregationInput",
                    "value": [
                        {
                            "name": "language",
                            "terms": {
                                "field": "language",
                                "order": "score desc",
                                "size": 100,
                                "minDocCount": 0
                            }
                        }
                    ]
                },
                "count3": {
                    "list": false,
                    "name": "count",
                    "required": false,
                    "type": "Int",
                    "value": 0
                },
                "filters3": {
                    "list": true,
                    "name": "filters",
                    "required": false,
                    "type": "FilterInput",
                    "value": {
                        "boolean": {
                            "must": [
                                {
                                    "exists": {
                                        "field": "information_type"
                                    }
                                },
                                {
                                    "exists": {
                                        "field": "language"
                                    }
                                },
                                {
                                    "exists": {
                                        "field": "source"
                                    }
                                },
                                {
                                    "exists": {
                                        "field": "text"
                                    }
                                },
                                {
                                    "exists": {
                                        "field": "title"
                                    }
                                },
                                {
                                    "exists": {
                                        "field": "uri"
                                    }
                                },
                                {
                                    "hasValue": {
                                        "field": "document_metadata.documentType",
                                        "stringValues": [
                                            "surgeon",
                                            "uptodate"
                                        ]
                                    }
                                },
                                {
                                    "hasValue": {
                                        "field": "information_type",
                                        "stringValues": [
                                            "annet",
                                            "artikler",
                                            "databaser",
                                            "fagprosedyrer",
                                            "forgiftninger",
                                            "kurs",
                                            "legemidler",
                                            "lover-og-regler",
                                            "metodevarsel",
                                            "metodevurdering",
                                            "mini-metodevurdering",
                                            "oppslagsverk",
                                            "oppsummert-forskning",
                                            "organisasjoner",
                                            "oversiktsartikkel",
                                            "pagaende-forskning",
                                            "pakkeforlop",
                                            "pasientinformasjon",
                                            "publisert-forskning",
                                            "rapporter",
                                            "retningslinjer",
                                            "statistikk",
                                            "tidsskrifter",
                                            "verktoy",
                                            "videoer"
                                        ]
                                    }
                                },
                                {
                                    "hasValue": {
                                        "field": "source",
                                        "stringValues": [
                                            "bmj-best-practice",
                                            "folkehelseinstituttet",
                                            "helsebiblioteket",
                                            "metodebok-for-sykehjemsleger"
                                        ]
                                    }
                                }
                            ]
                        }
                    }
                }
            },
            "fields": [
                "aggregationsAsJson"
            ]
        },
        {
            "operation": {
                "name": "search",
                "alias": "getSourceAggregations"
            },
            "variables": {
                "aggregations4": {
                    "name": "aggregations",
                    "list": true,
                    "required": false,
                    "type": "AggregationInput",
                    "value": [
                        {
                            "name": "source",
                            "terms": {
                                "field": "source",
                                "order": "score desc",
                                "size": 100,
                                "minDocCount": 0
                            }
                        }
                    ]
                },
                "count4": {
                    "list": false,
                    "name": "count",
                    "required": false,
                    "type": "Int",
                    "value": 0
                },
                "filters4": {
                    "list": true,
                    "name": "filters",
                    "required": false,
                    "type": "FilterInput",
                    "value": {
                        "boolean": {
                            "must": [
                                {
                                    "exists": {
                                        "field": "information_type"
                                    }
                                },
                                {
                                    "exists": {
                                        "field": "language"
                                    }
                                },
                                {
                                    "exists": {
                                        "field": "source"
                                    }
                                },
                                {
                                    "exists": {
                                        "field": "text"
                                    }
                                },
                                {
                                    "exists": {
                                        "field": "title"
                                    }
                                },
                                {
                                    "exists": {
                                        "field": "uri"
                                    }
                                },
                                {
                                    "hasValue": {
                                        "field": "document_metadata.documentType",
                                        "stringValues": [
                                            "surgeon",
                                            "uptodate"
                                        ]
                                    }
                                },
                                {
                                    "hasValue": {
                                        "field": "information_type",
                                        "stringValues": [
                                            "annet",
                                            "artikler",
                                            "databaser",
                                            "fagprosedyrer",
                                            "forgiftninger",
                                            "kurs",
                                            "legemidler",
                                            "lover-og-regler",
                                            "metodevarsel",
                                            "metodevurdering",
                                            "mini-metodevurdering",
                                            "oppslagsverk",
                                            "oppsummert-forskning",
                                            "organisasjoner",
                                            "oversiktsartikkel",
                                            "pagaende-forskning",
                                            "pakkeforlop",
                                            "pasientinformasjon",
                                            "publisert-forskning",
                                            "rapporter",
                                            "retningslinjer",
                                            "statistikk",
                                            "tidsskrifter",
                                            "verktoy",
                                            "videoer"
                                        ]
                                    }
                                },
                                {
                                    "hasValue": {
                                        "field": "language",
                                        "stringValues": [
                                            "dansk",
                                            "engelsk",
                                            "fransk",
                                            "norsk",
                                            "svensk"
                                        ]
                                    }
                                }
                            ]
                        }
                    }
                }
            },
            "fields": [
                "aggregationsAsJson"
            ]
        }
    ]
}
<!-- gh-comment-id:1234334365 --> @ComLock commented on GitHub (Sep 1, 2022): ``` { "operation": "querySynonyms", "variables": { "searchString": { "list": false, "required": true, "value": "covid" } }, "fields": [ { "operation": "search", "variables": { "aggregations": { "list": true, "required": false, "type": "AggregationInput", "value": [] }, "count": { "list": false, "required": false, "type": "Int", "value": 10 }, "highlight": { "list": false, "required": false, "type": "InputTypeHighlight", "value": { "fields": [ { "field": "title" }, { "field": "text" }, { "field": "uri" } ], "fragmentSize": 255, "noMatchSize": 255, "numberOfFragments": 1, "order": "score", "postTag": "</b>", "preTag": "<b>", "requireFieldMatch": false } }, "start": { "list": false, "required": false, "type": "Int", "value": 0 }, "filters": { "list": true, "required": false, "type": "FilterInput", "value": { "boolean": { "must": [ { "exists": { "field": "information_type" } }, { "exists": { "field": "language" } }, { "exists": { "field": "source" } }, { "exists": { "field": "text" } }, { "exists": { "field": "title" } }, { "exists": { "field": "uri" } }, { "hasValue": { "field": "document_metadata.documentType", "stringValues": [ "surgeon", "uptodate" ] } }, { "hasValue": { "field": "information_type", "stringValues": [ "annet", "artikler", "databaser", "fagprosedyrer", "forgiftninger", "kurs", "legemidler", "lover-og-regler", "metodevarsel", "metodevurdering", "mini-metodevurdering", "oppslagsverk", "oppsummert-forskning", "organisasjoner", "oversiktsartikkel", "pagaende-forskning", "pakkeforlop", "pasientinformasjon", "publisert-forskning", "rapporter", "retningslinjer", "statistikk", "tidsskrifter", "verktoy", "videoer" ] } }, { "hasValue": { "field": "language", "stringValues": [ "dansk", "engelsk", "fransk", "norsk", "svensk" ] } }, { "hasValue": { "field": "source", "stringValues": [ "bmj-best-practice", "folkehelseinstituttet", "helsebiblioteket", "metodebok-for-sykehjemsleger" ] } } ] } } } }, "fields": [ "aggregationsAsJson", "count", { "hits": [ "_highlight", { "... on DocumentType_Surgeon": [ "information_type", "language", "source", "uri" ] }, { "... on DocumentType_Uptodate": [ "information_type", "language", "source", "uri" ] } ] }, "start", "total" ] }, { "operation": { "name": "search", "alias": "getInformationTypeAggregations" }, "variables": { "aggregations2": { "name": "aggregations", "list": true, "required": false, "type": "AggregationInput", "value": [ { "name": "informationType", "terms": { "field": "information_type", "order": "score desc", "size": 100, "minDocCount": 0 } } ] }, "count2": { "list": false, "name": "count", "required": false, "type": "Int", "value": 0 }, "filters2": { "list": true, "name": "filters", "required": false, "type": "FilterInput", "value": { "boolean": { "must": [ { "exists": { "field": "information_type" } }, { "exists": { "field": "language" } }, { "exists": { "field": "source" } }, { "exists": { "field": "text" } }, { "exists": { "field": "title" } }, { "exists": { "field": "uri" } }, { "hasValue": { "field": "document_metadata.documentType", "stringValues": [ "surgeon", "uptodate" ] } }, { "hasValue": { "field": "language", "stringValues": [ "dansk", "engelsk", "fransk", "norsk", "svensk" ] } }, { "hasValue": { "field": "source", "stringValues": [ "bmj-best-practice", "folkehelseinstituttet", "helsebiblioteket", "metodebok-for-sykehjemsleger" ] } } ] } } } }, "fields": [ "aggregationsAsJson" ] }, { "operation": { "name": "search", "alias": "getLanguageAggregations" }, "variables": { "aggregations3": { "name": "aggregations", "list": true, "required": false, "type": "AggregationInput", "value": [ { "name": "language", "terms": { "field": "language", "order": "score desc", "size": 100, "minDocCount": 0 } } ] }, "count3": { "list": false, "name": "count", "required": false, "type": "Int", "value": 0 }, "filters3": { "list": true, "name": "filters", "required": false, "type": "FilterInput", "value": { "boolean": { "must": [ { "exists": { "field": "information_type" } }, { "exists": { "field": "language" } }, { "exists": { "field": "source" } }, { "exists": { "field": "text" } }, { "exists": { "field": "title" } }, { "exists": { "field": "uri" } }, { "hasValue": { "field": "document_metadata.documentType", "stringValues": [ "surgeon", "uptodate" ] } }, { "hasValue": { "field": "information_type", "stringValues": [ "annet", "artikler", "databaser", "fagprosedyrer", "forgiftninger", "kurs", "legemidler", "lover-og-regler", "metodevarsel", "metodevurdering", "mini-metodevurdering", "oppslagsverk", "oppsummert-forskning", "organisasjoner", "oversiktsartikkel", "pagaende-forskning", "pakkeforlop", "pasientinformasjon", "publisert-forskning", "rapporter", "retningslinjer", "statistikk", "tidsskrifter", "verktoy", "videoer" ] } }, { "hasValue": { "field": "source", "stringValues": [ "bmj-best-practice", "folkehelseinstituttet", "helsebiblioteket", "metodebok-for-sykehjemsleger" ] } } ] } } } }, "fields": [ "aggregationsAsJson" ] }, { "operation": { "name": "search", "alias": "getSourceAggregations" }, "variables": { "aggregations4": { "name": "aggregations", "list": true, "required": false, "type": "AggregationInput", "value": [ { "name": "source", "terms": { "field": "source", "order": "score desc", "size": 100, "minDocCount": 0 } } ] }, "count4": { "list": false, "name": "count", "required": false, "type": "Int", "value": 0 }, "filters4": { "list": true, "name": "filters", "required": false, "type": "FilterInput", "value": { "boolean": { "must": [ { "exists": { "field": "information_type" } }, { "exists": { "field": "language" } }, { "exists": { "field": "source" } }, { "exists": { "field": "text" } }, { "exists": { "field": "title" } }, { "exists": { "field": "uri" } }, { "hasValue": { "field": "document_metadata.documentType", "stringValues": [ "surgeon", "uptodate" ] } }, { "hasValue": { "field": "information_type", "stringValues": [ "annet", "artikler", "databaser", "fagprosedyrer", "forgiftninger", "kurs", "legemidler", "lover-og-regler", "metodevarsel", "metodevurdering", "mini-metodevurdering", "oppslagsverk", "oppsummert-forskning", "organisasjoner", "oversiktsartikkel", "pagaende-forskning", "pakkeforlop", "pasientinformasjon", "publisert-forskning", "rapporter", "retningslinjer", "statistikk", "tidsskrifter", "verktoy", "videoer" ] } }, { "hasValue": { "field": "language", "stringValues": [ "dansk", "engelsk", "fransk", "norsk", "svensk" ] } } ] } } } }, "fields": [ "aggregationsAsJson" ] } ] } ```
Author
Owner

@ComLock commented on GitHub (Sep 2, 2022):

Sry for the large example, had to run, here's a smaller one:

{
	operation: 'singleRootQuery',
	variables: {},
	fields: [{
		operation: 'nestedQuery',
		variables: {},
		fields: ['whatever']
	},{
		operation: {
			alias: 'duplicatedNestedQuery',
			name: 'nestedQuery'
		},
		variables: {},
		fields: ['whatever']
	}]
}

gives

2022-09-02 09:32:11,180 WARN  notprivacysafe.graphql.GraphQL - Query failed to parse : 'query  { singleRootQuery  { nestedQuery  { whatever }, [object Object]  { whatever } } }'

So this:

{
  singleRootQuery {
    nestedQuery {
      whatever
    }
    [object Object] {
      whatever
    }
  }
}

should have been

{
  singleRootQuery {
    nestedQuery {
      whatever
    }
    duplicatedNestedQuery: nestedQuery {
      whatever
    }
  }
}
<!-- gh-comment-id:1235171940 --> @ComLock commented on GitHub (Sep 2, 2022): Sry for the large example, had to run, here's a smaller one: ``` { operation: 'singleRootQuery', variables: {}, fields: [{ operation: 'nestedQuery', variables: {}, fields: ['whatever'] },{ operation: { alias: 'duplicatedNestedQuery', name: 'nestedQuery' }, variables: {}, fields: ['whatever'] }] } ``` gives ``` 2022-09-02 09:32:11,180 WARN notprivacysafe.graphql.GraphQL - Query failed to parse : 'query { singleRootQuery { nestedQuery { whatever }, [object Object] { whatever } } }' ``` So this: ``` { singleRootQuery { nestedQuery { whatever } [object Object] { whatever } } } ``` should have been ``` { singleRootQuery { nestedQuery { whatever } duplicatedNestedQuery: nestedQuery { whatever } } } ```
Author
Owner

@ComLock commented on GitHub (Sep 2, 2022):

Failing Test

  test("generates aliased nested queries", () => {
    const query = queryBuilder.query([{
      operation: 'singleRootQuery',
      variables: {},
      fields: [
        {
          operation: 'nestedQuery',
          variables: {},
          fields: ['whatever']
        },{
          operation: {
            alias: 'duplicatedNestedQuery',
            name: 'nestedQuery'
          },
          variables: {},
          fields: ['whatever']
        }
      ]
    }]); // query
    console.debug(query);
    expect(query).toEqual({
      query: `query  { singleRootQuery  { nestedQuery  { whatever }, duplicatedNestedQuery: nestedQuery { whatever } } }`,
      variables: {}
    }); // expect
  }); // test
<!-- gh-comment-id:1235186689 --> @ComLock commented on GitHub (Sep 2, 2022): Failing Test ``` test("generates aliased nested queries", () => { const query = queryBuilder.query([{ operation: 'singleRootQuery', variables: {}, fields: [ { operation: 'nestedQuery', variables: {}, fields: ['whatever'] },{ operation: { alias: 'duplicatedNestedQuery', name: 'nestedQuery' }, variables: {}, fields: ['whatever'] } ] }]); // query console.debug(query); expect(query).toEqual({ query: `query { singleRootQuery { nestedQuery { whatever }, duplicatedNestedQuery: nestedQuery { whatever } } }`, variables: {} }); // expect }); // test ```
Author
Owner

@ComLock commented on GitHub (Sep 2, 2022):

The bug is here: https://github.com/atulmy/gql-query-builder/blob/master/src/Utils.ts#L65

return `${field.operation} ${this.queryDataNameAndArgumentMap(
<!-- gh-comment-id:1235197745 --> @ComLock commented on GitHub (Sep 2, 2022): The bug is here: https://github.com/atulmy/gql-query-builder/blob/master/src/Utils.ts#L65 ``` return `${field.operation} ${this.queryDataNameAndArgumentMap( ```
Author
Owner

@ComLock commented on GitHub (Sep 2, 2022):

One way to solve it:

  public static operationOrAlias(operation :IQueryBuilderOptions['operation']) {
    return typeof operation === 'string'
      ? operation
      : `${operation.alias}: ${operation.name}`
  }

  public static queryNestedFieldMap(field: NestedField) {
    return `${this.operationOrAlias(field.operation)} ${this.queryDataNameAndArgumentMap(
<!-- gh-comment-id:1235210270 --> @ComLock commented on GitHub (Sep 2, 2022): One way to solve it: ``` public static operationOrAlias(operation :IQueryBuilderOptions['operation']) { return typeof operation === 'string' ? operation : `${operation.alias}: ${operation.name}` } public static queryNestedFieldMap(field: NestedField) { return `${this.operationOrAlias(field.operation)} ${this.queryDataNameAndArgumentMap( ```
Author
Owner

@atulmy commented on GitHub (Sep 2, 2022):

In case you got around resolving the issue, feel free to submit a PR, will merge and publish after reviewing.

<!-- gh-comment-id:1235211632 --> @atulmy commented on GitHub (Sep 2, 2022): In case you got around resolving the issue, feel free to submit a PR, will merge and publish after reviewing.
Author
Owner

@ComLock commented on GitHub (Sep 2, 2022):

PR on the way

<!-- gh-comment-id:1235219353 --> @ComLock commented on GitHub (Sep 2, 2022): PR on the way
Author
Owner

@atulmy commented on GitHub (Sep 2, 2022):

Thanks for your contribution. Package has been published:
https://www.npmjs.com/package/gql-query-builder/v/3.7.1

<!-- gh-comment-id:1235237263 --> @atulmy commented on GitHub (Sep 2, 2022): Thanks for your contribution. Package has been published: https://www.npmjs.com/package/gql-query-builder/v/3.7.1
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
starred/gql-query-builder#45
No description provided.