Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Table of Contentschildren
stylenone

What is Query API?

Query API is a Groovy API available in all logics since 14.0 release to query the data from Pricefx. The aim is to provide a unified access to data in Pricefx and idea is that it should be the only API.

The main driver is to support JOIN of data from two or more tables to utilize the performance of the database engine since joining data using various techniques in groovy logic in the memory of the backend was not that efficient. It can also save the number of queries made to the database.

Main features:

  • Supports JOIN of tables

  • Provide a single unified quering interface for transacational database as well

  • Work natively with field labels rather than attribute numbers

  • Data is provided as a stream support (which works also in the input generation mode)

  • Aggregation of the data

  • Advanced expressions

  • Allows to use column aliases to retrieve column under different name

Note

Use of joins can be a significant performance improvement. But at the same time it can also cause a huge harm if not used wisely. Therefore a knowledge of the databases is required.

Info

Note: Joining data between analytical database (PA module) and transactional database (other modules) is not possible (e.g. a product extensions with a data source). You can join tables only within the same database.

Performance, Important Prerequisites

Transactional database:

Analytical database:

Simple Query

Query API provides a set of builder functions withinapi.queryApi(). The query is built using providing builder functions which use pipeline approach.

Look at this simple query:

Code Block
def q = api.queryApi()

def t1 = q.tables().product()

return q.source(t1, q.exprs().and(
                t1.sku().equal("MB-0001"),
        ))
        .stream { it.collect { it } }

It that takes reads a single table row with sku “MB-00001” from the Product table. Streaming is used in QueryAPI as the only option and it is up to you what you will do with the individual rows. In this case, earch are collected to a List.

Let’s look how the query builder works in the below sections.

Tables And Columns

The main entrance point for use of QueryAPI is a method api.queryApi() that returns a QueryAPI object - object which provides access to all capabilities of the QueryAPI methods.

Reference to a table is retrieved using the QueryApi.tables() method. E.g.

Code Block
def tableProduct = api.queryApi().tables().product()
def tableCosts = api.queryApi().tables().productExtension("Costs")

Transactional database tables supported:

  • Product

  • Product Extension

  • Product

  • Product Extension

  • Seller

  • SellerExentsion

  • QuoteLineItems

  • PriceListItem

  • PriceGridITem

Analytical database tables

  • Data sources

  • Datamarts

Source

Expressions

Joining tables

It is strongly recommended that you make joins only based on index fields in the join criteria.

Aggregations

Studio support

REST API

Currently, thre is no REST API for queries using QueryAPI. But you can create a logic that returns the data using QueryAPI since every generic logic can be executed using formulamanager.execute endpoint.

See more Custom REST API Service Using Logics

Troubleshooting

Future vision

With the Query API, you should be able to majority of the tasks what these functions were doing:

  • api.find()

  • api.findLookupTable()

  • api.findLookupTableValues()

  • api.priceGrids()

  • api.pricelists()

  • api.findApprovedPricelistItems()

  • api.findDataload()

  • api.findCalculatedFieldSets()

  • DatamartContext.executeQuery()

  • DatamartContext.executeSqlQuery()

Therefore the plan is to deprecate following methods:

...

allChildrentrue