Using find_active on templates with Data types

Hello,

I am trying to use dazl to query the ledger for Order contracts. If no filters are applied, I can retrieve all the contracts using the find_active function from the AIOPartyClient.

I have tried to look for examples of filters but didn’t encounter any that filtered using data types, only primitive fields.

How can I use find_active to filter using a field from a data type inside the template?
For example, for the Order template in Daml MiB:

template Order
  with
    operator : Party
    provider : Party
    customer : Party
    status : Status
    details : Details
    providerOrderId : Optional Text
    executions : [Execution]
    remainingQuantity : Decimal
    createdAt : Time

Which has the Details data type:

data Details = Details with
    id : Text
    listingId : Text
    asset : Asset
    side : Side
    orderType : OrderType
    timeInForce : TimeInForce
    marketType : MarketType
    optExchangeFee : Optional (ContractId AssetDeposit)
  deriving (Eq, Show)

How can I use find_active to get all orders by their details.id?

Thank you in advance.

You should be able to do client.find_active(template_id, { "details": { "id": some_value } }); for Python dict's, they’re considered matching if a subset of the fields match.

Hello, I have tried doing so and I always get empty results. I know the orders exist because I can see them on the navigator and if I find without filters. Do you know what could be the problem?
Thank you.

hmm perhaps there is a bug then—another way of doing this is client.find_active(template_id, lambda cdata: cdata["details"]["id"] == some_value) but in the meantime, I’ll look the possible (probable) bug.

I found the problem. I thought the variable I was supplying for the filter was a String but it was actually an Int. It worked now.
Thank you.

1 Like