use of org.brackit.xquery.atomic.QNm in project sirix by sirixdb.
the class HashTest method testDeepTree.
@Ignore
private void testDeepTree(final XdmNodeWriteTrx wtx) throws SirixException {
wtx.insertElementAsFirstChild(new QNm(NAME1));
final long oldHash = wtx.getHash();
wtx.insertElementAsFirstChild(new QNm(NAME1));
wtx.insertElementAsFirstChild(new QNm(NAME2));
wtx.insertElementAsFirstChild(new QNm(NAME1));
wtx.insertElementAsFirstChild(new QNm(NAME2));
wtx.insertElementAsFirstChild(new QNm(NAME1));
wtx.remove();
wtx.insertElementAsFirstChild(new QNm(NAME2));
wtx.insertElementAsFirstChild(new QNm(NAME2));
wtx.insertElementAsFirstChild(new QNm(NAME1));
wtx.moveTo(1);
wtx.moveTo(wtx.getFirstChildKey());
wtx.remove();
assertEquals(oldHash, wtx.getHash());
}
use of org.brackit.xquery.atomic.QNm in project sirix by sirixdb.
the class AttributeAxisTest method testMultipleAttributes.
@Test
public void testMultipleAttributes() throws SirixException {
final XdmNodeWriteTrx wtx = holder.getResourceManager().beginNodeWriteTrx();
final long nodeKey = wtx.insertElementAsFirstChild(new QNm("foo")).getNodeKey();
wtx.insertAttribute(new QNm("foo0"), "0");
wtx.moveTo(nodeKey);
wtx.insertAttribute(new QNm("foo1"), "1");
wtx.moveTo(nodeKey);
wtx.insertAttribute(new QNm("foo2"), "2");
Assert.assertEquals(true, wtx.moveTo(nodeKey).hasMoved());
Assert.assertEquals(true, wtx.moveToAttribute(0).hasMoved());
Assert.assertEquals("0", wtx.getValue());
Assert.assertEquals(new QNm("foo0"), wtx.getName());
Assert.assertEquals(true, wtx.moveToParent().hasMoved());
Assert.assertEquals(true, wtx.moveToAttribute(1).hasMoved());
Assert.assertEquals("1", wtx.getValue());
Assert.assertEquals(new QNm("foo1"), wtx.getName());
Assert.assertEquals(true, wtx.moveToParent().hasMoved());
Assert.assertEquals(true, wtx.moveToAttribute(2).hasMoved());
Assert.assertEquals("2", wtx.getValue());
Assert.assertEquals(new QNm("foo2"), wtx.getName());
Assert.assertEquals(true, wtx.moveTo(nodeKey).hasMoved());
final AbstractAxis axis = new AttributeAxis(wtx);
Assert.assertEquals(true, axis.hasNext());
axis.next();
Assert.assertEquals(nodeKey + 1, wtx.getNodeKey());
Assert.assertEquals(new QNm("foo0"), wtx.getName());
Assert.assertEquals("0", wtx.getValue());
Assert.assertEquals(true, axis.hasNext());
axis.next();
Assert.assertEquals(nodeKey + 2, wtx.getNodeKey());
Assert.assertEquals(new QNm("foo1"), wtx.getName());
Assert.assertEquals("1", wtx.getValue());
Assert.assertEquals(true, axis.hasNext());
axis.next();
Assert.assertEquals(nodeKey + 3, wtx.getNodeKey());
Assert.assertEquals(new QNm("foo2"), wtx.getName());
Assert.assertEquals("2", wtx.getValue());
wtx.rollback();
wtx.close();
}
use of org.brackit.xquery.atomic.QNm in project sirix by sirixdb.
the class NodePageTest method testSerializeDeserialize.
@Test
public void testSerializeDeserialize() throws IOException {
final UnorderedKeyValuePage page1 = new UnorderedKeyValuePage(0L, PageKind.RECORDPAGE, Constants.NULL_ID_LONG, mPageReadTrx);
assertEquals(0L, page1.getPageKey());
final NodeDelegate del = new NodeDelegate(0, 1, 0, 0, Optional.of(SirixDeweyID.newRootID()));
final StructNodeDelegate strucDel = new StructNodeDelegate(del, 12l, 4l, 3l, 1l, 0l);
final NameNodeDelegate nameDel = new NameNodeDelegate(del, 5, 6, 7, 1);
final ElementNode node1 = new ElementNode(strucDel, nameDel, new ArrayList<Long>(), HashBiMap.<Long, Long>create(), new ArrayList<Long>(), new QNm("a", "b", "c"));
node1.insertAttribute(88L, 100);
node1.insertAttribute(87L, 101);
node1.insertNamespace(99L);
node1.insertNamespace(98L);
assertEquals(0L, node1.getNodeKey());
page1.setEntry(node1.getNodeKey(), node1);
final ByteArrayOutputStream out = new ByteArrayOutputStream();
final DataOutputStream dataOut = new DataOutputStream(out);
PagePersistenter.serializePage(dataOut, page1, SerializationType.DATA);
final ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray());
final UnorderedKeyValuePage page2 = (UnorderedKeyValuePage) PagePersistenter.deserializePage(new DataInputStream(in), mPageReadTrx, SerializationType.DATA);
// assertEquals(position, out.position());
final ElementNode element = (ElementNode) page2.getValue(0l);
assertEquals(0L, page2.getValue(0l).getNodeKey());
assertEquals(1L, element.getParentKey());
assertEquals(12L, element.getFirstChildKey());
assertEquals(3L, element.getLeftSiblingKey());
assertEquals(4L, element.getRightSiblingKey());
assertEquals(1, element.getChildCount());
assertEquals(2, element.getAttributeCount());
assertEquals(2, element.getNamespaceCount());
assertEquals(88L, element.getAttributeKey(0));
assertEquals(87L, element.getAttributeKey(1));
assertEquals(99L, element.getNamespaceKey(0));
assertEquals(98L, element.getNamespaceKey(1));
assertEquals(5, ((NameNode) page2.getValue(0l)).getURIKey());
assertEquals(6, ((NameNode) page2.getValue(0l)).getPrefixKey());
assertEquals(7, ((NameNode) page2.getValue(0l)).getLocalNameKey());
assertEquals(NamePageHash.generateHashForString("xs:untyped"), element.getTypeKey());
}
use of org.brackit.xquery.atomic.QNm in project sirix by sirixdb.
the class XdmNodeWriterTrxImpl method insertAttribute.
@Override
public XdmNodeWriteTrx insertAttribute(final QNm name, final String value, final Movement move) throws SirixException {
checkNotNull(value);
if (!XMLToken.isValidQName(checkNotNull(name))) {
throw new IllegalArgumentException("The QName is not valid!");
}
acquireLock();
try {
if (getCurrentNode().getKind() == Kind.ELEMENT) {
checkAccessAndCommit();
/*
* Update value in case of the same attribute name is found but the attribute to insert has
* a different value (otherwise an exception is thrown because of a duplicate attribute
* which would otherwise be inserted!).
*/
final ElementNode element = (ElementNode) getCurrentNode();
final Optional<Long> attKey = element.getAttributeKeyByName(name);
if (attKey.isPresent()) {
moveTo(attKey.get());
final QNm qName = getName();
if (name.equals(qName)) {
if (getValue().equals(value)) {
throw new SirixUsageException("Duplicate attribute!");
} else {
setValue(value);
}
}
moveToParent();
}
// Get the path node key.
final long pathNodeKey = mNodeReader.mResourceManager.getResourceConfig().mPathSummary ? mPathSummaryWriter.getPathNodeKey(name, Kind.ATTRIBUTE) : 0;
final byte[] attValue = getBytes(value);
final Optional<SirixDeweyID> id = newAttributeID();
final long elementKey = getCurrentNode().getNodeKey();
final AttributeNode node = mNodeFactory.createAttributeNode(elementKey, name, attValue, pathNodeKey, id);
final Node parentNode = (Node) getPageTransaction().prepareEntryForModification(node.getParentKey(), PageKind.RECORDPAGE, -1, Optional.<UnorderedKeyValuePage>empty());
((ElementNode) parentNode).insertAttribute(node.getNodeKey(), node.getPrefixKey() + node.getLocalNameKey());
mNodeReader.setCurrentNode(node);
adaptHashesWithAdd();
// Index text value.
mIndexController.notifyChange(ChangeType.INSERT, node, pathNodeKey);
if (move == Movement.TOPARENT) {
moveToParent();
}
return this;
} else {
throw new SirixUsageException("Insert is not allowed if current node is not an ElementNode!");
}
} finally {
unLock();
}
}
use of org.brackit.xquery.atomic.QNm in project sirix by sirixdb.
the class XdmNodeWriterTrxImpl method insertNamespace.
@Override
public XdmNodeWriteTrx insertNamespace(final QNm name, final Movement move) throws SirixException {
if (!XMLToken.isValidQName(checkNotNull(name))) {
throw new IllegalArgumentException("The QName is not valid!");
}
acquireLock();
try {
if (getCurrentNode().getKind() == Kind.ELEMENT) {
checkAccessAndCommit();
for (int i = 0, namespCount = ((ElementNode) getCurrentNode()).getNamespaceCount(); i < namespCount; i++) {
moveToNamespace(i);
final QNm qName = getName();
if (name.getPrefix().equals(qName.getPrefix())) {
throw new SirixUsageException("Duplicate namespace!");
}
moveToParent();
}
final long pathNodeKey = mBuildPathSummary ? mPathSummaryWriter.getPathNodeKey(name, Kind.NAMESPACE) : 0;
final long elementKey = getCurrentNode().getNodeKey();
final Optional<SirixDeweyID> id = newNamespaceID();
final NamespaceNode node = mNodeFactory.createNamespaceNode(elementKey, name, pathNodeKey, id);
final Node parentNode = (Node) getPageTransaction().prepareEntryForModification(node.getParentKey(), PageKind.RECORDPAGE, -1, Optional.<UnorderedKeyValuePage>empty());
((ElementNode) parentNode).insertNamespace(node.getNodeKey());
mNodeReader.setCurrentNode(node);
adaptHashesWithAdd();
if (move == Movement.TOPARENT) {
moveToParent();
}
return this;
} else {
throw new SirixUsageException("Insert is not allowed if current node is not an ElementNode!");
}
} finally {
unLock();
}
}
Aggregations