10 Sep 2024 06:08 PM
Hi,
Does anyone know if there's a way to dynamically parse graphQL queries with DQL with the idea to extract the fields that is requested in the query?
I'm trying to use the request payload, but also extract the fields from response would be possible.
The problem is that, there's no pattern, the query can come with differents fields and orders. Bellow I have some examples:
{ clientePorConta(numeroConta: \"1234\") { contaCartao { contratos { numeroConta, valorFaturaAberta, valorLimiteDisponivel, valorLimiteTotal, dataVencimento, cartoes { id, numeroCartao, tipoTitularidade, nomePortador, ehPrimario, ehVirtual, idProduto } } } } }
{ cliente(cpf: "1234") { dadosSociais { numeroConta, statusConta } } }
{ cliente(cpf: "12345") { contaCartao { contratos { numeroConta, statusConta, cartoes { id, numeroCartao, numeroCartaoCompleto, statusCartao, ehPrimario, nomeCartao, nomePortador } } } } }
{ cliente(cpf: "12345") { cpf, dadosSociais { numeroConta, dataDeNascimento, nomeCompleto, nomePrimeiro, nomeMeio, nomeUltimo, nomeSocial, nomeMae, genero }, contaCartao { contratos { statusConta, unidadeNegocio, numeroConta, tipoEnvioFatura } } } }
{ cliente(cpf: "1234") { contaCartao { contratos { numeroConta, valorFaturaAberta, valorLimiteDisponivel, valorLimiteTotal, dataVencimento, cartoes { id, numeroCartao, ehPrimario, idProduto } } } } }
{ cliente(cpf: "1234") { cpf, dadosSociais { nomeCompleto, numeroConta, tipoEnvioFatura, funcao, dataDeNascimento }, contato { dadosContato { numeroConta, emails { endereco }, telefones { ddd, numero, celularSeguro, tipo }, enderecos { uF, cidade, tipoEndereco } } }, contaCartao { contratos { codigoProdutoCurto, numeroConta, unidadeNegocio, statusConta, dataAberturaConta, valorLimiteTotal, cartoes { id, nomePortador, statusCartao, numeroCartao, numeroCartaoCompleto, ehPrimario, ehAtivo, tipoTitularidade, ehVirtual } } } } }
I was able to extract some fileds but from one case:
data
record (text="{ clientePorConta(numeroConta: \"37000075921\") { contaCartao { contratos { numeroConta, valorFaturaAberta, valorLimiteDisponivel, valorLimiteTotal, dataVencimento, cartoes { id, numeroCartao, tipoTitularidade, nomePortador, ehPrimario, ehVirtual, idProduto } } } } }"),
record (text="{ clientePorConta(numeroConta: \"37000075921\") { contaCartao { contratos { numeroConta, valorFaturaAberta, valorLimiteDisponivel, valorLimiteTotal, dataVencimento, cartoes { id, numeroCartao, tipoTitularidade, nomePortador, ehPrimario, ehVirtual, idProduto } } } } }"),
record (text="{ clientePorConta(numeroConta: \"37000075921\") { contaCartao { contratos { numeroConta, valorFaturaAberta, valorLimiteDisponivel, valorLimiteTotal, dataVencimento, cartoes { id, numeroCartao, tipoTitularidade, nomePortador, ehPrimario, ehVirtual, idProduto } } } } }"),
record (text="{ clientePorConta(numeroConta: \"37000075921\") { contaCartao { contratos { numeroConta, valorFaturaAberta, valorLimiteDisponivel, valorLimiteTotal, dataVencimento, cartoes { id, numeroCartao, tipoTitularidade, nomePortador, ehPrimario, ehVirtual, idProduto } } } } }"),
record (text="{ clientePorConta(numeroConta: \"37000075921\") { contaCartao { contratos { numeroConta, valorFaturaAberta, valorLimiteDisponivel, valorLimiteTotal, dataVencimento, cartoes { id, numeroCartao, tipoTitularidade, nomePortador, ehPrimario, ehVirtual, idProduto } } } } }"),
record (text="{ clientePorConta(numeroConta: \"37000075921\") { contaCartao { contratos { numeroConta, valorFaturaAberta, valorLimiteDisponivel, valorLimiteTotal, dataVencimento, cartoes { id, numeroCartao, tipoTitularidade, nomePortador, ehPrimario, ehVirtual, idProduto } } } } }")
| parse text, "DATA 'numeroConta: ' DQS:numero_conta"
| parse text, "DATA 'valorLimiteTotal: ' DQS:valorLimiteTotal"
| fieldsAdd new_text=replaceString(text, "{", "<")
| fieldsAdd new_text=replaceString(new_text, "}", ">")
| fieldsAdd new_text=replaceString(new_text, " ", "")
| parse new_text, "DATA 'contratos<' [^<]*:contratos_arr"
| fieldsAdd contratos_arr=splitString(contratos_arr, ",")
| expand contratos_arr
If anyone has a better DQL.
Solved! Go to Solution.
10 Sep 2024 11:03 PM
I'd suggest you go straight to the response, since there's the actual data you want, and we have support to parse JSON objects fairly easy with just a simple:
| parse json_data, "JSON:data"
And you can explore all the fields you have from there. Example:
If you really need to get the identifier of the user from the request from the graphql query structure, you can use alternative groups to cover multiple scenarios. Following your example, this might work:
| parse text, "'{ ' ('cliente'|'clientePorConta') '(' LDATA:identifierType ': \"' LDATA:identifier '\"' DATA"
I tried it with 3 of your scenarios and it worked decently:
Let me know if it helps