On 13/07/24 17:29, Shaarad Dalvi wrote:
> Hi folks,
>
> I have a few accounts decorated with some metadata - like for fixed
> deposit accounts, I put the rate of interest as the metadata
>
> 2024-07-01 open Assets:MyBank:MyFixedDeposit1 INR
> rate-of-interest: "7.2%"
>
> ... And so on for other deposit accounts
>
> I am wondering if I can somehow see "the fixed deposit accounts that are
> giving me the least rate of interest right now"?
beanquery defines a few more tables beside the 'postings' table. For a
list, see the output of the '.tables' command. Among these there is also
the 'accounts' table. For a description of the columns of the table, see
the output of the '.describe accounts' command:
beanquery> .describe accounts
table accounts:
account (str)
open (open)
close (close)
And the output of the '.describe open' command for a definition of the
'open' structured data type:
beanquery> .describe open
structured type open:
meta (metadata)
date (date)
account (str)
currencies (list)
booking (booking)
With this information, you can build this query:
SELECT
account,
open.meta['rate-of-interest']
FROM
#accounts
ORDER BY 2 DESC, 1
> I tried using entry_meta and any_meta but no success so far.
As the name suggest, these functions return metadata for the entry and
for the posting or the entry if the former is not present.
> Furthermore, if filtering on account metadata is possible, is it
> possible to cast the metadata value of a given key to another data type
> (like integer/float) and ORDER BY that?
In your example the 'rate-of-interest' metadata field is a string. The
easiest would be to encode it as a decimal, for example:
2024-07-01 open Assets:MyBank:MyFixedDeposit1 INR
rate-of-interest: 7.2
then there is nothing to do to get it interpreted correctly as a decimal
number in beanquery. Otherwise, you need to parse the numerical part out
of the string, which gets a bit clumsy:
SELECT
account,
decimal(substr(str(open.meta['rate-of-interest']), 0, -1)) AS interest
FROM
#accounts
ORDER BY 2 DESC, 1
Metadata values do not have a defined data type in Beancount, thus BQL
(the Beancount Query Language) is treats metadata as a dictionary that
uses strings as keys and untyped object as values. The str() function in
the query above coerces the metdata value to a string. The substr()
extracts the string part before the '%' sign, and decimal() parses the
resulting string as a decimal value (BQL does not have a floating point
data type).
Cheers,
Dan