(final QueryContext qc, final InputInfo ii)
| 48 | } |
| 49 | |
| 50 | @Override |
| 51 | public Item item(final QueryContext qc, final InputInfo ii) throws QueryException { |
| 52 | final Iter iter = arg(0).unwrappedIter(qc); |
| 53 | final boolean sibling = mode == Mode.BEFORE || mode == Mode.AFTER; |
| 54 | FBuilder builder = null; |
| 55 | |
| 56 | for(Item item; (item = qc.next(iter)) != null;) { |
| 57 | if(!(item instanceof final XNode node)) |
| 58 | throw (sibling ? UPTRGTYP2_X : UPTRGTYP_X).get(info, item); |
| 59 | |
| 60 | final XNode parent = node.parent(); |
| 61 | final Kind kind = node.kind(); |
| 62 | if(sibling) { |
| 63 | if(kind.oneOf(Kind.ATTRIBUTE, Kind.DOCUMENT)) throw UPTRGTYP2_X.get(info, node); |
| 64 | if(parent == null) throw UPPAREMPTY_X.get(info, node); |
| 65 | } else { |
| 66 | if(!kind.oneOf(Kind.ELEMENT, Kind.DOCUMENT)) throw UPTRGTYP_X.get(info, node); |
| 67 | } |
| 68 | |
| 69 | if(builder == null) builder = builder(arg(1), qc); |
| 70 | final Updates updates = qc.updates(); |
| 71 | |
| 72 | // no update primitive is created if node list is empty |
| 73 | GNodeList list = builder.attributes; |
| 74 | if(list != null) { |
| 75 | final XNode target = sibling ? parent : node; |
| 76 | if(target.kind() != Kind.ELEMENT) |
| 77 | throw (sibling ? UPATTELM_X : UPATTELM2_X).get(info, target); |
| 78 | |
| 79 | final DBNode dbnode = updates.determineDataRef(target, qc); |
| 80 | checkWrite(dbnode, qc); |
| 81 | final NodeUpdate up = new InsertAttribute(dbnode.pre(), dbnode.data(), info, |
| 82 | checkNS(list, target)); |
| 83 | updates.add(up, qc); |
| 84 | } |
| 85 | |
| 86 | // no update primitive is created if node list is empty |
| 87 | list = builder.children; |
| 88 | if(list != null) { |
| 89 | final DBNode dbnode = updates.determineDataRef(node, qc); |
| 90 | checkWrite(dbnode, qc); |
| 91 | final NodeUpdate up = switch(mode) { |
| 92 | case BEFORE -> new InsertBefore(dbnode.pre(), dbnode.data(), info, list); |
| 93 | case AFTER -> new InsertAfter(dbnode.pre(), dbnode.data(), info, list); |
| 94 | case FIRST -> new InsertIntoAsFirst(dbnode.pre(), dbnode.data(), info, list); |
| 95 | case LAST -> new InsertIntoAsLast(dbnode.pre(), dbnode.data(), info, list); |
| 96 | default -> new InsertInto(dbnode.pre(), dbnode.data(), info, list); |
| 97 | }; |
| 98 | updates.add(up, qc); |
| 99 | } |
| 100 | } |
| 101 | return Empty.VALUE; |
| 102 | } |
| 103 | |
| 104 | @Override |
| 105 | public Expr copy(final CompileContext cc, final IntObjectMap<Var> vm) { |
nothing calls this directly
no test coverage detected