KX Community

Find answers, ask questions, and connect with our KX Community around the world.
KX Community Guidelines

Home Forums kdb+ how does the query below work Re: how does the query below work

  • Laura

    Administrator
    April 19, 2022 at 12:00 am

    Couple of syntax errors above, but lets break down what we can. The trailing backtick was probably you trying to use Markdown for the expression; we can ignore that.

    The query defines a new column OriginalId by applying a lambda to each ID. The lambda is projected on (curried to) its second argument. That is, within the lambda y refers to Id!PrevId, which is a dictionary mapping IDs to previous IDs. The lambda has two expressions. The first expression applies y (the dictionary) to x (the ID) to get the previous ID, x1. The second expression is a ternary conditional, Cond. This tests x1 and here is your second syntax error: the comparison term is missing. I strongly suspect it should be x. That is, if x=x1, if the previous ID is the same as this ID, then return it as the result. Otherwise apply .z.s to x1 and y. Now .z.s is a reference to the current function, so this is a recursion; it ends when the previous ID is just the ID.

    There is a simpler way to get there. We can use the Converge iterator to keep applying the Id!PrevId dictionary to the IDs until the results stop changing:

     

    update OriginalId:(Id!PrevId)/[Id] from table

     

    This exploits implicit iteration. On each application of the dictionary all the IDs get mapped to their previous ones. So there is no need to iterate through each ID and then recurse to find its original.