n
Project: http://git-wip-us.apache.org/repos/asf/vxquery/repo Commit: http://git-wip-us.apache.org/repos/asf/vxquery/commit/a041a329 Tree: http://git-wip-us.apache.org/repos/asf/vxquery/tree/a041a329 Diff: http://git-wip-us.apache.org/repos/asf/vxquery/diff/a041a329 Branch: refs/heads/master Commit: a041a329d54a560a64d65d0e4d3442a8be04c72c Parents: b6f8d45 Author: Shivani Mall <[email protected]> Authored: Wed Jun 3 14:14:45 2015 -0700 Committer: Eldon Carman <[email protected]> Committed: Thu Jun 18 13:14:52 2015 -0700 ---------------------------------------------------------------------- src/site/apt/development_xml_document.apt | 519 +++++++++++++++++++ .../java/org/apache/vxquery/cli/VXQuery.java | 79 +-- .../query/VXQueryCompilationListener.java | 107 ++++ .../org/apache/vxquery/xtest/TestRunner.java | 38 +- .../org/apache/vxquery/xtest/XTestOptions.java | 21 + .../cat/GhcndRecordsPartition2Queries.xml | 6 + .../cat/GhcndRecordsPartition4Queries.xml | 6 + 7 files changed, 700 insertions(+), 76 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/vxquery/blob/a041a329/src/site/apt/development_xml_document.apt ---------------------------------------------------------------------- diff --git a/src/site/apt/development_xml_document.apt b/src/site/apt/development_xml_document.apt new file mode 100644 index 0000000..035518e --- /dev/null +++ b/src/site/apt/development_xml_document.apt @@ -0,0 +1,519 @@ +~~ Licensed to the Apache Software Foundation (ASF) under one or more +~~ contributor license agreements. See the NOTICE file distributed with +~~ this work for additional information regarding copyright ownership. +~~ The ASF licenses this file to You under the Apache License, Version 2.0 +~~ (the "License"); you may not use this file except in compliance with +~~ the License. You may obtain a copy of the License at +~~ +~~ http://www.apache.org/licenses/LICENSE-2.0 +~~ +~~ Unless required by applicable law or agreed to in writing, software +~~ distributed under the License is distributed on an "AS IS" BASIS, +~~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +~~ See the License for the specific language governing permissions and +~~ limitations under the License. + +VXQuery's XML Document Model + + +*Byte Array Break Down + + Every XML document in VXQuery is stored in memory as one continuous array of bytes. + Pointables are used to refer to these bytes in the memory. + This document attempts to cover all the different types of elements of an XML document + and their representation in VXQuery. As a result, we use a lots of pointables (same and different) + through out the document. To simplify explanations, each pointable is explicitly assigned a NodeID only on this web page. + Refer to the following link for details on the various pointables used: + {{{http://vxquery.apache.org/development_xml_node_details.html} XML Node Details }}. + +**XML Document + +--- +<?xml version="1.0"?> +<catalog xmlns:ex="http://example.org/" > + <ex:book isbn="0812416139"> + <!--top secret--> + <title>Macbeth</title> + <?hide?> + </ex:book> +</catalog> +--- + +**{Bytes} + +*** <<<107, 3, 0, 0, 0, 0, 0, 0, 0, -109, 0, 0, 0, 7, 0, 0, 0, 6, 0, 0, 0, 19, 0, 0, 0, 44, 0, 0, 0, 54, 0, 0, 0, 62, 0, 0, 0, 72, 0, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 4, 0, 0, 0, 2, 0, 0, 0, 5, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 7, 99, 97, 116, 97, 108, 111, 103, 0, 0, 0, 1, 0, 19, 104, 116, 116, 112, 58, 47, 47, 101, 120, 97, 109, 112, 108, 101, 46, 111, 114, 103, 47, 0, 0, 0, 2, 0, 4, 98, 111, 111, 107, 0, 0, 0, 3, 0, 2, 101, 120, 0, 0, 0, 4, 0, 4, 105, 115, 98, 110, 0, 0, 0, 5, 0, 5, 116, 105, 116, 108, 101, 0, 0, 0, 6, 101, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 102, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 10, 0, 0, 0, -42, 0, 0, 0, -34, 104, 0, 0, 0, 2, 0, 3, 10, 32, 32, 102, 6, 0, 0, 0, 4, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 30, 103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 4, 14, 0, 10, 48, 56, 49, 50, 52, 49, 54, 49, 51, 57, 0, 0, 0, 7, 0, 0, 0, 12, 0, 0, 0, 29, 0, 0, 0, 41, 0, 0, 0, 81, 0, 0, 0, 93, 0, 0, 0, 106, 0, 0, 0, 116, 104, 0, 0, 0, 5, 0, 5, 10, 32, 32, 32, 32, 105, 0, 0, 0, 6, 0, 10, 116, 111, 112, 32, 115, 101, 99, 114, 101, 116, 104, 0, 0, 0, 7, 0, 5, 10, 32, 32, 32, 32, 102, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 8, 0, 0, 0, 1, 0, 0, 0, 14, 104, 0, 0, 0, 9, 0, 7, 77, 97, 99, 98, 101, 116, 104, 104, 0, 0, 0, 10, 0, 5, 10, 32, 32, 32, 32, 106, 0, 0, 0, 11, 0, 4, 104, 105, 100, 101, 0, 0, 104, 0, 0, 0, 12, 0, 3, 10, 32, 32, 104, 0, 0, 0, 13, 0, 1, 10>>> + + +========================================================================= + + +** {Node Tree Pointable} (NTP) + + Refer to this link to view the {{Bytes}} for the NTP. + + XML Documents in VXQuery are wrapped in Node Tree Pointables. As a side note, every + result produced as an output of a function is also wrapped in a NTP. + + <<< 107 >>> Value tag for Node Tree Pointable + + <<< 3 >>> Header byte (One byte) that uses the lowest three bit to denote if + + ** bit <Node Id> exists: <Yes> + + ** bit <Dictionary> exists: <Yes> + + ** bit <Header Type> exists: <No> + + <<< 0, 0, 0, 0 >>> These 4 bytes represent the <Node Id> which has value <<0>> + + Following are the byte contents of the {{Dictionary}}. The byte array break + down is explained in details further ahead. + +*** <<<0, 0, 0, -109, 0, 0, 0, 7, 0, 0, 0, 6, 0, 0, 0, 19, 0, 0, 0, 44, 0, 0, 0, 54, 0, 0, 0, 62, 0, 0, 0, 72, 0, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 4, 0, 0, 0, 2, 0, 0, 0, 5, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 7, 99, 97, 116, 97, 108, 111, 103, 0, 0, 0, 1, 0, 19, 104, 116, 116, 112, 58, 47, 47, 101, 120, 97, 109, 112, 108, 101, 46, 111, 114, 103, 47, 0, 0, 0, 2, 0, 4, 98, 111, 111, 107, 0, 0, 0, 3, 0, 2, 101, 120, 0, 0, 0, 4, 0, 4, 105, 115, 98, 110, 0, 0, 0, 5, 0, 5, 116, 105, 116, 108, 101, 0, 0, 0, 6>>> + + Element Node in NTP(root node): + + In this NTP, the Element Node or the root node is a Document Node Pointable (DNP) ({{NodeID:0}}). Note that this root node can represent any pointable type. + For example: ElementNodePointable, Attribute Node Pointable or Text Node Pointable. + + <<<101>>> This is the <Value Tag> for Document Node Pointable. + + Following are the byte contents for the Document Node Pointable ({{NodeID:0}}). + The byte array break down is explained further ahead. + +*** <<<101, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 102, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 10, 0, 0, 0, -42, 0, 0, 0, -34, 104, 0, 0, 0, 2, 0, 3, 10, 32, 32, 102, 6, 0, 0, 0, 4, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 30, 103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 4, 14, 0, 10, 48, 56, 49, 50, 52, 49, 54, 49, 51, 57, 0, 0, 0, 7, 0, 0, 0, 12, 0, 0, 0, 29, 0, 0, 0, 41, 0, 0, 0, 81, 0, 0, 0, 93, 0, 0, 0, 106, 0, 0, 0, 116, 104, 0, 0, 0, 5, 0, 5, 10, 32, 32, 32, 32, 105, 0, 0, 0, 6, 0, 10, 116, 111, 112, 32, 115, 101, 99, 114, 101, 116, 104, 0, 0, 0, 7, 0, 5, 10, 32, 32, 32, 32, 102, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 8, 0, 0, 0, 1, 0, 0, 0, 14, 104, 0, 0, 0, 9, 0, 7, 77, 97, 99, 98, 101, 116, 104, 104, 0, 0, 0, 10, 0, 5, 10, 32, 32, 32, 32, 106, 0, 0, 0, 11, 0, 4, 104, 105, 100, 101, 0, 0, 104, 0, 0, 0, 12, 0, 3, 10, 32, 32, 104, 0, 0, 0, 13, 0, 1, 10>>> + +========================================================================= + +** {Dictionary} + + Byte Array for the Dictionary + +*** <<<0, 0, 0, -109, 0, 0, 0, 7, 0, 0, 0, 6, 0, 0, 0, 19, 0, 0, 0, 44, 0, 0, 0, 54, 0, 0, 0, 62, 0, 0, 0, 72, 0, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 4, 0, 0, 0, 2, 0, 0, 0, 5, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 7, 99, 97, 116, 97, 108, 111, 103, 0, 0, 0, 1, 0, 19, 104, 116, 116, 112, 58, 47, 47, 101, 120, 97, 109, 112, 108, 101, 46, 111, 114, 103, 47, 0, 0, 0, 2, 0, 4, 98, 111, 111, 107, 0, 0, 0, 3, 0, 2, 101, 120, 0, 0, 0, 4, 0, 4, 105, 115, 98, 110, 0, 0, 0, 5, 0, 5, 116, 105, 116, 108, 101, 0, 0, 0, 6>>> + +*** <<< 0, 0, 0, -109 >>> + + These 4 bytes represent the <Size of Dictionary> in signed integer format. + After conversion to unsigned integer format the value is <<147>>. + +*** <<<0, 0, 0, 7>>> + + These 4 bytes represent the <Number of items> in the dictionary: <<7>> + +*** <<<0, 0, 0, 6, 0, 0, 0, 19, 0, 0, 0, 44, 0, 0, 0, 54, 0, 0, 0, 62, 0, 0, 0, 72, 0, 0, 0, 83>>> + + This is a list of <Offsets> for each item in the dictionary. There are 7 offsets. + Each offset is 4 bytes long. Following are the 7 offsets: <<6, 19, 44, 54, 62, 72, 83>> + +*** <<<0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 4, 0, 0, 0, 2, 0, 0, 0, 5, 0, 0, 0, 6>>> + + This is a sorted list of keys in alphabetical order. Each key is 4 byte long. + Each key is mapped to a string in the dictionary. The keys are the numbers <<1>> through <<6>>. + + Following are the data values in the dictionary.Each data value is a + StringPointable. Each StringPointable maps to XML document strings. + +*** <<<0, 0, 0, 0, 0, 0>>> + + The <Size> of the string is <<0>>. The <String Value> is <<null>>. + The StringPointable is followed by the key which is <<0>>. + +*** <<<0, 7, 99, 97, 116, 97, 108, 111, 103, 0, 0, 0, 1>>> + + The <Size> of the string is <<7>>. The <String Value> is <<catalog>>. + The StringPointable is followed by the key which is <<1>>. + +*** <<<0, 19, 104, 116, 116, 112, 58, 47, 47, 101, 120, 97, 109, 112, 108, 101, 46, 111, 114, 103, 47, 0, 0, 0, 2>>> + + The <Size> of the string is <<19>>. The <String Value> is <<http://example.org/>>. The StringPointable is followed by the key which is <<2>>. + +*** <<<0, 4, 98, 111, 111, 107, 0, 0, 0, 3>>> + + The <Size> of the string is <<4>>. The <String Value> is <<book>>. The StringPointable is followed by the key which is <<3>>. + +*** <<<0, 2, 101, 120, 0, 0, 0, 4>>> + + The <Size> of the string is <<2>>. The <String Value> is <<ex>>. The StringPointable is followed by the key which is <<4>>. + +*** <<<0, 4, 105, 115, 98, 110, 0, 0, 0, 5>>> + + The <Size> of the string is <<4>>. The <String Value> is <<isbn>>. The StringPointable is followed by the key which is <<5>>. + +*** <<<0, 5, 116, 105, 116, 108, 101, 0, 0, 0, 6>>> + + The <Size> of the string is <<4>>. The <String Value> is <<title>>. The StringPointable is followed by the key which is <<6>>. + + +================================================================ + + +** Document Node Pointable ({NodeID:0}) + + This child is contained in the parent {{Node Tree Pointable}}. + + Byte Array for DNP NodeID:0 + +*** <<<101, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 102, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 10, 0, 0, 0, -42, 0, 0, 0, -34, 104, 0, 0, 0, 2, 0, 3, 10, 32, 32, 102, 6, 0, 0, 0, 4, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 30, 103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 4, 14, 0, 10, 48, 56, 49, 50, 52, 49, 54, 49, 51, 57, 0, 0, 0, 7, 0, 0, 0, 12, 0, 0, 0, 29, 0, 0, 0, 41, 0, 0, 0, 81, 0, 0, 0, 93, 0, 0, 0, 106, 0, 0, 0, 116, 104, 0, 0, 0, 5, 0, 5, 10, 32, 32, 32, 32, 105, 0, 0, 0, 6, 0, 10, 116, 111, 112, 32, 115, 101, 99, 114, 101, 116, 104, 0, 0, 0, 7, 0, 5, 10, 32, 32, 32, 32, 102, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 8, 0, 0, 0, 1, 0, 0, 0, 14, 104, 0, 0, 0, 9, 0, 7, 77, 97, 99, 98, 101, 116, 104, 104, 0, 0, 0, 10, 0, 5, 10, 32, 32, 32, 32, 106, 0, 0, 0, 11, 0, 4, 104, 105, 100, 101, 0, 0, 104, 0, 0, 0, 12, 0, 3, 10, 32, 32, 104, 0, 0, 0, 13, 0, 1, 10>>> + + + <<< 101 >>> Value tag for Document Node Pointable + + <<< 0, 0, 0, 0 >>> These 4 bytes represent the <Node Id> which has value <<0>> + + Every Document Node Pointable contains a Sequence Pointable. This is analogous + to a collection of items(data). In VXQuery, the items(data) + in the Sequence Pointable are preceded by the number of items in the sequence + and item size. + + Sequence Content: + + <<<0, 0, 0, 1>>> These 4 bytes represents the <Number of Items> in the sequence which is <<1>> + + <<<0, 0, 1, 0>>> These 4 bytes represents the <Size of the item> which is <<257>> + + <Data in the Sequence>: Here the (item)data in the sequence is an + Element Node Pointable ({{NodeID:1}}). Note that the data can represent any type of pointable or element. + +*** <<<102, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 10, 0, 0, 0, -42, 0, 0, 0, -34, 104, 0, 0, 0, 2, 0, 3, 10, 32, 32, 102, 6, 0, 0, 0, 4, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 30, 103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 4, 14, 0, 10, 48, 56, 49, 50, 52, 49, 54, 49, 51, 57, 0, 0, 0, 7, 0, 0, 0, 12, 0, 0, 0, 29, 0, 0, 0, 41, 0, 0, 0, 81, 0, 0, 0, 93, 0, 0, 0, 106, 0, 0, 0, 116, 104, 0, 0, 0, 5, 0, 5, 10, 32, 32, 32, 32, 105, 0, 0, 0, 6, 0, 10, 116, 111, 112, 32, 115, 101, 99, 114, 101, 116, 104, 0, 0, 0, 7, 0, 5, 10, 32, 32, 32, 32, 102, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 8, 0, 0, 0, 1, 0, 0, 0, 14, 104, 0, 0, 0, 9, 0, 7, 77, 97, 99, 98, 101, 116, 104, 104, 0, 0, 0, 10, 0, 5, 10, 32, 32, 32, 32, 106, 0, 0, 0, 11, 0, 4, 104, 105, 100, 101, 0, 0, 104, 0, 0, 0, 12, 0, 3, 10, 32, 32, 104, 0, 0, 0, 13, 0, 1, 10>>> + + +================================================================ + + +** Element Node Pointable ({NodeID:1}) + + This child is contained in the parent Document Node Pointable ({{NodeID:0}}). + + Byte Array for ENP NodeID:1 + +*** <<<102, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 10, 0, 0, 0, -42, 0, 0, 0, -34, 104, 0, 0, 0, 2, 0, 3, 10, 32, 32, 102, 6, 0, 0, 0, 4, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 30, 103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 4, 14, 0, 10, 48, 56, 49, 50, 52, 49, 54, 49, 51, 57, 0, 0, 0, 7, 0, 0, 0, 12, 0, 0, 0, 29, 0, 0, 0, 41, 0, 0, 0, 81, 0, 0, 0, 93, 0, 0, 0, 106, 0, 0, 0, 116, 104, 0, 0, 0, 5, 0, 5, 10, 32, 32, 32, 32, 105, 0, 0, 0, 6, 0, 10, 116, 111, 112, 32, 115, 101, 99, 114, 101, 116, 104, 0, 0, 0, 7, 0, 5, 10, 32, 32, 32, 32, 102, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 8, 0, 0, 0, 1, 0, 0, 0, 14, 104, 0, 0, 0, 9, 0, 7, 77, 97, 99, 98, 101, 116, 104, 104, 0, 0, 0, 10, 0, 5, 10, 32, 32, 32, 32, 106, 0, 0, 0, 11, 0, 4, 104, 105, 100, 101, 0, 0, 104, 0, 0, 0, 12, 0, 3, 10, 32, 32, 104, 0, 0, 0, 13, 0, 1, 10>>> + + <<< 102 >>> Value tag for Element Node Pointable + + <<< 4 >>> Header byte (One byte) that uses the lowest three bits to denote if + + ** bit <Namespace Chunk> exists: <No> + + ** bit <Attribute Chunk> exists: <No> + + ** bit <Children Chunk> exists: <Yes> + + <<<0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1>>> This is a <Name Pointer> which is an array of integers(4 bytes) of size <<3>> + + <<<0, 0, 0, 1>>> This is the <Local Node Id> which uses 4 bytes. + + Children Chunk is a Sequence Pointable. This is analogous to a collection of items(data). In VXQuery, the items(data) + in the Sequence Pointable are preceded by the number of items in the sequence and item size. + + Sequence Content childrenChunk: + + <<<0, 0, 0, 3>>> <Number of Items> in the SequencePointable <children chunk> is <<3>> + + <<<0, 0, 0, 10>>> <Offset> of the first item is <<10>> + + <<<0, 0, 0, -42>>> <Offset> of the second item is <<214>> + + <<<0, 0, 0, -34>>> <Offset> of the third item is <<222>> + + <Data in the Sequence>: Here the items(data) in the sequence are Text Node Pointables ({{NodeID:2}}), + ({{NodeID:13}}) and Element Node Pointable ({{NodeID:3}}). + Note that the data can represent any type of pointable or element. + +*** <<<104, 0, 0, 0, 2, 0, 3, 10, 32, 32, 102, 6, 0, 0, 0, 4, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 30, 103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 4, 14, 0, 10, 48, 56, 49, 50, 52, 49, 54, 49, 51, 57, 0, 0, 0, 7, 0, 0, 0, 12, 0, 0, 0, 29, 0, 0, 0, 41, 0, 0, 0, 81, 0, 0, 0, 93, 0, 0, 0, 106, 0, 0, 0, 116, 104, 0, 0, 0, 5, 0, 5, 10, 32, 32, 32, 32, 105, 0, 0, 0, 6, 0, 10, 116, 111, 112, 32, 115, 101, 99, 114, 101, 116, 104, 0, 0, 0, 7, 0, 5, 10, 32, 32, 32, 32, 102, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 8, 0, 0, 0, 1, 0, 0, 0, 14, 104, 0, 0, 0, 9, 0, 7, 77, 97, 99, 98, 101, 116, 104, 104, 0, 0, 0, 10, 0, 5, 10, 32, 32, 32, 32, 106, 0, 0, 0, 11, 0, 4, 104, 105, 100, 101, 0, 0, 104, 0, 0, 0, 12, 0, 3, 10, 32, 32, 104, 0, 0, 0, 13, 0, 1, 10>>> + + +================================================================ + + +** Text Node Pointable ({NodeID:2}) + + This child is contained in the parent Element Node Pointable ({{NodeID:1}}). + + Byte Array for TNP NodeID:2 + +*** <<<104, 0, 0, 0, 2, 0, 3, 10, 32, 32>>> + + <<< 104 >>> Value tag for Text Node Pointable + + <<<0, 0, 0, 2>>> This is the <Node Id> that uses 4 bytes and has value <<2>> + + <<<0, 3, 10, 32, 32>>> This is the <UTF8String> which has a size <<3>> and value <<10, 32, 32>> + + +================================================================ + + +** Element Node Pointable ({NodeID:3}) + + This child is contained in the parent Element Node Pointable ({{NodeID:1}}). + + Byte Array for TNP NodeID:3 + +*** <<<102, 6, 0, 0, 0, 4, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 30, 103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 4, 14, 0, 10, 48, 56, 49, 50, 52, 49, 54, 49, 51, 57, 0, 0, 0, 7, 0, 0, 0, 12, 0, 0, 0, 29, 0, 0, 0, 41, 0, 0, 0, 81, 0, 0, 0, 93, 0, 0, 0, 106, 0, 0, 0, 116, 104, 0, 0, 0, 5, 0, 5, 10, 32, 32, 32, 32, 105, 0, 0, 0, 6, 0, 10, 116, 111, 112, 32, 115, 101, 99, 114, 101, 116, 104, 0, 0, 0, 7, 0, 5, 10, 32, 32, 32, 32, 102, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 8, 0, 0, 0, 1, 0, 0, 0, 14, 104, 0, 0, 0, 9, 0, 7, 77, 97, 99, 98, 101, 116, 104, 104, 0, 0, 0, 10, 0, 5, 10, 32, 32, 32, 32, 106, 0, 0, 0, 11, 0, 4, 104, 105, 100, 101, 0, 0, 104, 0, 0, 0, 12, 0, 3, 10, 32, 32>>> + + <<< 102 >>> Value tag for Element Node Pointable + + <<< 6 >>> Header byte (One byte) that uses the three lowest bit to denote if + + ** bit <Namespace Chunk> exists: <No> + + ** bit <Attribute Chunk> exists: <Yes> + + ** bit <Children Chunk> exists: <Yes> + + <<<0, 0, 0, 4, 0, 0, 0, 2, 0, 0, 0, 3>>> This is a <Name Pointer> which is an array of integers(4 bytes) of size <<3>> + + <<<0, 0, 0, 3>>> This is the <Local Node Id> which uses 4 bytes. + + Attribute Chunk is a Sequence Pointable. + + Sequence Content attributeChunk: + + <<<0, 0, 0, 1>>> <Number of Items> in the SequencePointable <attribute chunk> is <<1>> + + <<<0, 0, 0, 30>>> <Size> of the first item is <<30>> + + <Data in the Sequence>: Here the item(data) in the sequence is an + Attribute Node Pointable ({{NodeID:4}}). Note that the data can represent any type of pointable or element. + +*** <<< 103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 4, 14, 0, 10, 48, 56, 49, 50, 52, 49, 54, 49, 51, 57>>> + + Children Chunk is a Sequence Pointable. This is analogous to a collection of + items(data). In VXQuery, the items(data) + in the Sequence Pointable are preceded by the number of items in the sequence and item size. + + Sequence Content childrenChunk: + + <<<0, 0, 0, 7>>> <Number of Items> in the SequencePointable <children chunk> is <<3>> + + <<<0, 0, 0, 12>>> <Offset> of the first item is <<12>> + + <<<0, 0, 0, 29>>> <Offset> of the second item is <<12>> + + <<<0, 0, 0, 41>>> <Offset> of the third item is <<41>> + + <<<0, 0, 0, 81>>> <Offset> of the fourth item is <<81>> + + <<<0, 0, 0, 93>>> <Offset> of the fifth item is <<93>> + + <<<0, 0, 0, 106>>> <Offset> of the sixth item is <<106>> + + <<<0, 0, 0, 116>>> <Offset> of the seventh item is <<116>> + + <Data in the Sequence>: Here the items(data) in the sequence are Text Node Pointables + ({{NodeID:5}}), ({{NodeID:7}}), ({{NodeID:10}}), ({{NodeID:12}}), + ElementNodePointable ({{NodeID:8}}), CommentNodePointable ({{NodeID:6}}) and + PINodePointable ({{NodeID:11}}). + +*** <<<104, 0, 0, 0, 5, 0, 5, 10, 32, 32, 32, 32, 105, 0, 0, 0, 6, 0, 10, 116, 111, 112, 32, 115, 101, 99, 114, 101, 116, 104, 0, 0, 0, 7, 0, 5, 10, 32, 32, 32, 32, 102, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 8, 0, 0, 0, 1, 0, 0, 0, 14, 104, 0, 0, 0, 9, 0, 7, 77, 97, 99, 98, 101, 116, 104, 104, 0, 0, 0, 10, 0, 5, 10, 32, 32, 32, 32, 106, 0, 0, 0, 11, 0, 4, 104, 105, 100, 101, 0, 0, 104, 0, 0, 0, 12, 0, 3, 10, 32, 32, 104, 0, 0, 0, 13, 0, 1, 10>>> + + +================================================================ + + +** Attribute Node Pointable ({NodeID:3}) + + This child is contained in the parent Element Node Pointable ({{NodeID:3}}). + + Byte Array for ANP NodeID:3 + +*** <<<103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 4, 14, 0, 10, 48, 56, 49, 50, 52, 49, 54, 49, 51, 57>>> + + <<< 103 >>> Value tag for Attribute Node Pointable + + <<<0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,>>> This is a <Name Pointer> + which is an array of integers(4 bytes) of size <<3>>. It consists of <PrefixCode>, <NamespaceCode>, <LocalCode>. + + <<<0, 0, 0, 4>>> This is the <NodeId> which has a value of <<4>>. + + <<<14, 0, 10, 48, 56, 49, 50, 52, 49, 54, 49, 51, 57 >>> This is a + string of length <<10>> and the length of the string is <<0812416139>> + + +================================================================ + + +** Text Node Pointable ({NodeID:5}) + + This child is contained in the parent Element Node Pointable ({{NodeID:3}}) childrenChunnk. + + Byte Array for TNP NodeID:5 + +*** <<<104, 0, 0, 0, 5, 0, 5, 10, 32, 32, 32, 32>>> + + <<< 104 >>> Value tag for Text Node Pointable + + <<<0, 0, 0, 5>>> This is the <Node Id> that uses 4 bytes and has value <<2>> + + <<< 0, 5, 10, 32, 32, 32, 32>>> This is the <UTF8String> which has a size <<5>> + and value represents a <<new line>> and 4 <<spaces>> + + +================================================================ + + +** Comment Node Pointable ({NodeID:6}) + + This child is contained in the parent Element Node Pointable ({{NodeID:3}}) childrenChunnk. + + Byte Array for TNP NodeID:6 + +*** <<<105, 0, 0, 0, 6, 0, 10, 116, 111, 112, 32, 115, 101, 99, 114, 101, 116>>> + + <<< 105 >>> Value tag for Comment Node Pointable + + <<<0, 0, 0, 6>>> This is the <Node Id> that uses 4 bytes and has value <<6>> + + <<< 0, 10, 116, 111, 112, 32, 115, 101, 99, 114, 101, 116>>> This is the <UTF8String> which has a size <<10>> and value <<top secret>> + + +================================================================ + + +** Text Node Pointable ({NodeID:7}) + + This child is contained in the parent Element Node Pointable ({{NodeID:3}}) childrenChunnk. + + Byte Array for TNP NodeID:7 + +*** <<< 104, 0, 0, 0, 7, 0, 5, 10, 32, 32, 32, 32>>> + + <<< 104 >>> Value tag for Text Node Pointable + + <<<0, 0, 0, 7>>> This is the <Node Id> that uses 4 bytes and has value <<7>> + + <<< 0, 5, 10, 32, 32, 32, 32>>> This is the <UTF8String> which has a size <<5>> and value represents a <<new line>> and 4 <<spaces>> + + +================================================================ + + +** Element Node Pointable ({NodeID:8}) + + This child is contained in the parent Element Node Pointable ({{NodeID:3}}) childrenChunnk. + + Byte Array for TNP NodeID:8 + +*** <<<102, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 8, 0, 0, 0, 1, 0, 0, 0, 14, 104, 0, 0, 0, 9, 0, 7, 77, 97, 99, 98, 101, 116, 104>>> + + <<< 102 >>> Value tag for Element Node Pointable + + <<< 4 >>> Header byte (One byte) that uses the lowest three bits to denote if + + ** bit <Namespace Chunk> exists: <No> + + ** bit <Attribute Chunk> exists: <No> + + ** bit <Children Chunk> exists: <Yes> + + <<<0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6>>> This is a <Name Pointer> which is an array of integers(4 bytes) of size <<3>> + + <<<0, 0, 0, 8>>> This is the <Node Id> that uses 4 bytes and has value <<8>> + + Following is a SequencePointable. + + Sequence Content childrenChunk + + <<<0, 0, 0, 1>>> <Number of Items> in the SequencePointable <children chunk> is <<1>> + + <<<0, 0, 0, 14>>> <Offset> of the first item is <<14>> + + <Data in the Sequence>: Here the (item)data in the sequence is an Text Node Pointable ({{NodeID:9}}). + +*** <<< 104, 0, 0, 0, 9, 0, 7, 77, 97, 99, 98, 101, 116, 104>>> + + +================================================================ + + +** Text Node Pointable ({NodeID:9}) + + This child is contained in the parent Element Node Pointable ({{NodeID:8}}). + + Byte Array for TNP NodeID:9 + +*** <<<104, 0, 0, 0, 9, 0, 7, 77, 97, 99, 98, 101, 116, 104>>> + + <<< 104 >>> Value tag for Text Node Pointable + + <<<0, 0, 0, 9>>> This is the <Node Id> that uses 4 bytes and has value <<9>> + + <<<0, 7, 77, 97, 99, 98, 101, 116, 104>>> This is the <UTF8String> which has a size <<7>> and value <<Macbeth>> + + +================================================================ + + +** Text Node Pointable ({NodeID:10}) + + This child is contained in the parent Element Node Pointable ({{NodeID:3}}) childrenChunnk. + + Byte Array for TNP NodeID:10 + +*** <<<104, 0, 0, 0, 10, 0, 5, 10, 32, 32, 32, 32>>> + + <<< 104 >>> Value tag for Text Node Pointable + + <<<0, 0, 0, 10>>> This is the <Node Id> that uses 4 bytes and has value <<2>> + + <<<0, 5, 10, 32, 32, 32, 32>>> This is the <UTF8String> which has a size <<5>> + and value represents a <<new line>> and 4 <<spaces>> + + +================================================================ + + +** PI Node Pointable ({NodeID:11}) + + This child is contained in the parent Element Node Pointable ({{NodeID:3}}) childrenChunnk. + + Byte Array for TNP NodeID:11 + +*** <<<106, 0, 0, 0, 11, 0, 4, 104, 105, 100, 101>>> + + <<< 106 >>> Value tag for Processing Intruction Node Pointable + + <<<0, 0, 0, 11>>> This is the <Node Id> that uses 4 bytes and has value <<11>> + + <<<0, 4, 104, 105, 100, 101>>> This is the <UTF8String> which has a size <<4>> and value <<hide>> + + <<<0, 0>>> This is also a string representing content. It is a <<null string>>. + + +================================================================ + + +** Text Node Pointable ({NodeID:12}) + + This child is contained in the parent Element Node Pointable ({{NodeID:3}}) childrenChunnk. + + Byte Array for TNP NodeID:12 + +*** <<<104, 0, 0, 0, 12, 0, 3, 10, 32, 32>>> + + <<< 104 >>> Value tag for Text Node Pointable + + <<<0, 0, 0, 12>>> This is the <Node Id> that uses 4 bytes and has value <<12>> + + <<<0, 3, 10, 32, 32>>> This is the <UTF8String> which has a size <<3>> and value represents a <<new line>> and 2 <<spaces>>. + + +================================================================ + + +** Text Node Pointable ({NodeID:13}) + + This child is contained in the parent Element Node Pointable ({{NodeID:1}}). + + Byte Array for TNP NodeID:13 + +*** <<<104, 0, 0, 0, 13, 0, 1, 10>>> + + <<< 104 >>> Value tag for Text Node Pointable + + <<<0, 0, 0, 13>>> This is the <Node Id> that uses 4 bytes and has value <<13>> + + <<<0, 1, 10>>> This is the <UTF8String> which has a size <<1>> and value represents a <<new line>>. + + +================================================================ \ No newline at end of file http://git-wip-us.apache.org/repos/asf/vxquery/blob/a041a329/vxquery-cli/src/main/java/org/apache/vxquery/cli/VXQuery.java ---------------------------------------------------------------------- diff --git a/vxquery-cli/src/main/java/org/apache/vxquery/cli/VXQuery.java b/vxquery-cli/src/main/java/org/apache/vxquery/cli/VXQuery.java index 080f8a1..061c5ac 100644 --- a/vxquery-cli/src/main/java/org/apache/vxquery/cli/VXQuery.java +++ b/vxquery-cli/src/main/java/org/apache/vxquery/cli/VXQuery.java @@ -39,6 +39,7 @@ import org.apache.vxquery.exceptions.SystemException; import org.apache.vxquery.result.ResultUtils; import org.apache.vxquery.xmlquery.ast.ModuleNode; import org.apache.vxquery.xmlquery.query.Module; +import org.apache.vxquery.xmlquery.query.VXQueryCompilationListener; import org.apache.vxquery.xmlquery.query.XMLQueryCompiler; import org.apache.vxquery.xmlquery.query.XQueryCompilationListener; import org.json.JSONException; @@ -183,81 +184,9 @@ public class VXQuery { if (opts.showQuery) { System.err.println(qStr); } - XQueryCompilationListener listener = new XQueryCompilationListener() { - - /** - * On providing -showrp argument, output the query inputs, outputs and user constraints for each module as result of code generation. - * - * @param module - */ - @Override - public void notifyCodegenResult(Module module) { - if (opts.showRP) { - JobSpecification jobSpec = module.getHyracksJobSpecification(); - try { - System.err.println(jobSpec.toJSON().toString(2)); - } catch (JSONException e) { - e.printStackTrace(); - System.err.println(jobSpec.toString()); - } - } - } - - /** - * On providing -showtet argument, output the syntax translation tree for the module in the format: "-- logical operator(if exists) | execution mode |" - * where execution mode can be one of: UNPARTITIONED,PARTITIONED,LOCAL - * - * @param module - */ - @Override - public void notifyTranslationResult(Module module) { - if (opts.showTET) { - System.err.println(appendPrettyPlan(new StringBuilder(), module).toString()); - } - } - - @Override - public void notifyTypecheckResult(Module module) { - } - /** - * On providing -showoet argument, output the optimized expression tree for the module in the format: - * "-- logical operator(if exists) | execution mode |" where execution mode can be one of: UNPARTITIONED,PARTITIONED,LOCAL - * - * @param module - */ - @Override - public void notifyOptimizedResult(Module module) { - if (opts.showOET) { - System.err.println(appendPrettyPlan(new StringBuilder(), module).toString()); - } - } - - /** - * On providing -showast argument, output the abstract syntax tree obtained from parsing by serializing the DomDriver object to a pretty-printed XML - * String. - * - * @param moduleNode - */ - @Override - public void notifyParseResult(ModuleNode moduleNode) { - if (opts.showAST) { - System.err.println(new XStream(new DomDriver()).toXML(moduleNode)); - } - } - - private StringBuilder appendPrettyPlan(StringBuilder sb, Module module) { - try { - ILogicalExpressionVisitor<String, Integer> ev = new VXQueryLogicalExpressionPrettyPrintVisitor( - module.getModuleContext()); - LogicalOperatorPrettyPrintVisitor v = new LogicalOperatorPrettyPrintVisitor(ev); - PlanPrettyPrinter.printPlan(module.getBody(), sb, v, 0); - } catch (AlgebricksException e) { - e.printStackTrace(); - } - return sb; - } - }; + VXQueryCompilationListener listener = new VXQueryCompilationListener(opts.showAST, opts.showTET, + opts.showOET, opts.showRP); start = opts.timing ? new Date() : null; XMLQueryCompiler compiler = new XMLQueryCompiler(listener, getNodeList(), opts.frameSize, @@ -389,7 +318,7 @@ public class VXQuery { ncConfig.dataIPAddress = "127.0.0.1"; ncConfig.resultIPAddress = "127.0.0.1"; ncConfig.nodeId = "nc" + (i + 1); - ncConfig.ioDevices = Files.createTempDirectory(ncConfig.nodeId).toString(); + ncConfig.ioDevices = Files.createTempDirectory(ncConfig.nodeId).toString(); ncs[i] = new NodeControllerService(ncConfig); ncs[i].start(); } http://git-wip-us.apache.org/repos/asf/vxquery/blob/a041a329/vxquery-core/src/main/java/org/apache/vxquery/xmlquery/query/VXQueryCompilationListener.java ---------------------------------------------------------------------- diff --git a/vxquery-core/src/main/java/org/apache/vxquery/xmlquery/query/VXQueryCompilationListener.java b/vxquery-core/src/main/java/org/apache/vxquery/xmlquery/query/VXQueryCompilationListener.java new file mode 100644 index 0000000..7969c9e --- /dev/null +++ b/vxquery-core/src/main/java/org/apache/vxquery/xmlquery/query/VXQueryCompilationListener.java @@ -0,0 +1,107 @@ +package org.apache.vxquery.xmlquery.query; + +import org.apache.vxquery.compiler.algebricks.prettyprint.VXQueryLogicalExpressionPrettyPrintVisitor; +import org.apache.vxquery.xmlquery.ast.ModuleNode; +import org.apache.vxquery.xmlquery.query.Module; +import org.apache.vxquery.xmlquery.query.XQueryCompilationListener; +import org.json.JSONException; +import org.kohsuke.args4j.Option; + +import com.thoughtworks.xstream.XStream; +import com.thoughtworks.xstream.io.xml.DomDriver; + +import edu.uci.ics.hyracks.algebricks.common.exceptions.AlgebricksException; +import edu.uci.ics.hyracks.algebricks.core.algebra.prettyprint.LogicalOperatorPrettyPrintVisitor; +import edu.uci.ics.hyracks.algebricks.core.algebra.prettyprint.PlanPrettyPrinter; +import edu.uci.ics.hyracks.algebricks.core.algebra.visitors.ILogicalExpressionVisitor; +import edu.uci.ics.hyracks.api.job.JobSpecification; + +public class VXQueryCompilationListener implements XQueryCompilationListener { + + boolean showTET, showRP, showOET, showAST; + + public VXQueryCompilationListener(boolean showAST, boolean showTET, boolean showOET, boolean showRP) { + this.showTET = showTET; + this.showRP = showRP; + this.showOET = showOET; + this.showAST = showAST; + } + + /** + * Outputs the query inputs, outputs and user constraints for each module as result of code generation. + * + * @param module + */ + public void notifyCodegenResult(Module module) { + if (showRP) { + JobSpecification jobSpec = module.getHyracksJobSpecification(); + try { + System.err.println("***Runtime Plan: "); + System.err.println(jobSpec.toJSON().toString(2)); + } catch (JSONException e) { + e.printStackTrace(); + System.err.println(jobSpec.toString()); + } + } + } + + /** + * Outputs the syntax translation tree for the module in the format: "-- logical operator(if exists) | execution mode |" + * where execution mode can be one of: UNPARTITIONED,PARTITIONED,LOCAL + * + * @param module + */ + @Override + public void notifyTranslationResult(Module module) { + if (showTET) { + System.err.println("***Translated Expression Tree: "); + System.err.println(appendPrettyPlan(new StringBuilder(), module).toString()); + } + } + + @Override + public void notifyTypecheckResult(Module module) { + } + + /** + * Outputs the optimized expression tree for the module in the format: + * "-- logical operator(if exists) | execution mode |" where execution mode can be one of: UNPARTITIONED,PARTITIONED,LOCAL + * + * @param module + */ + @Override + public void notifyOptimizedResult(Module module) { + if (showOET) { + System.err.println("***Optimized Expression Tree: "); + System.err.println(appendPrettyPlan(new StringBuilder(), module).toString()); + } + } + + /** + * Outputs the abstract syntax tree obtained from parsing by serializing the DomDriver object to a pretty-printed XML + * String. + * + * @param moduleNode + */ + @Override + public void notifyParseResult(ModuleNode moduleNode) { + if (showAST) { + System.err.println("***Abstract Syntax Tree: "); + System.err.println(new XStream(new DomDriver()).toXML(moduleNode)); + } + } + + private StringBuilder appendPrettyPlan(StringBuilder sb, Module module) { + try { + ILogicalExpressionVisitor<String, Integer> ev = new VXQueryLogicalExpressionPrettyPrintVisitor( + module.getModuleContext()); + LogicalOperatorPrettyPrintVisitor v = new LogicalOperatorPrettyPrintVisitor(ev); + PlanPrettyPrinter.printPlan(module.getBody(), sb, v, 0); + } catch (AlgebricksException e) { + e.printStackTrace(); + } + return sb; + } + + +} http://git-wip-us.apache.org/repos/asf/vxquery/blob/a041a329/vxquery-xtest/src/main/java/org/apache/vxquery/xtest/TestRunner.java ---------------------------------------------------------------------- diff --git a/vxquery-xtest/src/main/java/org/apache/vxquery/xtest/TestRunner.java b/vxquery-xtest/src/main/java/org/apache/vxquery/xtest/TestRunner.java index facc698..cc4602e 100644 --- a/vxquery-xtest/src/main/java/org/apache/vxquery/xtest/TestRunner.java +++ b/vxquery-xtest/src/main/java/org/apache/vxquery/xtest/TestRunner.java @@ -14,8 +14,10 @@ */ package org.apache.vxquery.xtest; +import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; +import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; import java.nio.ByteBuffer; @@ -23,8 +25,10 @@ import java.util.EnumSet; import java.util.regex.Matcher; import java.util.regex.Pattern; +import org.apache.commons.io.IOUtils; import org.apache.vxquery.compiler.CompilerControlBlock; import org.apache.vxquery.compiler.algebricks.VXQueryGlobalDataFactory; +import org.apache.vxquery.compiler.algebricks.prettyprint.VXQueryLogicalExpressionPrettyPrintVisitor; import org.apache.vxquery.context.DynamicContext; import org.apache.vxquery.context.DynamicContextImpl; import org.apache.vxquery.context.RootStaticContextImpl; @@ -32,8 +36,21 @@ import org.apache.vxquery.context.StaticContextImpl; import org.apache.vxquery.exceptions.ErrorCode; import org.apache.vxquery.exceptions.SystemException; import org.apache.vxquery.result.ResultUtils; +import org.apache.vxquery.xmlquery.ast.ModuleNode; +import org.apache.vxquery.xmlquery.query.Module; +import org.apache.vxquery.xmlquery.query.VXQueryCompilationListener; import org.apache.vxquery.xmlquery.query.XMLQueryCompiler; +import org.apache.vxquery.xmlquery.query.XQueryCompilationListener; +import org.apache.vxquery.xtest.XTestOptions; +import org.json.JSONException; +import com.thoughtworks.xstream.XStream; +import com.thoughtworks.xstream.io.xml.DomDriver; + +import edu.uci.ics.hyracks.algebricks.common.exceptions.AlgebricksException; +import edu.uci.ics.hyracks.algebricks.core.algebra.prettyprint.LogicalOperatorPrettyPrintVisitor; +import edu.uci.ics.hyracks.algebricks.core.algebra.prettyprint.PlanPrettyPrinter; +import edu.uci.ics.hyracks.algebricks.core.algebra.visitors.ILogicalExpressionVisitor; import edu.uci.ics.hyracks.api.client.HyracksConnection; import edu.uci.ics.hyracks.api.client.IHyracksClientConnection; import edu.uci.ics.hyracks.api.comm.IFrameTupleAccessor; @@ -99,10 +116,21 @@ public class TestRunner { if (opts.verbose) { System.err.println("Starting " + testCase.getXQueryDisplayName()); } + long start = System.currentTimeMillis(); + try { try { - XMLQueryCompiler compiler = new XMLQueryCompiler(null, new String[] { "nc1" }, opts.frameSize); + FileInputStream query = new FileInputStream(testCase.getXQueryFile()); + if (opts.showQuery) { + System.err.println("***Query for " + testCase.getXQueryDisplayName() + ": "); + System.err.println(IOUtils.toString(query, "UTF-8")); + //query.reset(); + } + + VXQueryCompilationListener listener = new VXQueryCompilationListener(opts.showAST, opts.showTET, + opts.showOET, opts.showRP); + XMLQueryCompiler compiler = new XMLQueryCompiler(listener, new String[] { "nc1" }, opts.frameSize); Reader in = new InputStreamReader(new FileInputStream(testCase.getXQueryFile()), "UTF-8"); CompilerControlBlock ccb = new CompilerControlBlock(new StaticContextImpl( RootStaticContextImpl.INSTANCE), new ResultSetId(testCase.getXQueryDisplayName().hashCode()), @@ -167,6 +195,14 @@ public class TestRunner { long end = System.currentTimeMillis(); res.time = end - start; } + if (opts.showResult) { + System.err.println("***Result: "); + System.err.println(res.result); + if(res.result == null){ + System.err.println("***Error: "); + System.err.println(res.error); + } + } return res; } http://git-wip-us.apache.org/repos/asf/vxquery/blob/a041a329/vxquery-xtest/src/main/java/org/apache/vxquery/xtest/XTestOptions.java ---------------------------------------------------------------------- diff --git a/vxquery-xtest/src/main/java/org/apache/vxquery/xtest/XTestOptions.java b/vxquery-xtest/src/main/java/org/apache/vxquery/xtest/XTestOptions.java index 10dfa1c..e3da66f 100644 --- a/vxquery-xtest/src/main/java/org/apache/vxquery/xtest/XTestOptions.java +++ b/vxquery-xtest/src/main/java/org/apache/vxquery/xtest/XTestOptions.java @@ -55,4 +55,25 @@ public class XTestOptions { @Option(name = "-htmlreport", required = false, usage = "HTML Report output file") String htmlReport; + + @Option(name = "-showquery", usage = "Show query string") + boolean showQuery; + + @Option(name = "-showast", usage = "Show abstract syntax tree") + boolean showAST; + + @Option(name = "-showtet", usage = "Show translated expression tree") + boolean showTET; + + @Option(name = "-showoet", usage = "Show optimized expression tree") + boolean showOET; + + @Option(name = "-showrp", usage = "Show Runtime plan") + boolean showRP; + + @Option(name = "-compileonly", usage = "Compile the query and stop") + boolean compileOnly; + + @Option(name = "-showresult", usage = "shows query result") + boolean showResult; } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/vxquery/blob/a041a329/vxquery-xtest/src/test/resources/cat/GhcndRecordsPartition2Queries.xml ---------------------------------------------------------------------- diff --git a/vxquery-xtest/src/test/resources/cat/GhcndRecordsPartition2Queries.xml b/vxquery-xtest/src/test/resources/cat/GhcndRecordsPartition2Queries.xml index 17d6819..6a22cd2 100644 --- a/vxquery-xtest/src/test/resources/cat/GhcndRecordsPartition2Queries.xml +++ b/vxquery-xtest/src/test/resources/cat/GhcndRecordsPartition2Queries.xml @@ -29,6 +29,12 @@ <description>Count records returned for q03 from the weather benchmark with 2 partitions.</description> <query name="q03_records" date="2014-04-01"/> <output-file compare="Text">q03_records.txt</output-file> + <output-file compare="Text">q03_records-1.txt</output-file> + <output-file compare="Text">q03_records-2.txt</output-file> + <output-file compare="Text">q03_records-3.txt</output-file> + <output-file compare="Text">q03_records-4.txt</output-file> + <output-file compare="Text">q03_records-5.txt</output-file> + </test-case> <test-case name="ghcnd-records-partition-2-q05" FilePath="GhcndRecords/Partition-2/" Creator="Preston Carman"> <description>Count records returned for q05 from the weather benchmark with 2 partitions.</description> http://git-wip-us.apache.org/repos/asf/vxquery/blob/a041a329/vxquery-xtest/src/test/resources/cat/GhcndRecordsPartition4Queries.xml ---------------------------------------------------------------------- diff --git a/vxquery-xtest/src/test/resources/cat/GhcndRecordsPartition4Queries.xml b/vxquery-xtest/src/test/resources/cat/GhcndRecordsPartition4Queries.xml index 3789c51..70324fe 100644 --- a/vxquery-xtest/src/test/resources/cat/GhcndRecordsPartition4Queries.xml +++ b/vxquery-xtest/src/test/resources/cat/GhcndRecordsPartition4Queries.xml @@ -29,6 +29,12 @@ <description>Count records returned for q03 from the weather benchmark with 4 partitions.</description> <query name="q03_records" date="2014-04-01"/> <output-file compare="Text">q03_records.txt</output-file> + <output-file compare="Text">q03_records-1.txt</output-file> + <output-file compare="Text">q03_records-2.txt</output-file> + <output-file compare="Text">q03_records-3.txt</output-file> + <output-file compare="Text">q03_records-4.txt</output-file> + <output-file compare="Text">q03_records-5.txt</output-file> + </test-case> <test-case name="ghcnd-records-partition-4-q05" FilePath="GhcndRecords/Partition-4/" Creator="Preston Carman"> <description>Count records returned for q05 from the weather benchmark with 4 partitions.</description>
