MCPcopy Create free account
hub / github.com/BaseXdb/basex / item

Method item

basex-core/src/main/java/org/basex/query/up/expr/Insert.java:50–102  ·  view source on GitHub ↗
(final QueryContext qc, final InputInfo ii)

Source from the content-addressed store, hash-verified

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) {

Callers

nothing calls this directly

Calls 15

oneOfMethod · 0.95
determineDataRefMethod · 0.95
preMethod · 0.95
dataMethod · 0.95
addMethod · 0.95
builderMethod · 0.80
checkWriteMethod · 0.80
checkNSMethod · 0.80
nextMethod · 0.65
getMethod · 0.65
kindMethod · 0.65
unwrappedIterMethod · 0.45

Tested by

no test coverage detected