From 2ec868181cd4a60a816030eb776b6ed9116c75c7 Mon Sep 17 00:00:00 2001 From: Juri Leino Date: Fri, 19 Mar 2021 17:20:46 +0100 Subject: [PATCH] feat: pluck-deep handles missing properties --- src/content/xbow.xqm | 6 +++++- src/test/xbow-spec.xqm | 21 ++++++++------------- 2 files changed, 13 insertions(+), 14 deletions(-) diff --git a/src/content/xbow.xqm b/src/content/xbow.xqm index a35dec4..a23c55b 100644 --- a/src/content/xbow.xqm +++ b/src/content/xbow.xqm @@ -217,7 +217,11 @@ function xbow:pluck-deep ($fields as xs:anyAtomicType*) as item()* { declare function xbow:pluck-deep ($map-or-array-or-node as item(), $fields as xs:anyAtomicType*) as item()* { - fold-left($fields, $map-or-array-or-node, xbow:pluck#2) + fold-left($fields, $map-or-array-or-node, function ($eventual-item as item()*, $field) { + if (exists($eventual-item)) + then (xbow:pluck($eventual-item, $field)) + else () + }) }; (: stats :) diff --git a/src/test/xbow-spec.xqm b/src/test/xbow-spec.xqm index 0d99842..c1718d4 100644 --- a/src/test/xbow-spec.xqm +++ b/src/test/xbow-spec.xqm @@ -210,22 +210,17 @@ function xbow-spec:array-group-by-even-odd-accessor () { declare %test:assertEquals(1) function xbow-spec:pluck-deep () { - map { - 'a': map { - 'b': map { - 'c': map { - 'd': map { - 'e': map { - 'f': 1 - } - } - } - } - } - } + map {'a': map {'b': map {'c': map {'d': map {'e': map {'f': 1 }}}}}} => xbow:pluck-deep(('a','b','c','d','e','f')) }; +declare + %test:assertEmpty +function xbow-spec:pluck-deep-non-existent-field () { + map {'a': map {'b': map {'c': map {'d': map {'e': map {'f': 1 }}}}}} + => xbow:pluck-deep(('a','b','c', 1, 'd','e','f')) +}; + declare %test:assertEquals(9)