├── .idea
├── .name
├── vcs.xml
├── .gitignore
├── jpa-buddy.xml
├── libraries
│ ├── BaseX104.xml
│ ├── xqj_api_1_0_sources.xml
│ └── xmldb_api_xmldb_api_1_7_1_7_0.xml
├── encodings.xml
├── inspectionProfiles
│ └── Project_Default.xml
├── compiler.xml
├── misc.xml
├── checkstyle-idea.xml
└── jarRepositories.xml
├── src
├── main
│ └── java
│ │ └── XPress
│ │ ├── DatatypeControl
│ │ ├── XMLAtomic.java
│ │ ├── XMLSimple.java
│ │ ├── XMLComparedResult.java
│ │ ├── PrimitiveDatatype
│ │ │ ├── XMLNumeric.java
│ │ │ ├── Datatype.java
│ │ │ ├── XMLMixed.java
│ │ │ ├── XMLSequence.java
│ │ │ ├── XMLQName.java
│ │ │ ├── XMLNode.java
│ │ │ ├── XMLBoolean.java
│ │ │ ├── XMLDuration.java
│ │ │ ├── XMLDouble.java
│ │ │ └── XMLString.java
│ │ ├── ValueHandler
│ │ │ ├── XMLQNameHandler.java
│ │ │ ├── XMLBooleanHandler.java
│ │ │ ├── XMLNodeHandler.java
│ │ │ ├── XMLSequenceHandler.java
│ │ │ ├── XMLMixedHandler.java
│ │ │ ├── XMLDurationHandler.java
│ │ │ ├── XMLDoubleHandler.java
│ │ │ ├── PooledValueHandler.java
│ │ │ └── XMLIntegerHandler.java
│ │ └── XMLDatatypeComplexRecorder.java
│ │ ├── XMLGeneration
│ │ ├── NameGenerator.java
│ │ ├── DataGenerator.java
│ │ ├── ContextTemplateGenerator.java
│ │ ├── AttributeTemplateGenerator.java
│ │ ├── AttributeNode.java
│ │ ├── ElementNode.java
│ │ ├── ContextTreeGenerator.java
│ │ ├── XMLContext.java
│ │ ├── BaseCharIDStyleNameGeneratorImpl.java
│ │ ├── AttributeTemplateGeneratorImpl.java
│ │ ├── ContextTemplateGeneratorImpl.java
│ │ └── XMLWriter.java
│ │ ├── TestException
│ │ ├── MismatchingResultException.java
│ │ ├── XPathVersion1Exception.java
│ │ ├── UnsupportedContextSetUpException.java
│ │ ├── DebugErrorException.java
│ │ └── UnexpectedExceptionThrownException.java
│ │ ├── Pair.java
│ │ ├── DatabaseExecutor
│ │ ├── Executor.java
│ │ ├── XPress_DatabaseExecutor_LibXML2ExecutorLow.h
│ │ ├── LibXML2ExecutorLow.java
│ │ └── LibXML2Executor.java
│ │ ├── DefaultListHashMap.java
│ │ ├── XPathGeneration
│ │ ├── LogicTree
│ │ │ ├── InformationTree
│ │ │ │ ├── InformationTreeFunctionNode
│ │ │ │ │ ├── FunctionV1.java
│ │ │ │ │ ├── FunctionV3.java
│ │ │ │ │ ├── OrFunctionNode.java
│ │ │ │ │ ├── AndFunctionNode.java
│ │ │ │ │ ├── InformationTreeSequenceFunctionNode
│ │ │ │ │ │ ├── ReverseFunctionNode.java
│ │ │ │ │ │ ├── InformationTreeSequenceAggregationFunctionNode
│ │ │ │ │ │ │ ├── SumFunctionNode.java
│ │ │ │ │ │ │ ├── InformationTreeSequenceAggregationFunctionNode.java
│ │ │ │ │ │ │ ├── InformationTreeSequenceNumericalAggregationFunctionNode.java
│ │ │ │ │ │ │ ├── AverageFunctionNode.java
│ │ │ │ │ │ │ ├── MinFunctionNode.java
│ │ │ │ │ │ │ ├── MaxFunctionNode.java
│ │ │ │ │ │ │ └── CountFunctionNode.java
│ │ │ │ │ │ ├── EmptyFunctionNode.java
│ │ │ │ │ │ ├── ExistsFunctionNode.java
│ │ │ │ │ │ ├── TailFunctionNode.java
│ │ │ │ │ │ ├── InformationTreeSequenceFunctionNode.java
│ │ │ │ │ │ ├── DistinctValuesFunctionNode.java
│ │ │ │ │ │ ├── SortFunctionNode.java
│ │ │ │ │ │ └── HeadFunctionNode.java
│ │ │ │ │ ├── NotFunctionNode.java
│ │ │ │ │ ├── UpperCaseFunctionNode.java
│ │ │ │ │ ├── DoubleAbsFunctionNode.java
│ │ │ │ │ ├── IntegerAbsFunctionNode.java
│ │ │ │ │ ├── DoubleRoundFunctionNode.java
│ │ │ │ │ ├── LowerCaseFunctionNode.java
│ │ │ │ │ ├── DoubleFloorFunctionNode.java
│ │ │ │ │ ├── DoubleCeilingFunctionNode.java
│ │ │ │ │ ├── NormalizeSpaceFunctionNode.java
│ │ │ │ │ ├── CosFunctionNode.java
│ │ │ │ │ ├── SinFunctionNode.java
│ │ │ │ │ ├── DoubleRoundHalfToEvenFunctionNode.java
│ │ │ │ │ ├── StringLengthFunctionNode.java
│ │ │ │ │ ├── HoursFromDurationFunctionNode.java
│ │ │ │ │ ├── PrefixFromQNameFunctionNode.java
│ │ │ │ │ ├── YearsFromDurationFunctionNode.java
│ │ │ │ │ ├── DaysFromDurationFunctionNode.java
│ │ │ │ │ ├── MonthsFromDurationFunctionNode.java
│ │ │ │ │ ├── MinutesFromDurationFunctionNode.java
│ │ │ │ │ ├── SecondsFromDurationFunctionNode.java
│ │ │ │ │ ├── NamespaceURIFromQNameFunctionNode.java
│ │ │ │ │ ├── NoActionFunctionNode.java
│ │ │ │ │ ├── TokenizeFunctionNode.java
│ │ │ │ │ ├── BinaryLogicOperatorFunctionNode.java
│ │ │ │ │ ├── BooleanFunctionNode.java
│ │ │ │ │ ├── InformationTreeDirectContentFunctionNode
│ │ │ │ │ │ ├── NameFunctionNode.java
│ │ │ │ │ │ ├── LocalNameFunctionNode.java
│ │ │ │ │ │ ├── NodeNameFunctionNode.java
│ │ │ │ │ │ ├── HasChildrenFunctionNode.java
│ │ │ │ │ │ ├── LastFunctionNode.java
│ │ │ │ │ │ ├── PositionFunctionNode.java
│ │ │ │ │ │ ├── InformationTreeDirectContentFunctionNode.java
│ │ │ │ │ │ └── TextFunctionNode.java
│ │ │ │ │ ├── BinaryOperatorFunctionNode.java
│ │ │ │ │ ├── ConcatFunctionNode.java
│ │ │ │ │ ├── IntegerModFunctionNode.java
│ │ │ │ │ ├── BinaryNumericalOperatorFunctionNode.java
│ │ │ │ │ ├── SubstringBeforeFunctionNode.java
│ │ │ │ │ ├── SubstringAfterFunctionNode.java
│ │ │ │ │ ├── ContainsTokenFunctionNode.java
│ │ │ │ │ ├── TranslateFunctionNode.java
│ │ │ │ │ ├── IntegerDivisionFunctionNode.java
│ │ │ │ │ ├── DoubleDivisionFunctionNode.java
│ │ │ │ │ ├── IntegerAddFunctionNode.java
│ │ │ │ │ ├── IntegerSubtractionFunctionNode.java
│ │ │ │ │ ├── IntegerMultiplicationFunctionNode.java
│ │ │ │ │ ├── DoubleSubtractFunctionNode.java
│ │ │ │ │ ├── DoubleAddFunctionNode.java
│ │ │ │ │ ├── InformationTreeComparisonOperatorNode
│ │ │ │ │ │ ├── LessOrEqualOperatorNode.java
│ │ │ │ │ │ ├── GreaterOrEqualOperatorNode.java
│ │ │ │ │ │ ├── LessThanOperatorNode.java
│ │ │ │ │ │ ├── GreaterThanOperatorNode.java
│ │ │ │ │ │ └── NotEqualOperatorNode.java
│ │ │ │ │ ├── ContainsFunctionNode.java
│ │ │ │ │ └── ReplaceFunctionNode.java
│ │ │ │ ├── InformationTreeContext.java
│ │ │ │ └── InformationTreeContextInfo.java
│ │ │ ├── LogicTreeContext.java
│ │ │ ├── LogicTreeOrComparisonNode.java
│ │ │ ├── LogicTreeAndComparisonNode.java
│ │ │ ├── LogicTreeContextInfo.java
│ │ │ └── LogicTreeComparisonNode.java
│ │ ├── XPathGenerator.java
│ │ └── XPathResultListPair.java
│ │ ├── ReportGeneration
│ │ └── KnownBugs.java
│ │ ├── CmdArgs
│ │ ├── XPathValidator.java
│ │ ├── NodeValidator.java
│ │ ├── SectionValidator.java
│ │ └── CmdArgs.java
│ │ ├── DataCheckUtils.java
│ │ ├── GlobalSettings.java
│ │ ├── StringUtils.java
│ │ └── CommonUtils.java
└── test
│ └── java
│ └── XPress
│ ├── CommonUtilsTest.java
│ ├── XMLGeneration
│ ├── XMLStructuredDocumentGeneratorTest.java
│ └── XMLDocumentGeneratorTest.java
│ ├── DatatypeControl
│ ├── XMLDatatypeTest.java
│ └── ValueHandler
│ │ ├── XMLIntegerHandlerTest.java
│ │ └── XMLStringHandlerTest.java
│ ├── XPathGeneration
│ ├── LogicTree
│ │ └── InformationTree
│ │ │ └── InformationTreeContextNodeTest.java
│ └── SequenceGeneratorTest.java
│ ├── GlobalRandomTest.java
│ └── XMLDatatypeIntegrationTest.java
├── scripts
├── del_images.sh
├── basex_version_setup.sh
├── settings.xml
├── evaluation_result.sh
├── run_evaluation.sh
├── write_config.sh
├── README.md
├── unique_check.py
├── evaluation_result2.py
├── evaluation_get2.sh
├── evaluation_get.sh
├── cal_avg.py
└── efficiency_plot.py
├── eXist
└── run_exist.sh
├── .gitignore
├── Dockerfile
└── docs
├── Axis Check.md
└── Found Bugs.md
/.idea/.name:
--------------------------------------------------------------------------------
1 | XTest
--------------------------------------------------------------------------------
/src/main/java/XPress/DatatypeControl/XMLAtomic.java:
--------------------------------------------------------------------------------
1 | package XPress.DatatypeControl;
2 |
3 | public interface XMLAtomic {
4 | }
5 |
--------------------------------------------------------------------------------
/src/main/java/XPress/DatatypeControl/XMLSimple.java:
--------------------------------------------------------------------------------
1 | package XPress.DatatypeControl;
2 |
3 | public interface XMLSimple {
4 | }
5 |
--------------------------------------------------------------------------------
/src/main/java/XPress/XMLGeneration/NameGenerator.java:
--------------------------------------------------------------------------------
1 | package XPress.XMLGeneration;
2 |
3 | public interface NameGenerator {
4 | String generateName();
5 | }
6 |
--------------------------------------------------------------------------------
/src/main/java/XPress/DatatypeControl/XMLComparedResult.java:
--------------------------------------------------------------------------------
1 | package XPress.DatatypeControl;
2 |
3 | public enum XMLComparedResult {
4 | LESS, EQUAL, GREATER
5 | }
6 |
--------------------------------------------------------------------------------
/src/main/java/XPress/TestException/MismatchingResultException.java:
--------------------------------------------------------------------------------
1 | package XPress.TestException;
2 |
3 | public class MismatchingResultException extends Exception {
4 | }
5 |
--------------------------------------------------------------------------------
/src/main/java/XPress/TestException/XPathVersion1Exception.java:
--------------------------------------------------------------------------------
1 | package XPress.TestException;
2 |
3 | public class XPathVersion1Exception extends RuntimeException {
4 | }
5 |
--------------------------------------------------------------------------------
/scripts/del_images.sh:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 | configs=("p_r" "p_nr" "s_nr" "s_r")
3 |
4 | for config in ${configs[@]};
5 | do
6 | docker rmi ${config}
7 | docker rmi ${config}_2 .
8 | done
--------------------------------------------------------------------------------
/src/main/java/XPress/TestException/UnsupportedContextSetUpException.java:
--------------------------------------------------------------------------------
1 | package XPress.TestException;
2 |
3 | public class UnsupportedContextSetUpException extends Exception {
4 | }
5 |
--------------------------------------------------------------------------------
/src/main/java/XPress/DatatypeControl/PrimitiveDatatype/XMLNumeric.java:
--------------------------------------------------------------------------------
1 | package XPress.DatatypeControl.PrimitiveDatatype;
2 |
3 | @Datatype
4 | public abstract class XMLNumeric extends XMLDatatype {
5 | }
6 |
--------------------------------------------------------------------------------
/.idea/vcs.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/src/main/java/XPress/Pair.java:
--------------------------------------------------------------------------------
1 | package XPress;
2 |
3 | public class Pair {
4 | public int x, y;
5 | public Pair(int x, int y) {
6 | this.x = x;
7 | this.y = y;
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/src/main/java/XPress/XMLGeneration/DataGenerator.java:
--------------------------------------------------------------------------------
1 | package XPress.XMLGeneration;
2 |
3 | public class DataGenerator {
4 | public static double newProb = 1.0;
5 | public static double mutateProb = 0;
6 | }
7 |
--------------------------------------------------------------------------------
/.idea/.gitignore:
--------------------------------------------------------------------------------
1 | # Default ignored files
2 | /shelf/
3 | /workspace.xml
4 | # Editor-based HTTP Client requests
5 | /httpRequests/
6 | # Datasource local storage ignored files
7 | /dataSources/
8 | /dataSources.local.xml
9 |
--------------------------------------------------------------------------------
/.idea/jpa-buddy.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/src/main/java/XPress/DatabaseExecutor/Executor.java:
--------------------------------------------------------------------------------
1 | package XPress.DatabaseExecutor;
2 |
3 | import java.lang.annotation.*;
4 |
5 | @Retention(RetentionPolicy.RUNTIME)
6 | @Target(ElementType.TYPE)
7 | public @interface Executor {
8 | }
9 |
--------------------------------------------------------------------------------
/src/main/java/XPress/XMLGeneration/ContextTemplateGenerator.java:
--------------------------------------------------------------------------------
1 | package XPress.XMLGeneration;
2 |
3 | import java.util.List;
4 |
5 | public interface ContextTemplateGenerator {
6 |
7 | List generateContextTemplate(int templateSize);
8 | }
9 |
--------------------------------------------------------------------------------
/src/main/java/XPress/XMLGeneration/AttributeTemplateGenerator.java:
--------------------------------------------------------------------------------
1 | package XPress.XMLGeneration;
2 |
3 | import java.util.List;
4 |
5 | public interface AttributeTemplateGenerator {
6 | List generateAttributeTemplate(int templateSize);
7 | }
8 |
--------------------------------------------------------------------------------
/src/main/java/XPress/XMLGeneration/AttributeNode.java:
--------------------------------------------------------------------------------
1 | package XPress.XMLGeneration;
2 |
3 | public class AttributeNode extends ElementNode {
4 | AttributeNode() {}
5 | AttributeNode(AttributeNode attributeNode) {
6 | super(attributeNode);
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/.idea/libraries/BaseX104.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/eXist/run_exist.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | if [ "$1" -eq "1" ]; then
4 | cp ExistExecutor.java ../src/main/java/XPress/DatabaseExecutor
5 | cp pom_exist.xml ../pom.xml
6 | else
7 | rm -f ../src/main/java/XPress/DatabaseExecutor/ExistExecutor.java
8 | cp pom.xml ../pom.xml
9 | fi
10 |
--------------------------------------------------------------------------------
/.idea/encodings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/.idea/libraries/xqj_api_1_0_sources.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/.idea/libraries/xmldb_api_xmldb_api_1_7_1_7_0.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/src/main/java/XPress/TestException/DebugErrorException.java:
--------------------------------------------------------------------------------
1 | package XPress.TestException;
2 |
3 | public class DebugErrorException extends Exception {
4 | String debugErrorMessage;
5 |
6 | public DebugErrorException(){}
7 |
8 | public DebugErrorException(String debugErrorMessage) {
9 | this.debugErrorMessage = debugErrorMessage;
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/src/main/java/XPress/DatatypeControl/ValueHandler/XMLQNameHandler.java:
--------------------------------------------------------------------------------
1 | package XPress.DatatypeControl.ValueHandler;
2 |
3 | public class XMLQNameHandler extends ValueHandler {
4 | @Override
5 | public String getValue() {
6 | return "foo";
7 | }
8 |
9 | @Override
10 | public String mutateValue(String baseString) {
11 | return "foo";
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/scripts/basex_version_setup.sh:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 | current=`pwd`
3 | cd $1;
4 | git stash
5 | echo git checkout $2
6 | git checkout $2
7 | echo mvn compile
8 | mvn compile
9 | echo nohup java org.basex.BaseXServer -P pass &
10 | cd $1/basex-core/target/classes
11 | nohup java org.basex.BaseXServer -P pass &
12 | server_PID=$!
13 | echo $server_PID
14 | cd $current
15 | echo $server_PID > server_PID.txt
--------------------------------------------------------------------------------
/src/main/java/XPress/DatatypeControl/PrimitiveDatatype/Datatype.java:
--------------------------------------------------------------------------------
1 | package XPress.DatatypeControl.PrimitiveDatatype;
2 |
3 | import java.lang.annotation.ElementType;
4 | import java.lang.annotation.Retention;
5 | import java.lang.annotation.RetentionPolicy;
6 | import java.lang.annotation.Target;
7 |
8 | @Retention(RetentionPolicy.RUNTIME)
9 | @Target(ElementType.TYPE)
10 | public @interface Datatype {
11 | }
12 |
--------------------------------------------------------------------------------
/src/main/java/XPress/DefaultListHashMap.java:
--------------------------------------------------------------------------------
1 | package XPress;
2 |
3 | import java.util.ArrayList;
4 | import java.util.HashMap;
5 | import java.util.List;
6 |
7 | public class DefaultListHashMap extends HashMap> {
8 | @Override
9 | public List get(Object k) {
10 | if(!containsKey(k))
11 | this.put((K) k, new ArrayList<>());
12 | return super.get(k);
13 | }
14 | }
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Compiled class file
2 | *.class
3 |
4 | # Log file
5 | *.log
6 |
7 | # BlueJ files
8 | *.ctxt
9 |
10 | # Mobile Tools for Java (J2ME)
11 | .mtj.tmp/
12 |
13 | # Package Files #
14 | *.jar
15 | *.war
16 | *.nar
17 | *.ear
18 | *.zip
19 | *.tar.gz
20 | *.rar
21 |
22 | src/docs/
23 | target
24 |
25 | # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
26 | hs_err_pid*
27 |
--------------------------------------------------------------------------------
/Dockerfile:
--------------------------------------------------------------------------------
1 | #
2 | # Build stage
3 | #
4 | FROM maven:3.8.3-openjdk-17 AS build
5 | WORKDIR /experiment
6 | COPY . ./XPress
7 | RUN git clone https://github.com/BaseXdb/basex.git /basex
8 | RUN mvn --global-settings ./XPress/scripts/settings.xml -f ./XPress/pom.xml install -DskipTests
9 | RUN chmod +x ./XPress/scripts/run_evaluation.sh
10 | EXPOSE 9000
11 | WORKDIR '/experiment/XPress'
12 | ENTRYPOINT ["./scripts/run_evaluation.sh"]
--------------------------------------------------------------------------------
/.idea/inspectionProfiles/Project_Default.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/src/main/java/XPress/XPathGeneration/LogicTree/InformationTree/InformationTreeFunctionNode/FunctionV1.java:
--------------------------------------------------------------------------------
1 | package XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode;
2 |
3 | import java.lang.annotation.Retention;
4 | import java.lang.annotation.RetentionPolicy;
5 | import java.lang.annotation.Target;
6 | import java.lang.annotation.ElementType;
7 |
8 | @Retention(RetentionPolicy.RUNTIME)
9 | @Target(ElementType.TYPE)
10 | public @interface FunctionV1 {
11 | }
--------------------------------------------------------------------------------
/src/main/java/XPress/XPathGeneration/LogicTree/InformationTree/InformationTreeFunctionNode/FunctionV3.java:
--------------------------------------------------------------------------------
1 | package XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode;
2 |
3 | import java.lang.annotation.Retention;
4 | import java.lang.annotation.RetentionPolicy;
5 | import java.lang.annotation.Target;
6 | import java.lang.annotation.ElementType;
7 |
8 | @Retention(RetentionPolicy.RUNTIME)
9 | @Target(ElementType.TYPE)
10 | public @interface FunctionV3 {
11 | }
--------------------------------------------------------------------------------
/src/test/java/XPress/CommonUtilsTest.java:
--------------------------------------------------------------------------------
1 | package XPress;
2 |
3 | import org.junit.jupiter.api.Test;
4 |
5 | public class CommonUtilsTest {
6 | @Test
7 | void getEnclosedIntegerTest() {
8 | String testString = "hello, id=\"13213\"";
9 | for(int i = 0; i < testString.length(); i ++) {
10 | System.out.println(i + " " + testString.charAt(i));
11 | }
12 | System.out.println(CommonUtils.getEnclosedInteger(testString, 11));
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/src/main/java/XPress/XPathGeneration/LogicTree/InformationTree/InformationTreeFunctionNode/OrFunctionNode.java:
--------------------------------------------------------------------------------
1 | package XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode;
2 |
3 | @FunctionV1
4 | public class OrFunctionNode extends BinaryLogicOperatorFunctionNode {
5 | public OrFunctionNode() {
6 | functionExpr = "or";
7 | }
8 |
9 | @Override
10 | public OrFunctionNode newInstance() {
11 | return new OrFunctionNode();
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/src/main/java/XPress/XPathGeneration/LogicTree/InformationTree/InformationTreeFunctionNode/AndFunctionNode.java:
--------------------------------------------------------------------------------
1 | package XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode;
2 |
3 | @FunctionV1
4 | public class AndFunctionNode extends BinaryLogicOperatorFunctionNode {
5 | public AndFunctionNode() {
6 | functionExpr = "and";
7 | }
8 |
9 | @Override
10 | public AndFunctionNode newInstance() {
11 | return new AndFunctionNode();
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/src/main/java/XPress/ReportGeneration/KnownBugs.java:
--------------------------------------------------------------------------------
1 | package XPress.ReportGeneration;
2 |
3 | public class KnownBugs {
4 | static public boolean exist = false;
5 | static public boolean exist4810 = true;
6 | static public boolean exist4811 = true;
7 | static public boolean exist4824 = true;
8 | static public boolean exist4830 = true;
9 |
10 | static public boolean basex2193 = false;
11 | static public boolean basex2213 = false;
12 |
13 | private KnownBugs(){}
14 | }
15 |
--------------------------------------------------------------------------------
/src/test/java/XPress/XMLGeneration/XMLStructuredDocumentGeneratorTest.java:
--------------------------------------------------------------------------------
1 | package XPress.XMLGeneration;
2 |
3 | import org.junit.jupiter.api.Test;
4 |
5 | public class XMLStructuredDocumentGeneratorTest {
6 | @Test
7 | void XMLDocumentGenerationWithStructureTest() {
8 | XMLDocumentGenerator xmlDocumentGenerator = new XMLStructuredDocumentGenerator();
9 | String xml = xmlDocumentGenerator.getXMLDocumentWithStructure(20);
10 | System.out.println(xml);
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/src/test/java/XPress/DatatypeControl/XMLDatatypeTest.java:
--------------------------------------------------------------------------------
1 | package XPress.DatatypeControl;
2 |
3 | import XPress.DatatypeControl.PrimitiveDatatype.XMLDatatype;
4 | import org.junit.jupiter.api.Test;
5 | import static org.junit.jupiter.api.Assertions.assertNotNull;
6 |
7 | public class XMLDatatypeTest {
8 | @Test
9 | void getRandomDataTypeTest() {
10 | for(int i = 0; i < 5; i ++) {
11 | XMLDatatype xmlDatatype = XMLDatatype.getRandomDataType();
12 | assertNotNull(xmlDatatype);
13 | }
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/src/main/java/XPress/DatatypeControl/PrimitiveDatatype/XMLMixed.java:
--------------------------------------------------------------------------------
1 | package XPress.DatatypeControl.PrimitiveDatatype;
2 |
3 | import XPress.DatatypeControl.ValueHandler.XMLMixedHandler;
4 |
5 | @Datatype
6 | public class XMLMixed extends XMLDatatype {
7 | static XMLMixed instance;
8 |
9 | XMLMixed() {
10 | valueHandler = new XMLMixedHandler();
11 | }
12 |
13 | static public XMLMixed getInstance() {
14 | if(instance == null) {
15 | instance = new XMLMixed();
16 | }
17 | return instance;
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/src/main/java/XPress/CmdArgs/XPathValidator.java:
--------------------------------------------------------------------------------
1 | package XPress.CmdArgs;
2 |
3 | import com.beust.jcommander.IParameterValidator;
4 | import com.beust.jcommander.ParameterException;
5 |
6 | public class XPathValidator implements IParameterValidator {
7 | public void validate(String name, String value)
8 | throws ParameterException {
9 | int n = Integer.parseInt(value);
10 | if (n <= 0) {
11 | throw new ParameterException("Parameter " + name + " should be greater than 0 (found " + value +")");
12 | }
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/scripts/settings.xml:
--------------------------------------------------------------------------------
1 |
3 |
4 |
5 | maven-default-http-blocker
6 | dummy
7 | Dummy mirror to override default blocking mirror that blocks http
8 | http://0.0.0.0/
9 |
10 |
11 |
--------------------------------------------------------------------------------
/.idea/compiler.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/src/main/java/XPress/TestException/UnexpectedExceptionThrownException.java:
--------------------------------------------------------------------------------
1 | package XPress.TestException;
2 |
3 | public class UnexpectedExceptionThrownException extends Exception{
4 | public Exception originalException;
5 | public String info;
6 | public UnexpectedExceptionThrownException(Exception originalException) {
7 | this.originalException = originalException;
8 | }
9 |
10 | public UnexpectedExceptionThrownException(Exception originalException, String info) {
11 | this.originalException = originalException;
12 | this.info = info;
13 | }
14 | }
--------------------------------------------------------------------------------
/src/test/java/XPress/DatatypeControl/ValueHandler/XMLIntegerHandlerTest.java:
--------------------------------------------------------------------------------
1 | package XPress.DatatypeControl.ValueHandler;
2 |
3 |
4 | import XPress.DatatypeControl.PrimitiveDatatype.XMLInteger;
5 | import org.junit.jupiter.api.Test;
6 | import static org.junit.jupiter.api.Assertions.assertEquals;
7 |
8 | public class XMLIntegerHandlerTest {
9 |
10 | @Test
11 | public void parseIntTest() {
12 | Integer num1 = XMLInteger.parseInt("-7.9091506E7");
13 | assertEquals(-79091506, num1);
14 | Integer num2 = XMLInteger.parseInt("89.991E5");
15 | assertEquals(8999100, num2);
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/scripts/evaluation_result.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | export RESULT_DIR=$1
3 | export ROUND=$2
4 | export COVER=$3
5 |
6 | configs=("p_r" "p_nr" "s_nr" "s_r")
7 | generators=("XPress")
8 |
9 |
10 | for i in $(eval echo {1..$2} );
11 | do
12 | for generator in ${generators[@]};
13 | do
14 | for config in ${configs[@]};
15 | do
16 | python3 unique_check.py $RESULT_DIR $config $generator $i $COVER
17 | done
18 | done
19 | done
20 | for i in $(eval echo {1..$2} );
21 | do
22 | python3 unique_count.py $RESULT_DIR $i
23 | done
24 | python3 cal_avg.py $RESULT_DIR $ROUND
25 | python3 efficiency_plot.py
26 |
--------------------------------------------------------------------------------
/src/main/java/XPress/DatatypeControl/ValueHandler/XMLBooleanHandler.java:
--------------------------------------------------------------------------------
1 | package XPress.DatatypeControl.ValueHandler;
2 |
3 | import XPress.GlobalRandom;
4 |
5 | public class XMLBooleanHandler extends ValueHandler {
6 |
7 | @Override
8 | public String getValue() {
9 | double prob1 = GlobalRandom.getInstance().nextDouble();
10 | String value;
11 | if(prob1 < 0.5)
12 | value = "true";
13 | else
14 | value = "false";
15 | return value;
16 | }
17 |
18 | @Override
19 | public String mutateValue(String baseString) {
20 | return getValue();
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/src/main/java/XPress/DatatypeControl/PrimitiveDatatype/XMLSequence.java:
--------------------------------------------------------------------------------
1 | package XPress.DatatypeControl.PrimitiveDatatype;
2 |
3 | import XPress.DatatypeControl.ValueHandler.XMLMixedHandler;
4 | import XPress.DatatypeControl.ValueHandler.XMLSequenceHandler;
5 |
6 | @Datatype
7 | public class XMLSequence extends XMLDatatype {
8 | static XMLSequence instance;
9 |
10 | XMLSequence() {
11 | valueHandler = new XMLSequenceHandler();
12 | }
13 |
14 | static public XMLSequence getInstance() {
15 | if(instance == null) {
16 | instance = new XMLSequence();
17 | }
18 | return instance;
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/src/test/java/XPress/XPathGeneration/LogicTree/InformationTree/InformationTreeContextNodeTest.java:
--------------------------------------------------------------------------------
1 | package XPress.XPathGeneration.LogicTree.InformationTree;
2 |
3 | import XPress.DatatypeControl.PrimitiveDatatype.XMLSequence;
4 | import org.junit.jupiter.api.Test;
5 |
6 | public class InformationTreeContextNodeTest {
7 |
8 | @Test
9 | void setXMLDataComplexRecorderIntegrateTest() {
10 | InformationTreeContextNode contextNode = new InformationTreeContextNode();
11 | contextNode.datatypeRecorder.setData(XMLSequence.getInstance(), null, false);
12 | System.out.println(contextNode.datatypeRecorder.xmlDatatype);
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/src/main/java/XPress/XPathGeneration/LogicTree/LogicTreeContext.java:
--------------------------------------------------------------------------------
1 | package XPress.XPathGeneration.LogicTree;
2 |
3 | public class LogicTreeContext {
4 | /**
5 | * If is calculable, contains the real value of evaluated context for the starred node
6 | * For a sequence, context contains the length of the sequence
7 | * For a node, context refers to the id number of the node
8 | */
9 | public String context = null;
10 |
11 |
12 | public void setContext(LogicTreeContext context) {
13 | this.context = context.context;
14 | }
15 |
16 | public void setContext(String context) {
17 | this.context = context;
18 | }
19 |
20 | }
21 |
--------------------------------------------------------------------------------
/.idea/misc.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/src/main/java/XPress/XMLGeneration/ElementNode.java:
--------------------------------------------------------------------------------
1 | package XPress.XMLGeneration;
2 |
3 | import XPress.DatatypeControl.PrimitiveDatatype.XMLDatatype;
4 |
5 | public class ElementNode {
6 | public String tagName;
7 | public ContextNode parentNode;
8 | public XMLDatatype dataType;
9 | public String dataContext;
10 |
11 | ElementNode() {}
12 | ElementNode(ElementNode elementNode) {
13 | this.tagName = elementNode.tagName;
14 | this.dataType = elementNode.dataType;
15 | this.dataContext = elementNode.dataContext;
16 | }
17 |
18 | void assignRandomValue() {
19 | dataContext = dataType.getValueHandler().getValue();
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/src/main/java/XPress/XPathGeneration/LogicTree/InformationTree/InformationTreeFunctionNode/InformationTreeSequenceFunctionNode/ReverseFunctionNode.java:
--------------------------------------------------------------------------------
1 | package XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode.InformationTreeSequenceFunctionNode;
2 |
3 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode.FunctionV3;
4 |
5 | @FunctionV3
6 | public class ReverseFunctionNode extends InformationTreeSequenceFunctionNode {
7 | public ReverseFunctionNode() {
8 | functionExpr = "reverse";
9 | }
10 | @Override
11 | public ReverseFunctionNode newInstance() {
12 | return new ReverseFunctionNode();
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/src/main/java/XPress/CmdArgs/NodeValidator.java:
--------------------------------------------------------------------------------
1 | package XPress.CmdArgs;
2 |
3 | import com.beust.jcommander.IParameterValidator;
4 | import com.beust.jcommander.ParameterException;
5 |
6 | public class NodeValidator implements IParameterValidator {
7 | public void validate(String name, String value)
8 | throws ParameterException {
9 | int n = Integer.parseInt(value);
10 | if (n <= 0) {
11 | throw new ParameterException("Parameter " + name + " should be greater than 0 (found " + value +")");
12 | }
13 | if (n > 100) {
14 | throw new ParameterException("Parameter " + name + " should be smaller than 100 (found " + value +")");
15 | }
16 | }
17 | }
18 |
19 |
--------------------------------------------------------------------------------
/src/main/java/XPress/CmdArgs/SectionValidator.java:
--------------------------------------------------------------------------------
1 | package XPress.CmdArgs;
2 |
3 | import com.beust.jcommander.IParameterValidator;
4 | import com.beust.jcommander.ParameterException;
5 |
6 | public class SectionValidator implements IParameterValidator {
7 | public void validate(String name, String value)
8 | throws ParameterException {
9 | int n = Integer.parseInt(value);
10 | if (n <= 0) {
11 | throw new ParameterException("Parameter " + name + " should be greater than 0 (found " + value +")");
12 | }
13 | if (n > 10) {
14 | throw new ParameterException("Parameter " + name + " should be smaller than 10 (found " + value +")");
15 | }
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/src/main/java/XPress/DatatypeControl/PrimitiveDatatype/XMLQName.java:
--------------------------------------------------------------------------------
1 | package XPress.DatatypeControl.PrimitiveDatatype;
2 |
3 | import XPress.DatatypeControl.ValueHandler.XMLStringHandler;
4 | import XPress.DatatypeControl.XMLComparable;
5 | import XPress.DatatypeControl.XMLSimple;
6 |
7 | @Datatype
8 | public class XMLQName extends XMLDatatype implements XMLSimple {
9 | static XMLQName instance;
10 |
11 | public XMLQName() {
12 | valueHandler = new XMLStringHandler();
13 | officialTypeName = "xs:QName";
14 | }
15 |
16 | static public XMLQName getInstance() {
17 | if(instance == null) {
18 | instance = new XMLQName();
19 | }
20 | return instance;
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/src/main/java/XPress/DatatypeControl/PrimitiveDatatype/XMLNode.java:
--------------------------------------------------------------------------------
1 | package XPress.DatatypeControl.PrimitiveDatatype;
2 |
3 | import XPress.DatatypeControl.ValueHandler.XMLNodeHandler;
4 | import XPress.DatatypeControl.XMLSimple;
5 |
6 | @Datatype
7 | public class XMLNode extends XMLDatatype implements XMLSimple {
8 | static XMLNode instance;
9 |
10 | XMLNode() {
11 | valueHandler = new XMLNodeHandler();
12 | // Just to avoid null, maybe it is not an official name...
13 | officialTypeName = "xs:node";
14 | }
15 |
16 | static public XMLNode getInstance() {
17 | if(instance == null) {
18 | instance = new XMLNode();
19 | }
20 | return instance;
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/src/main/java/XPress/DatatypeControl/PrimitiveDatatype/XMLBoolean.java:
--------------------------------------------------------------------------------
1 | package XPress.DatatypeControl.PrimitiveDatatype;
2 |
3 | import XPress.DatatypeControl.XMLAtomic;
4 | import XPress.DatatypeControl.ValueHandler.XMLBooleanHandler;
5 | import XPress.DatatypeControl.XMLSimple;
6 |
7 | @Datatype
8 | public class XMLBoolean extends XMLDatatype implements XMLSimple, XMLAtomic {
9 | static XMLBoolean instance;
10 | XMLBoolean() {
11 | valueHandler = new XMLBooleanHandler();
12 | officialTypeName = "xs:boolean";
13 | }
14 |
15 | static public XMLBoolean getInstance() {
16 | if(instance == null) {
17 | instance = new XMLBoolean();
18 | }
19 | return instance;
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/src/main/java/XPress/DatatypeControl/ValueHandler/XMLNodeHandler.java:
--------------------------------------------------------------------------------
1 | package XPress.DatatypeControl.ValueHandler;
2 |
3 | import XPress.DatatypeControl.XMLSimple;
4 |
5 | public class XMLNodeHandler extends ValueHandler implements XMLSimple {
6 |
7 | @Override
8 | public String getValue() {
9 | return "2";
10 | // double prob = GlobalRandom.getInstance().nextDouble();
11 | // if(prob < 0.3)
12 | // return "2";
13 | // if(prob < 0.8)
14 | // return "//[@id=\"" + (GlobalRandom.getInstance().nextInt(50) + 1) + "\"]";
15 | // return "()";
16 | }
17 |
18 | @Override
19 | public String mutateValue(String baseString) {
20 | return null;
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/src/main/java/XPress/DatatypeControl/PrimitiveDatatype/XMLDuration.java:
--------------------------------------------------------------------------------
1 | package XPress.DatatypeControl.PrimitiveDatatype;
2 |
3 | import XPress.DatatypeControl.XMLAtomic;
4 | import XPress.DatatypeControl.ValueHandler.XMLDurationHandler;
5 | import XPress.DatatypeControl.XMLSimple;
6 |
7 | @Datatype
8 | public class XMLDuration extends XMLDatatype implements XMLSimple, XMLAtomic {
9 | static XMLDuration instance;
10 |
11 | XMLDuration() {
12 | valueHandler = new XMLDurationHandler();
13 | officialTypeName = "xs:duration";
14 | }
15 |
16 | static public XMLDuration getInstance() {
17 | if(instance == null) {
18 | instance = new XMLDuration();
19 | }
20 | return instance;
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/src/main/java/XPress/DatabaseExecutor/XPress_DatabaseExecutor_LibXML2ExecutorLow.h:
--------------------------------------------------------------------------------
1 | /* DO NOT EDIT THIS FILE - it is machine generated */
2 | #include
3 | /* Header for class XPress_DatabaseExecutor_LibXML2ExecutorLow */
4 |
5 | #ifndef _Included_XPress_DatabaseExecutor_LibXML2ExecutorLow
6 | #define _Included_XPress_DatabaseExecutor_LibXML2ExecutorLow
7 | #ifdef __cplusplus
8 | extern "C" {
9 | #endif
10 | /*
11 | * Class: XPress_DatabaseExecutor_LibXML2ExecutorLow
12 | * Method: execute
13 | * Signature: (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
14 | */
15 | JNIEXPORT jstring JNICALL Java_XPress_DatabaseExecutor_LibXML2ExecutorLow_execute
16 | (JNIEnv *, jobject, jstring, jstring);
17 |
18 | #ifdef __cplusplus
19 | }
20 | #endif
21 | #endif
22 |
--------------------------------------------------------------------------------
/.idea/checkstyle-idea.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | 10.5.0
5 | JavaOnly
6 | true
7 |
8 |
9 |
10 |
11 | (bundled)
12 | (bundled)
13 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/src/main/java/XPress/DatabaseExecutor/LibXML2ExecutorLow.java:
--------------------------------------------------------------------------------
1 | package XPress.DatabaseExecutor;
2 |
3 | public class LibXML2ExecutorLow {
4 | public static String XMLDocumentPath = "C:\\app\\log\\autotest.xml";
5 | public static String XPath = "//*/preceding::*[(position() <= 2)]";
6 |
7 |
8 | static {
9 | System.loadLibrary("LibXML2ExecutorXPress");
10 | }
11 |
12 | public native String execute(String XMLDocumentPath, String XPath);
13 |
14 | public static void main(String[] args) {
15 | LibXML2ExecutorLow lib2XMLExecutorLow = new LibXML2ExecutorLow();
16 | System.out.println(XMLDocumentPath);
17 | String result = lib2XMLExecutorLow.execute(XMLDocumentPath, XPath);
18 | System.out.println("Result is: " + result);
19 | }
20 | }
--------------------------------------------------------------------------------
/src/main/java/XPress/XPathGeneration/LogicTree/InformationTree/InformationTreeFunctionNode/InformationTreeSequenceFunctionNode/InformationTreeSequenceAggregationFunctionNode/SumFunctionNode.java:
--------------------------------------------------------------------------------
1 | package XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode.InformationTreeSequenceFunctionNode.InformationTreeSequenceAggregationFunctionNode;
2 |
3 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode.FunctionV3;
4 |
5 | @FunctionV3
6 | public class SumFunctionNode extends InformationTreeSequenceNumericalAggregationFunctionNode {
7 | public SumFunctionNode() {
8 | functionExpr = "sum";
9 | }
10 |
11 | @Override
12 | public SumFunctionNode newInstance() {
13 | return new SumFunctionNode();
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/src/main/java/XPress/DataCheckUtils.java:
--------------------------------------------------------------------------------
1 | package XPress;
2 |
3 | public class DataCheckUtils {
4 | public static boolean integerAdditionCheck(Integer num1, Integer num2) {
5 | if(num1 >= 0 && num2 <= 0) return true;
6 | if(num1 <= 0 && num2 >= 0) return true;
7 | if(num1 >= 0) {
8 | return num1 <= (Integer.MAX_VALUE - num2);
9 | }
10 | else return num1 >= Integer.MIN_VALUE - num2;
11 | }
12 |
13 | public static boolean integerSubtractionCheck(Integer num1, Integer num2) {
14 | if(num1 >= 0 && num2 >= 0) return true;
15 | if(num1 <= 0 && num2 <= 0) return true;
16 | if(num1 >= 0) {
17 | return num1 <= Integer.MAX_VALUE + num2;
18 | }
19 | else return num1 >= Integer.MIN_VALUE + num2;
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/src/main/java/XPress/XMLGeneration/ContextTreeGenerator.java:
--------------------------------------------------------------------------------
1 | package XPress.XMLGeneration;
2 |
3 | import java.util.List;
4 |
5 | public interface ContextTreeGenerator {
6 | ContextNode generateRandomTree(int contextTreeSize, List namespaceList);
7 |
8 | public static void markPrecedingFollowing(ContextNode currentNode, MarkChoice currentMarking) {
9 | if(currentMarking == MarkChoice.PRECEDING)
10 | currentNode.hasPreceding = false;
11 | else
12 | currentNode.hasFollowing = false;
13 | if(currentNode.childList.size() != 0) {
14 | int id = (currentMarking == MarkChoice.PRECEDING) ? 0 : (currentNode.childList.size() - 1);
15 | markPrecedingFollowing(currentNode.childList.get(id), currentMarking);
16 | }
17 | }
18 |
19 | public enum MarkChoice {PRECEDING, FOLLOWING}
20 | }
21 |
--------------------------------------------------------------------------------
/src/main/java/XPress/XPathGeneration/LogicTree/InformationTree/InformationTreeFunctionNode/InformationTreeSequenceFunctionNode/InformationTreeSequenceAggregationFunctionNode/InformationTreeSequenceAggregationFunctionNode.java:
--------------------------------------------------------------------------------
1 | package XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode.InformationTreeSequenceFunctionNode.InformationTreeSequenceAggregationFunctionNode;
2 |
3 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode.InformationTreeSequenceFunctionNode.InformationTreeSequenceFunctionNode;
4 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeNode;
5 |
6 | public abstract class InformationTreeSequenceAggregationFunctionNode extends InformationTreeSequenceFunctionNode {
7 |
8 | @Override
9 | protected void fillContentParametersRandom(InformationTreeNode childNode) {
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/src/main/java/XPress/GlobalSettings.java:
--------------------------------------------------------------------------------
1 | package XPress;
2 |
3 | public class GlobalSettings {
4 | static GlobalSettings globalSettings;
5 |
6 | public enum XPathVersion {
7 | VERSION_1,
8 | VERSION_3
9 | }
10 |
11 | public static XPathVersion xPathVersion = XPathVersion.VERSION_3;
12 |
13 | public static Boolean useNamespace = true;
14 |
15 | public static String defaultDBName = "Saxon";
16 | public static Boolean debugOutput = false;
17 |
18 | public static Boolean starNodeSelection = false;
19 | public static Boolean targetedSectionPrefix = true;
20 | public static Boolean rectifySelection = true;
21 |
22 | private GlobalSettings(){};
23 |
24 | public GlobalSettings getInstance() {
25 | if(globalSettings == null) globalSettings = new GlobalSettings();
26 | return globalSettings;
27 | }
28 |
29 | }
--------------------------------------------------------------------------------
/src/main/java/XPress/XPathGeneration/XPathGenerator.java:
--------------------------------------------------------------------------------
1 | package XPress.XPathGeneration;
2 |
3 | import XPress.TestException.DebugErrorException;
4 | import XPress.TestException.MismatchingResultException;
5 | import XPress.TestException.UnexpectedExceptionThrownException;
6 | import org.apache.commons.lang3.tuple.Pair;
7 |
8 | import java.io.IOException;
9 | import java.sql.SQLException;
10 | import java.util.List;
11 |
12 | public interface XPathGenerator {
13 | public Pair>, String> getXPathSectionDivided (int depth)
14 | throws SQLException, IOException, UnexpectedExceptionThrownException, DebugErrorException;
15 | public String getXPath(int depth)
16 | throws SQLException, MismatchingResultException, IOException, InstantiationException, IllegalAccessException, UnexpectedExceptionThrownException, DebugErrorException;
17 | }
18 |
--------------------------------------------------------------------------------
/scripts/run_evaluation.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | exec 2>&1 3>&1 >/experiment/log.out
4 | cd ./scripts
5 | chmod +x basex_version_setup.sh
6 | chmod +x write_config.sh
7 | echo ./write_config.sh /experiment $CONFIG $EVAL_TYPE $TIME $GEN
8 | ./write_config.sh /experiment $CONFIG $EVAL_TYPE $TIME $GEN
9 |
10 | if [ $EVAL_TYPE = "1" ]; then
11 | basex_commit=d1bb20b
12 | else
13 | basex_commit=3efb304
14 | fi
15 | echo ./basex_version_setup.sh /basex $basex_commit
16 | ./basex_version_setup.sh /basex $basex_commit
17 | sleep 2
18 | server_PID=`cat ../../server_PID.txt`
19 | echo `cat /experiment/evaluation_config.txt`
20 | echo "cd .." "&&" mvn -e --global-settings ./scripts/settings.xml test -Dtest=EvaluationTest#evaluationTest$EVAL_TYPE test
21 | (cd .. && mvn -e --global-settings ./scripts/settings.xml test -Dtest=EvaluationTest#evaluationTest$EVAL_TYPE test)
22 | kill -9 $server_PID
23 | sleep 2
--------------------------------------------------------------------------------
/src/main/java/XPress/XMLGeneration/XMLContext.java:
--------------------------------------------------------------------------------
1 | package XPress.XMLGeneration;
2 |
3 | import java.util.ArrayList;
4 | import java.util.List;
5 |
6 | public class XMLContext {
7 | ContextNode root;
8 | String xmlContent;
9 | List namespaceList;
10 |
11 | XMLContext(ContextNode root, String xmlContent) {
12 | this.root = root;
13 | this.xmlContent = xmlContent;
14 | }
15 |
16 | XMLContext(ContextNode root, String xmlContent, List namespaceList) {
17 | this.root = root;
18 | this.xmlContent = xmlContent;
19 | this.namespaceList = new ArrayList<>(namespaceList);
20 | }
21 |
22 | public ContextNode getRoot() {
23 | return root;
24 | }
25 | public String getXmlContent() {
26 | return xmlContent;
27 | }
28 |
29 | public List getNamespaceList() { return namespaceList; }
30 | }
31 |
--------------------------------------------------------------------------------
/src/main/java/XPress/XPathGeneration/LogicTree/InformationTree/InformationTreeFunctionNode/NotFunctionNode.java:
--------------------------------------------------------------------------------
1 | package XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode;
2 |
3 | import XPress.DatatypeControl.PrimitiveDatatype.XMLBoolean;
4 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeNode;
5 |
6 | @FunctionV1
7 | public class NotFunctionNode extends InformationTreeFunctionNode {
8 | public NotFunctionNode() {
9 | functionExpr = "not";
10 | datatypeRecorder.xmlDatatype = XMLBoolean.getInstance();
11 | }
12 |
13 | @Override
14 | public NotFunctionNode newInstance() {
15 | return new NotFunctionNode();
16 | }
17 |
18 | @Override
19 | public Boolean checkContextAcceptability(InformationTreeNode childNode) {
20 | return childNode.datatypeRecorder.xmlDatatype instanceof XMLBoolean;
21 | }
22 |
23 | }
24 |
--------------------------------------------------------------------------------
/src/main/java/XPress/XPathGeneration/LogicTree/InformationTree/InformationTreeFunctionNode/InformationTreeSequenceFunctionNode/EmptyFunctionNode.java:
--------------------------------------------------------------------------------
1 | package XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode.InformationTreeSequenceFunctionNode;
2 |
3 | import XPress.DatatypeControl.PrimitiveDatatype.XMLBoolean;
4 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeNode;
5 |
6 | //@FunctionV3
7 | public class EmptyFunctionNode extends InformationTreeSequenceFunctionNode {
8 | public EmptyFunctionNode() {
9 | functionExpr = "empty";
10 | datatypeRecorder.xmlDatatype = XMLBoolean.getInstance();
11 | }
12 |
13 | @Override
14 | protected void fillContentParametersRandom(InformationTreeNode childNode) {
15 | }
16 |
17 | @Override
18 | public EmptyFunctionNode newInstance() {
19 | return new EmptyFunctionNode();
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/src/main/java/XPress/XPathGeneration/LogicTree/InformationTree/InformationTreeFunctionNode/InformationTreeSequenceFunctionNode/ExistsFunctionNode.java:
--------------------------------------------------------------------------------
1 | package XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode.InformationTreeSequenceFunctionNode;
2 |
3 | import XPress.DatatypeControl.PrimitiveDatatype.XMLBoolean;
4 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeNode;
5 |
6 | //@FunctionV3
7 | public class ExistsFunctionNode extends InformationTreeSequenceFunctionNode {
8 | public ExistsFunctionNode() {
9 | functionExpr = "exists";
10 | datatypeRecorder.xmlDatatype = XMLBoolean.getInstance();
11 | }
12 |
13 | @Override
14 | protected void fillContentParametersRandom(InformationTreeNode childNode) {
15 | }
16 |
17 | @Override
18 | public ExistsFunctionNode newInstance() {
19 | return new ExistsFunctionNode();
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/src/main/java/XPress/XPathGeneration/LogicTree/InformationTree/InformationTreeFunctionNode/UpperCaseFunctionNode.java:
--------------------------------------------------------------------------------
1 | package XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode;
2 |
3 | import XPress.DatatypeControl.PrimitiveDatatype.XMLString;
4 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeNode;
5 |
6 | @FunctionV3
7 | public class UpperCaseFunctionNode extends InformationTreeFunctionNode {
8 | public UpperCaseFunctionNode() {
9 | datatypeRecorder.xmlDatatype = XMLString.getInstance();
10 | functionExpr = "upper-case";
11 | }
12 | @Override
13 | public Boolean checkContextAcceptability(InformationTreeNode childNode) {
14 | return childNode.datatypeRecorder.xmlDatatype instanceof XMLString;
15 | }
16 | @Override
17 | public UpperCaseFunctionNode newInstance() {
18 | return new UpperCaseFunctionNode();
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/src/main/java/XPress/XPathGeneration/LogicTree/InformationTree/InformationTreeFunctionNode/DoubleAbsFunctionNode.java:
--------------------------------------------------------------------------------
1 | package XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode;
2 |
3 | import XPress.DatatypeControl.PrimitiveDatatype.XMLDouble;
4 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeNode;
5 |
6 | @FunctionV3
7 | public class DoubleAbsFunctionNode extends InformationTreeFunctionNode {
8 | public DoubleAbsFunctionNode() {
9 | this.datatypeRecorder.xmlDatatype = XMLDouble.getInstance();
10 | functionExpr = "abs";
11 | }
12 |
13 | @Override
14 | public DoubleAbsFunctionNode newInstance() {
15 | return new DoubleAbsFunctionNode();
16 | }
17 |
18 | @Override
19 | public Boolean checkContextAcceptability(InformationTreeNode childNode) {
20 | return childNode.datatypeRecorder.xmlDatatype instanceof XMLDouble;
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/src/main/java/XPress/XPathGeneration/LogicTree/InformationTree/InformationTreeFunctionNode/IntegerAbsFunctionNode.java:
--------------------------------------------------------------------------------
1 | package XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode;
2 |
3 | import XPress.DatatypeControl.PrimitiveDatatype.XMLInteger;
4 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeNode;
5 |
6 | @FunctionV3
7 | public class IntegerAbsFunctionNode extends InformationTreeFunctionNode {
8 | public IntegerAbsFunctionNode() {
9 | datatypeRecorder.xmlDatatype = XMLInteger.getInstance();
10 | functionExpr = "abs";
11 | }
12 |
13 | @Override
14 | public IntegerAbsFunctionNode newInstance() {
15 | return new IntegerAbsFunctionNode();
16 | }
17 |
18 | @Override
19 | public Boolean checkContextAcceptability(InformationTreeNode childNode) {
20 | return childNode.datatypeRecorder.xmlDatatype instanceof XMLInteger;
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/src/main/java/XPress/XPathGeneration/LogicTree/InformationTree/InformationTreeFunctionNode/DoubleRoundFunctionNode.java:
--------------------------------------------------------------------------------
1 | package XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode;
2 |
3 | import XPress.DatatypeControl.PrimitiveDatatype.XMLDouble;
4 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeNode;
5 |
6 | @FunctionV1
7 | public class DoubleRoundFunctionNode extends InformationTreeFunctionNode {
8 | public DoubleRoundFunctionNode() {
9 | datatypeRecorder.xmlDatatype = XMLDouble.getInstance();
10 | functionExpr = "round";
11 | }
12 |
13 | @Override
14 | public DoubleRoundFunctionNode newInstance() {
15 | return new DoubleRoundFunctionNode();
16 | }
17 |
18 | @Override
19 | public Boolean checkContextAcceptability(InformationTreeNode childNode) {
20 | return childNode.datatypeRecorder.xmlDatatype instanceof XMLDouble;
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/src/main/java/XPress/XPathGeneration/LogicTree/InformationTree/InformationTreeFunctionNode/LowerCaseFunctionNode.java:
--------------------------------------------------------------------------------
1 | package XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode;
2 |
3 | import XPress.DatatypeControl.PrimitiveDatatype.XMLString;
4 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeNode;
5 |
6 | @FunctionV3
7 | public class LowerCaseFunctionNode extends InformationTreeFunctionNode {
8 | public LowerCaseFunctionNode() {
9 | datatypeRecorder.xmlDatatype = XMLString.getInstance();
10 | functionExpr = "lower-case";
11 | }
12 |
13 | @Override
14 | public Boolean checkContextAcceptability(InformationTreeNode childNode) {
15 | return childNode.datatypeRecorder.xmlDatatype instanceof XMLString;
16 | }
17 |
18 | @Override
19 | public LowerCaseFunctionNode newInstance() {
20 | return new LowerCaseFunctionNode();
21 | }
22 |
23 | }
24 |
--------------------------------------------------------------------------------
/src/main/java/XPress/XPathGeneration/LogicTree/InformationTree/InformationTreeFunctionNode/DoubleFloorFunctionNode.java:
--------------------------------------------------------------------------------
1 | package XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode;
2 |
3 | import XPress.DatatypeControl.PrimitiveDatatype.XMLDouble;
4 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeNode;
5 |
6 | @FunctionV1
7 | public class DoubleFloorFunctionNode extends InformationTreeFunctionNode {
8 |
9 | public DoubleFloorFunctionNode() {
10 | datatypeRecorder.xmlDatatype = XMLDouble.getInstance();
11 | functionExpr = "floor";
12 | }
13 |
14 | @Override
15 | public DoubleFloorFunctionNode newInstance() {
16 | return new DoubleFloorFunctionNode();
17 | }
18 |
19 | @Override
20 | public Boolean checkContextAcceptability(InformationTreeNode childNode) {
21 | return childNode.datatypeRecorder.xmlDatatype instanceof XMLDouble;
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/src/main/java/XPress/XPathGeneration/LogicTree/InformationTree/InformationTreeFunctionNode/DoubleCeilingFunctionNode.java:
--------------------------------------------------------------------------------
1 | package XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode;
2 |
3 | import XPress.DatatypeControl.PrimitiveDatatype.XMLDouble;
4 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeNode;
5 |
6 | @FunctionV1
7 | public class DoubleCeilingFunctionNode extends InformationTreeFunctionNode {
8 | public DoubleCeilingFunctionNode() {
9 | this.datatypeRecorder.xmlDatatype = XMLDouble.getInstance();
10 | functionExpr = "ceiling";
11 | }
12 |
13 | @Override
14 | public Boolean checkContextAcceptability(InformationTreeNode childNode) {
15 | return childNode.datatypeRecorder.xmlDatatype instanceof XMLDouble;
16 | }
17 | @Override
18 | public DoubleCeilingFunctionNode newInstance() {
19 | return new DoubleCeilingFunctionNode();
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/src/main/java/XPress/XPathGeneration/LogicTree/InformationTree/InformationTreeFunctionNode/NormalizeSpaceFunctionNode.java:
--------------------------------------------------------------------------------
1 | package XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode;
2 |
3 | import XPress.DatatypeControl.PrimitiveDatatype.XMLString;
4 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeNode;
5 |
6 | @FunctionV1
7 | public class NormalizeSpaceFunctionNode extends InformationTreeFunctionNode {
8 | public NormalizeSpaceFunctionNode() {
9 | datatypeRecorder.xmlDatatype = XMLString.getInstance();
10 | functionExpr = "normalize-space";
11 | }
12 |
13 | @Override
14 | public Boolean checkContextAcceptability(InformationTreeNode childNode) {
15 | return childNode.datatypeRecorder.xmlDatatype instanceof XMLString;
16 | }
17 |
18 | @Override
19 | public NormalizeSpaceFunctionNode newInstance() {
20 | return new NormalizeSpaceFunctionNode();
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/src/main/java/XPress/XMLGeneration/BaseCharIDStyleNameGeneratorImpl.java:
--------------------------------------------------------------------------------
1 | package XPress.XMLGeneration;
2 |
3 | import XPress.GlobalRandom;
4 |
5 | import java.util.ArrayList;
6 | import java.util.List;
7 |
8 | public class BaseCharIDStyleNameGeneratorImpl implements NameGenerator {
9 |
10 | char baseChar;
11 | List alphabetCntList = new ArrayList<>();
12 |
13 | BaseCharIDStyleNameGeneratorImpl(char baseChar) {
14 | this.baseChar = baseChar;
15 | for(int i = 0; i < 26; i ++) {
16 | alphabetCntList.add(1);
17 | }
18 | }
19 | @Override
20 | public String generateName() {
21 | int alphabetId = GlobalRandom.getInstance().nextInt(26);
22 | char prefix = (char) (baseChar + alphabetId);
23 | String name = prefix + Integer.toString(alphabetCntList.get(alphabetId));
24 | alphabetCntList.set(alphabetId, alphabetCntList.get(alphabetId) + 1);
25 | return name;
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/src/main/java/XPress/XPathGeneration/LogicTree/InformationTree/InformationTreeFunctionNode/CosFunctionNode.java:
--------------------------------------------------------------------------------
1 | package XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode;
2 |
3 | import XPress.DatatypeControl.PrimitiveDatatype.XMLDouble;
4 | import XPress.DatatypeControl.PrimitiveDatatype.XMLNumeric;
5 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeNode;
6 |
7 | @FunctionV3
8 | public class CosFunctionNode extends InformationTreeFunctionNode {
9 | public CosFunctionNode() {
10 | datatypeRecorder.xmlDatatype = XMLDouble.getInstance();
11 | functionExpr = "math:cos";
12 | }
13 |
14 | @Override
15 | public CosFunctionNode newInstance() {
16 | return new CosFunctionNode();
17 | }
18 |
19 | @Override
20 | public Boolean checkContextAcceptability(InformationTreeNode childNode) {
21 | return childNode.datatypeRecorder.xmlDatatype instanceof XMLNumeric;
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/src/main/java/XPress/XPathGeneration/LogicTree/InformationTree/InformationTreeFunctionNode/SinFunctionNode.java:
--------------------------------------------------------------------------------
1 | package XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode;
2 |
3 | import XPress.DatatypeControl.PrimitiveDatatype.XMLDouble;
4 | import XPress.DatatypeControl.PrimitiveDatatype.XMLNumeric;
5 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeNode;
6 |
7 | @FunctionV3
8 | public class SinFunctionNode extends InformationTreeFunctionNode {
9 | public SinFunctionNode() {
10 | datatypeRecorder.xmlDatatype = XMLDouble.getInstance();
11 | functionExpr = "math:sin";
12 | }
13 |
14 | @Override
15 | public SinFunctionNode newInstance() {
16 | return new SinFunctionNode();
17 | }
18 |
19 | @Override
20 | public Boolean checkContextAcceptability(InformationTreeNode childNode) {
21 | return childNode.datatypeRecorder.xmlDatatype instanceof XMLNumeric;
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/scripts/write_config.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | base_addr=$1
4 | config=$2
5 | config_details=(${config//_/ })
6 | evaluation_type=$3
7 | time_s=$4
8 | generator=$5
9 |
10 | file=$base_addr"/evaluation_config.txt"
11 | echo $time_s > $file
12 |
13 | if [ $evaluation_type = "1" ]; then
14 | echo "/experiment/evaluation_"$config"_"$generator"_24.txt" >> $file
15 | echo "/experiment/report_"$config"_"$generator"_24.txt" >> $file
16 | else
17 | echo "/experiment/diagnosis_"$config"_"$generator"_24.txt" >> $file
18 | fi
19 |
20 | if [ ${config_details[0]} = "s" ]; then
21 | star_node_selection="true"
22 | else
23 | star_node_selection="false"
24 | fi
25 | targeted_section_prefix="true"
26 |
27 | if [ ${config_details[1]} = "r" ]; then
28 | rectify_selection="true"
29 | else
30 | rectify_selection="false"
31 | fi
32 | echo $star_node_selection >> $file
33 | echo $targeted_section_prefix >> $file
34 | echo $rectify_selection >> $file
35 | echo $generator >>$file
36 |
--------------------------------------------------------------------------------
/src/main/java/XPress/XPathGeneration/XPathResultListPair.java:
--------------------------------------------------------------------------------
1 | package XPress.XPathGeneration;
2 |
3 | import XPress.XMLGeneration.ContextNode;
4 |
5 | import java.util.ArrayList;
6 | import java.util.List;
7 |
8 | public class XPathResultListPair {
9 | public String XPath;
10 | public List contextNodeList;
11 |
12 | public XPathResultListPair(String XPath, List contextNodeList) {
13 | setData(XPath, contextNodeList);
14 | }
15 |
16 | void setData(String XPath, List contextNodeList) {
17 | this.XPath = XPath;
18 | this.contextNodeList = contextNodeList;
19 | }
20 |
21 | XPathResultListPair(XPathResultListPair xPathResultListPair) {
22 | XPath = xPathResultListPair.XPath;
23 | if(xPathResultListPair.contextNodeList == null)
24 | contextNodeList = null;
25 | else
26 | contextNodeList = new ArrayList<>(xPathResultListPair.contextNodeList);
27 | }
28 | }
--------------------------------------------------------------------------------
/src/main/java/XPress/XPathGeneration/LogicTree/InformationTree/InformationTreeFunctionNode/DoubleRoundHalfToEvenFunctionNode.java:
--------------------------------------------------------------------------------
1 | package XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode;
2 |
3 | import XPress.DatatypeControl.PrimitiveDatatype.XMLDouble;
4 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeNode;
5 |
6 | @FunctionV3
7 | public class DoubleRoundHalfToEvenFunctionNode extends InformationTreeFunctionNode {
8 | public DoubleRoundHalfToEvenFunctionNode() {
9 | datatypeRecorder.xmlDatatype = XMLDouble.getInstance();
10 | functionExpr = "round-half-to-even";
11 | }
12 |
13 | @Override
14 | public Boolean checkContextAcceptability(InformationTreeNode childNode) {
15 | return childNode.datatypeRecorder.xmlDatatype instanceof XMLDouble;
16 | }
17 | @Override
18 | public DoubleRoundHalfToEvenFunctionNode newInstance() {
19 | return new DoubleRoundHalfToEvenFunctionNode();
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/src/main/java/XPress/XPathGeneration/LogicTree/InformationTree/InformationTreeFunctionNode/StringLengthFunctionNode.java:
--------------------------------------------------------------------------------
1 | package XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode;
2 |
3 | import XPress.DatatypeControl.PrimitiveDatatype.XMLInteger;
4 | import XPress.DatatypeControl.PrimitiveDatatype.XMLString;
5 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeNode;
6 |
7 | @FunctionV1
8 | public class StringLengthFunctionNode extends InformationTreeFunctionNode {
9 | public StringLengthFunctionNode() {
10 | datatypeRecorder.xmlDatatype = XMLInteger.getInstance();
11 | functionExpr = "string-length";
12 | }
13 |
14 | @Override
15 | public StringLengthFunctionNode newInstance() {
16 | return new StringLengthFunctionNode();
17 | }
18 |
19 | @Override
20 | public Boolean checkContextAcceptability(InformationTreeNode childNode) {
21 | return childNode.datatypeRecorder.xmlDatatype instanceof XMLString;
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/src/main/java/XPress/XPathGeneration/LogicTree/LogicTreeOrComparisonNode.java:
--------------------------------------------------------------------------------
1 | package XPress.XPathGeneration.LogicTree;
2 |
3 | import XPress.GlobalRandom;
4 | import XPress.TestException.DebugErrorException;
5 | import XPress.TestException.UnexpectedExceptionThrownException;
6 |
7 | import java.io.IOException;
8 | import java.sql.SQLException;
9 |
10 | public class LogicTreeOrComparisonNode extends LogicTreeComparisonNode{
11 | LogicTreeOrComparisonNode() {
12 | funcExpr = "or";
13 | }
14 |
15 | @Override
16 | public LogicTreeOrComparisonNode newInstance() {
17 | return new LogicTreeOrComparisonNode();
18 | }
19 |
20 | @Override
21 | public LogicTreeNode modifyToContainStarredNode(int starredNodeId) throws SQLException, UnexpectedExceptionThrownException, IOException, DebugErrorException {
22 | int id = GlobalRandom.getInstance().nextInt(2);
23 | childList.set(id, childList.get(id).modifyToContainStarredNodeWithCheck(starredNodeId));
24 | return this;
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/src/main/java/XPress/XPathGeneration/LogicTree/InformationTree/InformationTreeContext.java:
--------------------------------------------------------------------------------
1 | package XPress.XPathGeneration.LogicTree.InformationTree;
2 |
3 | import XPress.XPathGeneration.LogicTree.LogicTreeContext;
4 |
5 | public class InformationTreeContext extends LogicTreeContext {
6 | /**
7 | * Supplementary context only works for sequence of nodes, includes id of one random node in sequence
8 | */
9 | public String supplementaryContext = null;
10 |
11 | public InformationTreeContext() {}
12 |
13 | public InformationTreeContext(LogicTreeContext context) {
14 | setContext(context);
15 | }
16 |
17 | @Override
18 | public void setContext(LogicTreeContext context) {
19 | super.setContext(context);
20 | if(context instanceof InformationTreeContext) {
21 | supplementaryContext = ((InformationTreeContext) context).supplementaryContext;
22 | }
23 | }
24 |
25 | public void setContext(String context) {
26 | super.setContext(context);
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/src/main/java/XPress/XPathGeneration/LogicTree/InformationTree/InformationTreeFunctionNode/HoursFromDurationFunctionNode.java:
--------------------------------------------------------------------------------
1 | package XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode;
2 |
3 | import XPress.DatatypeControl.PrimitiveDatatype.XMLDuration;
4 | import XPress.DatatypeControl.PrimitiveDatatype.XMLInteger;
5 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeNode;
6 |
7 | @FunctionV3
8 | public class HoursFromDurationFunctionNode extends InformationTreeFunctionNode {
9 | public HoursFromDurationFunctionNode() {
10 | datatypeRecorder.xmlDatatype = XMLInteger.getInstance();
11 | functionExpr = "hours-from-duration";
12 | }
13 |
14 | @Override
15 | public Boolean checkContextAcceptability(InformationTreeNode childNode) {
16 | return childNode.datatypeRecorder.xmlDatatype instanceof XMLDuration;
17 | }
18 |
19 | @Override
20 | public HoursFromDurationFunctionNode newInstance() {
21 | return new HoursFromDurationFunctionNode();
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/src/main/java/XPress/XPathGeneration/LogicTree/InformationTree/InformationTreeFunctionNode/PrefixFromQNameFunctionNode.java:
--------------------------------------------------------------------------------
1 | package XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode;
2 |
3 | import XPress.DatatypeControl.PrimitiveDatatype.XMLQName;
4 | import XPress.DatatypeControl.PrimitiveDatatype.XMLString;
5 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeNode;
6 |
7 | @FunctionV3
8 | public class PrefixFromQNameFunctionNode extends InformationTreeFunctionNode {
9 | public PrefixFromQNameFunctionNode() {
10 | datatypeRecorder.xmlDatatype = XMLString.getInstance();
11 | functionExpr = "namespace-uri-from-QName";
12 | }
13 |
14 | @Override
15 | public NamespaceURIFromQNameFunctionNode newInstance() {
16 | return new NamespaceURIFromQNameFunctionNode();
17 | }
18 |
19 | @Override
20 | public Boolean checkContextAcceptability(InformationTreeNode childNode) {
21 | return childNode.datatypeRecorder.xmlDatatype instanceof XMLQName;
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/src/main/java/XPress/XPathGeneration/LogicTree/InformationTree/InformationTreeFunctionNode/YearsFromDurationFunctionNode.java:
--------------------------------------------------------------------------------
1 | package XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode;
2 |
3 | import XPress.DatatypeControl.PrimitiveDatatype.XMLDuration;
4 | import XPress.DatatypeControl.PrimitiveDatatype.XMLInteger;
5 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeNode;
6 |
7 | @FunctionV3
8 | public class YearsFromDurationFunctionNode extends InformationTreeFunctionNode {
9 | public YearsFromDurationFunctionNode() {
10 | datatypeRecorder.xmlDatatype = XMLInteger.getInstance();
11 | functionExpr = "years-from-duration";
12 | }
13 |
14 | @Override
15 | public Boolean checkContextAcceptability(InformationTreeNode childNode) {
16 | return childNode.datatypeRecorder.xmlDatatype instanceof XMLDuration;
17 | }
18 |
19 | @Override
20 | public YearsFromDurationFunctionNode newInstance() {
21 | return new YearsFromDurationFunctionNode();
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/src/main/java/XPress/XPathGeneration/LogicTree/LogicTreeAndComparisonNode.java:
--------------------------------------------------------------------------------
1 | package XPress.XPathGeneration.LogicTree;
2 |
3 | import XPress.TestException.DebugErrorException;
4 | import XPress.TestException.UnexpectedExceptionThrownException;
5 |
6 | import java.io.IOException;
7 | import java.sql.SQLException;
8 |
9 | public class LogicTreeAndComparisonNode extends LogicTreeComparisonNode {
10 | LogicTreeAndComparisonNode() {
11 | funcExpr = "and";
12 | }
13 |
14 | @Override
15 | public LogicTreeAndComparisonNode newInstance() {
16 | return new LogicTreeAndComparisonNode();
17 | }
18 |
19 | @Override
20 | public LogicTreeComparisonNode modifyToContainStarredNode(int starredNodeId) throws SQLException, UnexpectedExceptionThrownException, IOException, DebugErrorException {
21 | childList.set(0, childList.get(0).modifyToContainStarredNodeWithCheck(starredNodeId));
22 | childList.set(1, childList.get(1).modifyToContainStarredNodeWithCheck(starredNodeId));
23 | return this;
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/src/main/java/XPress/XPathGeneration/LogicTree/InformationTree/InformationTreeFunctionNode/DaysFromDurationFunctionNode.java:
--------------------------------------------------------------------------------
1 | package XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode;
2 |
3 | import XPress.DatatypeControl.PrimitiveDatatype.XMLDuration;
4 | import XPress.DatatypeControl.PrimitiveDatatype.XMLInteger;
5 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeNode;
6 |
7 | @FunctionV3
8 | public class DaysFromDurationFunctionNode extends InformationTreeFunctionNode {
9 | public DaysFromDurationFunctionNode() {
10 | this.datatypeRecorder.xmlDatatype = XMLInteger.getInstance();
11 | functionExpr = "days-from-duration";
12 | }
13 |
14 | @Override
15 | public Boolean checkContextAcceptability(InformationTreeNode childNode) {
16 | return childNode.datatypeRecorder.xmlDatatype instanceof XMLDuration;
17 | }
18 |
19 | @Override
20 | public DaysFromDurationFunctionNode newInstance() {
21 | return new DaysFromDurationFunctionNode();
22 | }
23 |
24 | }
25 |
--------------------------------------------------------------------------------
/src/main/java/XPress/XPathGeneration/LogicTree/InformationTree/InformationTreeFunctionNode/MonthsFromDurationFunctionNode.java:
--------------------------------------------------------------------------------
1 | package XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode;
2 |
3 | import XPress.DatatypeControl.PrimitiveDatatype.XMLDuration;
4 | import XPress.DatatypeControl.PrimitiveDatatype.XMLInteger;
5 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeNode;
6 |
7 | @FunctionV3
8 | public class MonthsFromDurationFunctionNode extends InformationTreeFunctionNode {
9 | public MonthsFromDurationFunctionNode() {
10 | datatypeRecorder.xmlDatatype = XMLInteger.getInstance();
11 | functionExpr = "months-from-duration";
12 | }
13 |
14 | @Override
15 | public Boolean checkContextAcceptability(InformationTreeNode childNode) {
16 | return childNode.datatypeRecorder.xmlDatatype instanceof XMLDuration;
17 | }
18 |
19 | @Override
20 | public MonthsFromDurationFunctionNode newInstance() {
21 | return new MonthsFromDurationFunctionNode();
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/src/main/java/XPress/XPathGeneration/LogicTree/InformationTree/InformationTreeFunctionNode/MinutesFromDurationFunctionNode.java:
--------------------------------------------------------------------------------
1 | package XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode;
2 |
3 | import XPress.DatatypeControl.PrimitiveDatatype.XMLDuration;
4 | import XPress.DatatypeControl.PrimitiveDatatype.XMLInteger;
5 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeNode;
6 |
7 | @FunctionV3
8 | public class MinutesFromDurationFunctionNode extends InformationTreeFunctionNode {
9 | public MinutesFromDurationFunctionNode() {
10 | datatypeRecorder.xmlDatatype = XMLInteger.getInstance();
11 | functionExpr = "minutes-from-duration";
12 | }
13 |
14 | @Override
15 | public Boolean checkContextAcceptability(InformationTreeNode childNode) {
16 | return childNode.datatypeRecorder.xmlDatatype instanceof XMLDuration;
17 | }
18 |
19 | @Override
20 | public MinutesFromDurationFunctionNode newInstance() {
21 | return new MinutesFromDurationFunctionNode();
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/src/main/java/XPress/XPathGeneration/LogicTree/InformationTree/InformationTreeFunctionNode/SecondsFromDurationFunctionNode.java:
--------------------------------------------------------------------------------
1 | package XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode;
2 |
3 | import XPress.DatatypeControl.PrimitiveDatatype.XMLDuration;
4 | import XPress.DatatypeControl.PrimitiveDatatype.XMLInteger;
5 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeNode;
6 |
7 | @FunctionV3
8 | public class SecondsFromDurationFunctionNode extends InformationTreeFunctionNode {
9 | public SecondsFromDurationFunctionNode() {
10 | datatypeRecorder.xmlDatatype = XMLInteger.getInstance();
11 | functionExpr = "seconds-from-duration";
12 | }
13 |
14 | @Override
15 | public Boolean checkContextAcceptability(InformationTreeNode childNode) {
16 | return childNode.datatypeRecorder.xmlDatatype instanceof XMLDuration;
17 | }
18 |
19 | @Override
20 | public SecondsFromDurationFunctionNode newInstance() {
21 | return new SecondsFromDurationFunctionNode();
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/src/main/java/XPress/XPathGeneration/LogicTree/InformationTree/InformationTreeFunctionNode/NamespaceURIFromQNameFunctionNode.java:
--------------------------------------------------------------------------------
1 | package XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode;
2 |
3 | import XPress.DatatypeControl.PrimitiveDatatype.XMLQName;
4 | import XPress.DatatypeControl.PrimitiveDatatype.XMLString;
5 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeNode;
6 |
7 | //@FunctionV3
8 | public class NamespaceURIFromQNameFunctionNode extends InformationTreeFunctionNode {
9 | public NamespaceURIFromQNameFunctionNode() {
10 | datatypeRecorder.xmlDatatype = XMLString.getInstance();
11 | functionExpr = "namespace-uri-from-QName";
12 | }
13 |
14 | @Override
15 | public NamespaceURIFromQNameFunctionNode newInstance() {
16 | return new NamespaceURIFromQNameFunctionNode();
17 | }
18 |
19 | @Override
20 | public Boolean checkContextAcceptability(InformationTreeNode childNode) {
21 | return childNode.datatypeRecorder.xmlDatatype instanceof XMLQName;
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/src/main/java/XPress/XPathGeneration/LogicTree/InformationTree/InformationTreeFunctionNode/NoActionFunctionNode.java:
--------------------------------------------------------------------------------
1 | package XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode;
2 |
3 | import XPress.DatatypeControl.XMLDatatypeComplexRecorder;
4 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeNode;
5 |
6 | public class NoActionFunctionNode extends InformationTreeFunctionNode {
7 |
8 | @Override
9 | protected void fillContentParameters(InformationTreeNode childNode) {
10 | fillContentParametersRandom(childNode);
11 | }
12 |
13 | @Override
14 | protected void fillContentParametersRandom(InformationTreeNode childNode) {
15 | datatypeRecorder = new XMLDatatypeComplexRecorder(childNode.datatypeRecorder);
16 | }
17 |
18 | @Override
19 | public Boolean checkContextAcceptability(InformationTreeNode childNode) {
20 | return true;
21 | }
22 |
23 | @Override
24 | public NoActionFunctionNode newInstance() {
25 | return new NoActionFunctionNode();
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/src/main/java/XPress/XPathGeneration/LogicTree/InformationTree/InformationTreeFunctionNode/InformationTreeSequenceFunctionNode/InformationTreeSequenceAggregationFunctionNode/InformationTreeSequenceNumericalAggregationFunctionNode.java:
--------------------------------------------------------------------------------
1 | package XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode.InformationTreeSequenceFunctionNode.InformationTreeSequenceAggregationFunctionNode;
2 |
3 | import XPress.DatatypeControl.PrimitiveDatatype.XMLNumeric;
4 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeNode;
5 |
6 | public abstract class InformationTreeSequenceNumericalAggregationFunctionNode extends InformationTreeSequenceAggregationFunctionNode {
7 | @Override
8 | public Boolean checkContextAcceptability(InformationTreeNode childNode) {
9 | return childNode.datatypeRecorder.getActualDatatype() instanceof XMLNumeric;
10 | }
11 |
12 | @Override
13 | protected void fillContentParametersRandom(InformationTreeNode childNode) {
14 | datatypeRecorder.xmlDatatype = childNode.datatypeRecorder.getActualDatatype();
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/docs/Axis Check.md:
--------------------------------------------------------------------------------
1 | ## Axis Check
2 |
3 | | Axis name | Application Condition (to produce non-empty result set) |
4 | | ------------------ | ------------------------------------------------------- |
5 | | child | Node with child node exist. |
6 | | descendant | Node with child node exits. |
7 | | parent | Exists node which has a parent node. |
8 | | ancestor | Exists node which has a parent node. |
9 | | following-sibling | Exists node with a following sibling. |
10 | | preceding-sibling | Exists node with a preceding sibling. |
11 | | following | Exists node with following nodes. |
12 | | preceding | Exists node with preceding nodes. |
13 | | self | Current context set is non-empty. |
14 | | descendant-or-self | Current context set is non-empty. |
15 | | ancestor-or-self | Current context set is non-empty. |
16 |
17 |
--------------------------------------------------------------------------------
/src/main/java/XPress/XPathGeneration/LogicTree/InformationTree/InformationTreeFunctionNode/InformationTreeSequenceFunctionNode/InformationTreeSequenceAggregationFunctionNode/AverageFunctionNode.java:
--------------------------------------------------------------------------------
1 | package XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode.InformationTreeSequenceFunctionNode.InformationTreeSequenceAggregationFunctionNode;
2 |
3 | import XPress.DatatypeControl.PrimitiveDatatype.XMLDouble;
4 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode.FunctionV3;
5 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeNode;
6 |
7 | @FunctionV3
8 | public class AverageFunctionNode extends InformationTreeSequenceNumericalAggregationFunctionNode {
9 | public AverageFunctionNode() {
10 | functionExpr = "avg";
11 | datatypeRecorder.xmlDatatype = XMLDouble.getInstance();
12 | }
13 |
14 | @Override
15 | public AverageFunctionNode newInstance() {
16 | return new AverageFunctionNode();
17 | }
18 |
19 | @Override
20 | protected void fillContentParametersRandom(InformationTreeNode childNode) {
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/.idea/jarRepositories.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
--------------------------------------------------------------------------------
/scripts/README.md:
--------------------------------------------------------------------------------
1 | # README
2 |
3 | ## Description
4 |
5 | Scripts in this directory could be used to reproduce experimental results in the evaluation section. All directories input should not end with '/'.
6 |
7 | ### Before Testing
8 |
9 | ```bash
10 | docker build -t xpress_eval .
11 | ```
12 |
13 | ### Evaluation Test 1
14 |
15 | ___
16 |
17 | ```bash
18 | ./evaluation_get.sh $dir_to_store_results$ $times_to_repeat_experiment$ $time_to_run_experiment_in_sec$
19 | ```
20 |
21 | ```bash
22 | export BASEX_HOME=$path_to_basex_repo$
23 | ./evaluation_result.sh $dir_to_store_results$ $times_to_repeat_experiment$ $whether to cover previous results(true or false without quotes)$
24 | # When experiment is set to run for 24 hours, graph plot of number of bugs found across time under different configs
25 | # is saved to unique_bug_num.png under this directory.
26 | ```
27 |
28 | ### Evaluation Test 2
29 |
30 | ____
31 |
32 | ```bash
33 | ./evaluation_get2.sh $dir_to_store_results$ $times_to_repeat_experiment$ $time_to_run_experiment_in_sec$
34 | python3 evaluation_result2.py $dir_to_store_results$ $times_to_repeat_experiment$
35 | ```
36 |
37 |
38 |
39 |
40 |
41 |
--------------------------------------------------------------------------------
/src/main/java/XPress/DatatypeControl/ValueHandler/XMLSequenceHandler.java:
--------------------------------------------------------------------------------
1 | package XPress.DatatypeControl.ValueHandler;
2 |
3 | import XPress.GlobalRandom;
4 | import XPress.Pair;
5 |
6 | import java.util.Arrays;
7 | import java.util.List;
8 |
9 | public class XMLSequenceHandler extends ValueHandler {
10 | public static List getRandomNodeValue() {
11 | Pair pair = getRandomIntervalPair();
12 | List generatedList = Arrays.asList(pair.x, pair.y);
13 | return generatedList;
14 | }
15 |
16 | public static Pair getRandomIntervalPair() {
17 | int l = GlobalRandom.getInstance().nextInt(10000);
18 | double prob = GlobalRandom.getInstance().nextDouble();
19 | if(prob < 0.5) l = -l;
20 | int length = GlobalRandom.getInstance().nextInt(1000);
21 | return new Pair(l, l + length);
22 | }
23 |
24 | @Override
25 | public String getValue() {
26 | //Pair pair = getRandomIntervalPair();
27 | return "()";
28 | //return "(" + pair.x + " to " + pair.y + ")";
29 | }
30 |
31 | @Override
32 | public String mutateValue(String baseString) {
33 | return null;
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/src/main/java/XPress/XPathGeneration/LogicTree/InformationTree/InformationTreeFunctionNode/TokenizeFunctionNode.java:
--------------------------------------------------------------------------------
1 | package XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode;
2 |
3 | import XPress.DatatypeControl.PrimitiveDatatype.XMLSequence;
4 | import XPress.DatatypeControl.PrimitiveDatatype.XMLString;
5 | import XPress.GlobalSettings;
6 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeNode;
7 |
8 | @FunctionV3
9 | public class TokenizeFunctionNode extends InformationTreeFunctionNode {
10 | public TokenizeFunctionNode() {
11 | datatypeRecorder.xmlDatatype = XMLSequence.getInstance();
12 | datatypeRecorder.subDatatype = XMLString.getInstance();
13 | functionExpr = "tokenize";
14 | }
15 | @Override
16 | public Boolean checkContextAcceptability(InformationTreeNode childNode) {
17 | boolean flag = childNode.datatypeRecorder.xmlDatatype instanceof XMLString;
18 | if(flag && GlobalSettings.starNodeSelection)
19 | if(childNode.context.context.length() == 0) return false;
20 | return flag;
21 | }
22 | @Override
23 | public TokenizeFunctionNode newInstance() {
24 | return new TokenizeFunctionNode();
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/src/main/java/XPress/DatatypeControl/ValueHandler/XMLMixedHandler.java:
--------------------------------------------------------------------------------
1 | package XPress.DatatypeControl.ValueHandler;
2 |
3 | import XPress.DatatypeControl.PrimitiveDatatype.*;
4 | import XPress.GlobalRandom;
5 |
6 | public class XMLMixedHandler extends ValueHandler {
7 | @Override
8 | public String getValue() {
9 | int length = GlobalRandom.getInstance().nextInt(5);
10 | StringBuilder value = new StringBuilder("(");
11 | for(int i = 0; i < length; i ++) {
12 | double prob = GlobalRandom.getInstance().nextDouble();
13 | XMLDatatype xmlDatatype;
14 | if(prob < 0.25) xmlDatatype = XMLInteger.getInstance();
15 | else if(prob < 0.5) xmlDatatype = XMLString.getInstance();
16 | else if(prob < 0.75) xmlDatatype = XMLDouble.getInstance();
17 | else xmlDatatype = XMLBoolean.getInstance();
18 | value.append(XMLDatatype.wrapExpression(xmlDatatype.getValueHandler().getValue(), xmlDatatype));
19 | if(i != length - 1) value.append(",");
20 | }
21 | value.append(")");
22 | return value.toString();
23 | }
24 |
25 | @Override
26 | public String mutateValue(String baseString) {
27 | return null;
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/src/main/java/XPress/DatatypeControl/ValueHandler/XMLDurationHandler.java:
--------------------------------------------------------------------------------
1 | package XPress.DatatypeControl.ValueHandler;
2 |
3 | import XPress.GlobalRandom;
4 |
5 | import java.util.Arrays;
6 | import java.util.List;
7 |
8 | public class XMLDurationHandler extends PooledValueHandler {
9 |
10 | List yearMonthDurationPostfix = Arrays.asList('Y', 'M', 'D');
11 | List dayTimeDurationPostfix = Arrays.asList('H', 'M', 'S');
12 |
13 | @Override
14 | String getRandomValue() {
15 | StringBuilder duration = new StringBuilder("P");
16 | for(Character yearMonthPostfix : yearMonthDurationPostfix) {
17 | duration.append(GlobalRandom.getInstance().nextInt(10000)).append(yearMonthPostfix);
18 | }
19 | duration.append("T");
20 | for(Character dayTimePostfix : dayTimeDurationPostfix) {
21 | duration.append(GlobalRandom.getInstance().nextInt(10000)).append(dayTimePostfix);
22 | }
23 | double prob = GlobalRandom.getInstance().nextDouble();
24 | if(prob < 0.5) duration.insert(0, "-");
25 | return duration.toString();
26 | }
27 |
28 | @Override
29 | public String mutateValue(String baseString) {
30 | return baseString;
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/src/test/java/XPress/XMLGeneration/XMLDocumentGeneratorTest.java:
--------------------------------------------------------------------------------
1 | package XPress.XMLGeneration;
2 |
3 | import org.junit.jupiter.api.Test;
4 |
5 | import java.io.IOException;
6 |
7 | public class XMLDocumentGeneratorTest {
8 |
9 | @Test
10 | void XMLContextTreeGenerationTest() {
11 | XMLDocumentGenerator xmlDocumentGenerator = new XMLDocumentGenerator();
12 | ContextNode root = xmlDocumentGenerator.generateXMLDocument(5);
13 | }
14 |
15 | @Test
16 | void XMLDocumentGenerationTest() {
17 | XMLDocumentGenerator xmlDocumentGenerator = new XMLDocumentGenerator();
18 | String xml = xmlDocumentGenerator.getXMLDocument(5);
19 | System.out.println(xml);
20 | }
21 |
22 | @Test
23 | void saveXMLDocumentToFileTest() throws IOException {
24 | XMLDocumentGenerator xmlDocumentGenerator = new XMLDocumentGenerator();
25 | xmlDocumentGenerator.generateXMLDocumentSave2Resource(5, "/xmldocs/test2.xml");
26 | }
27 |
28 | @Test
29 | void XMLDocumentGenerationWithStructureTest() {
30 | XMLDocumentGenerator xmlDocumentGenerator = new XMLDocumentGenerator();
31 | String xml = xmlDocumentGenerator.getXMLDocumentWithStructure(4);
32 | System.out.println(xml);
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/src/main/java/XPress/XPathGeneration/LogicTree/InformationTree/InformationTreeFunctionNode/BinaryLogicOperatorFunctionNode.java:
--------------------------------------------------------------------------------
1 | package XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode;
2 |
3 | import XPress.DatatypeControl.PrimitiveDatatype.XMLBoolean;
4 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeConstantNode;
5 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeNode;
6 |
7 | public abstract class BinaryLogicOperatorFunctionNode extends BinaryOperatorFunctionNode {
8 | public BinaryLogicOperatorFunctionNode() {
9 | datatypeRecorder.xmlDatatype = XMLBoolean.getInstance();
10 | }
11 |
12 | @Override
13 | public Boolean checkContextAcceptability(InformationTreeNode childNode) {
14 | return childNode.datatypeRecorder.xmlDatatype instanceof XMLBoolean;
15 | }
16 |
17 | protected void fillContentParameters(InformationTreeNode childNode) {
18 | fillContentParametersRandom(childNode);
19 | }
20 | protected void fillContentParametersRandom(InformationTreeNode childNode) {
21 | childList.add(new InformationTreeConstantNode(childNode.datatypeRecorder.xmlDatatype,
22 | XMLBoolean.getInstance().getValueHandler().getValue()));
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/src/main/java/XPress/XPathGeneration/LogicTree/InformationTree/InformationTreeFunctionNode/InformationTreeSequenceFunctionNode/InformationTreeSequenceAggregationFunctionNode/MinFunctionNode.java:
--------------------------------------------------------------------------------
1 | package XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode.InformationTreeSequenceFunctionNode.InformationTreeSequenceAggregationFunctionNode;
2 |
3 | import XPress.DatatypeControl.PrimitiveDatatype.XMLSequence;
4 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode.FunctionV3;
5 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeNode;
6 |
7 | @FunctionV3
8 | public class MinFunctionNode extends InformationTreeSequenceNumericalAggregationFunctionNode {
9 | public MinFunctionNode() {
10 | functionExpr = "min";
11 | }
12 |
13 | @Override
14 | public MinFunctionNode newInstance() {
15 | return new MinFunctionNode();
16 | }
17 |
18 | @Override
19 | protected void fillContentParametersRandom(InformationTreeNode childNode) {
20 | if(childNode.datatypeRecorder.xmlDatatype instanceof XMLSequence)
21 | datatypeRecorder.xmlDatatype = childNode.datatypeRecorder.subDatatype;
22 | else datatypeRecorder.xmlDatatype = childNode.datatypeRecorder.xmlDatatype;
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/src/main/java/XPress/XPathGeneration/LogicTree/InformationTree/InformationTreeFunctionNode/InformationTreeSequenceFunctionNode/InformationTreeSequenceAggregationFunctionNode/MaxFunctionNode.java:
--------------------------------------------------------------------------------
1 | package XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode.InformationTreeSequenceFunctionNode.InformationTreeSequenceAggregationFunctionNode;
2 |
3 | import XPress.DatatypeControl.PrimitiveDatatype.XMLSequence;
4 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode.FunctionV3;
5 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeNode;
6 |
7 | @FunctionV3
8 | public class MaxFunctionNode extends InformationTreeSequenceNumericalAggregationFunctionNode {
9 | public MaxFunctionNode() {
10 | functionExpr = "max";
11 | }
12 |
13 |
14 | @Override
15 | public MaxFunctionNode newInstance() {
16 | return new MaxFunctionNode();
17 | }
18 |
19 | @Override
20 | protected void fillContentParametersRandom(InformationTreeNode childNode) {
21 | if(childNode.datatypeRecorder.xmlDatatype instanceof XMLSequence)
22 | datatypeRecorder.xmlDatatype = childNode.datatypeRecorder.subDatatype;
23 | else datatypeRecorder.xmlDatatype = childNode.datatypeRecorder.xmlDatatype;
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/src/main/java/XPress/XPathGeneration/LogicTree/InformationTree/InformationTreeFunctionNode/InformationTreeSequenceFunctionNode/TailFunctionNode.java:
--------------------------------------------------------------------------------
1 | package XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode.InformationTreeSequenceFunctionNode;
2 |
3 | import XPress.DatatypeControl.PrimitiveDatatype.XMLSequence;
4 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode.FunctionV3;
5 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeNode;
6 |
7 | @FunctionV3
8 | public class TailFunctionNode extends InformationTreeSequenceFunctionNode {
9 | public TailFunctionNode() {
10 | functionExpr = "tail";
11 | }
12 |
13 | @Override
14 | public TailFunctionNode newInstance() {
15 | return new TailFunctionNode();
16 | }
17 |
18 | @Override
19 | public Boolean checkContextAcceptability(InformationTreeNode childNode) {
20 | // TODO: Note that this check is for filling contents to not result in empty sequence, in fact is still legal;
21 | if(!(childNode.datatypeRecorder.xmlDatatype instanceof XMLSequence))
22 | return false;
23 | if(childNode.getContext().context == null) return true;
24 | return Integer.parseInt(childNode.getContext().context) > 1;
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/src/main/java/XPress/XPathGeneration/LogicTree/LogicTreeContextInfo.java:
--------------------------------------------------------------------------------
1 | package XPress.XPathGeneration.LogicTree;
2 |
3 | import XPress.DatabaseExecutor.MainExecutor;
4 |
5 | public class LogicTreeContextInfo {
6 |
7 | public MainExecutor mainExecutor;
8 |
9 | /**
10 | * Record down the XPathPrefix to produce node candidates before applying current information tree selection.
11 | * e.g. /A1/B1, /A1/(B1, C1)
12 | */
13 | public String XPathPrefix;
14 |
15 | public LogicTreeContextInfo() {}
16 |
17 | public LogicTreeContextInfo(MainExecutor mainExecutor, String XPathExpr) {
18 | this.mainExecutor = mainExecutor;
19 | this.XPathPrefix = XPathExpr;
20 | }
21 |
22 | public LogicTreeContextInfo(LogicTreeContextInfo infoNode) {
23 | inheritInfo(infoNode);
24 | }
25 |
26 | public LogicTreeContextInfo(LogicTreeNode logicTreeNode) {
27 | inheritInfo(logicTreeNode.contextInfo);
28 | }
29 |
30 | public void inheritInfo(LogicTreeContextInfo infoNode) {
31 | mainExecutor = infoNode.mainExecutor;
32 | XPathPrefix = infoNode.XPathPrefix;
33 | }
34 |
35 | public void setInfo(MainExecutor mainExecutor, String XPathExpr) {
36 | this.mainExecutor = mainExecutor;
37 | this.XPathPrefix = XPathExpr;
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/src/main/java/XPress/XMLGeneration/AttributeTemplateGeneratorImpl.java:
--------------------------------------------------------------------------------
1 | package XPress.XMLGeneration;
2 |
3 | import XPress.DatatypeControl.PrimitiveDatatype.XMLDatatype;
4 | import XPress.DatatypeControl.PrimitiveDatatype.XMLInteger;
5 |
6 | import java.util.ArrayList;
7 | import java.util.List;
8 |
9 | public class AttributeTemplateGeneratorImpl implements AttributeTemplateGenerator {
10 | NameGenerator nameGenerator;
11 |
12 | AttributeTemplateGeneratorImpl(NameGenerator nameGenerator) {
13 | this.nameGenerator = nameGenerator;
14 | }
15 |
16 | @Override
17 | public List generateAttributeTemplate(int templateSize) {
18 | List attributeNodeList = new ArrayList<>();
19 | AttributeNode attributeID = new AttributeNode();
20 | attributeID.tagName = "id";
21 | attributeID.dataType = XMLInteger.getInstance();
22 | attributeNodeList.add(attributeID);
23 |
24 | for(int i = 1; i < templateSize; i ++) {
25 | AttributeNode attributeNode = new AttributeNode();
26 | attributeNode.tagName = nameGenerator.generateName();
27 | attributeNode.dataType = XMLDatatype.getRandomDataType();
28 | attributeNodeList.add(attributeNode);
29 | }
30 | return attributeNodeList;
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/src/main/java/XPress/XPathGeneration/LogicTree/InformationTree/InformationTreeFunctionNode/InformationTreeSequenceFunctionNode/InformationTreeSequenceFunctionNode.java:
--------------------------------------------------------------------------------
1 | package XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode.InformationTreeSequenceFunctionNode;
2 |
3 | import XPress.DatatypeControl.PrimitiveDatatype.XMLSequence;
4 | import XPress.DatatypeControl.XMLDatatypeComplexRecorder;
5 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode.InformationTreeFunctionNode;
6 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeNode;
7 |
8 | public abstract class InformationTreeSequenceFunctionNode extends InformationTreeFunctionNode {
9 | public InformationTreeSequenceFunctionNode() {
10 | datatypeRecorder.xmlDatatype = XMLSequence.getInstance();
11 | }
12 |
13 | @Override
14 | protected void fillContentParameters(InformationTreeNode childNode) {
15 | fillContentParametersRandom(childNode);
16 | }
17 |
18 | @Override
19 | protected void fillContentParametersRandom(InformationTreeNode childNode) {
20 | datatypeRecorder = new XMLDatatypeComplexRecorder(childNode.datatypeRecorder);
21 | }
22 |
23 | @Override
24 | public Boolean checkContextAcceptability(InformationTreeNode childNode) {
25 | return true;
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/scripts/unique_check.py:
--------------------------------------------------------------------------------
1 | import os
2 | import sys
3 | import subprocess
4 |
5 | meta_file = open('basex_commit_data.txt', 'r')
6 | commit_info=meta_file.readlines()
7 | base_addr = sys.argv[1]
8 | meta_file.close()
9 | result_root_dir = base_addr + "/" + sys.argv[4]
10 | config = sys.argv[2]
11 | generator = sys.argv[3]
12 | cover = sys.argv[5]
13 |
14 | for commit in commit_info:
15 | date, sha = commit.split()
16 | output_file = result_root_dir + "/" + config + "_" + generator + "/" + date + "_" + sha + ".txt"
17 | if(cover == "false" and os.path.isfile(output_file)):
18 | continue
19 | os.system("mkdir -p " + result_root_dir + "/" + config + "_" + generator)
20 | os.system("./basex_version_setup.sh " + os.environ['BASEX_HOME'] + " " + sha)
21 | input_file = result_root_dir + "/report_" + config + "_" + generator + "_24.txt"
22 | os.system("echo " + output_file + " > " + base_addr + "/config.txt")
23 | os.system("echo " + input_file + " >> " + base_addr + "/config.txt")
24 | pid_file=open("server_PID.txt")
25 | server_PID=pid_file.readlines()[0]
26 | # call java
27 | os.system("(cd .. && mvn clean compile exec:java -Dexec.mainClass=\"XPress.CheckUnique\" -Dexec.args=\"" + base_addr + "\")")
28 | print("Successfully calculated data for commit on " + date + " with sha " + sha + " " + sys.argv[3])
29 | os.system("kill -9 " + server_PID)
--------------------------------------------------------------------------------
/src/main/java/XPress/StringUtils.java:
--------------------------------------------------------------------------------
1 | package XPress;
2 |
3 | import java.util.ArrayList;
4 | import java.util.List;
5 |
6 | public class StringUtils {
7 |
8 | // List getOccurrenceInString(String baseString, String searchString) {
9 | // List resultList = new ArrayList<>();
10 | // // TODO
11 | // return null;
12 | // }
13 |
14 | public static List getOccurrenceInString(String baseString, String searchString) {
15 | List resultList = new ArrayList<>();
16 | int lastIndex = 0;
17 | while(lastIndex != -1) {
18 | lastIndex = baseString.indexOf(searchString,lastIndex);
19 | if(lastIndex != -1){
20 | resultList.add(lastIndex);
21 | lastIndex += 1;
22 | }
23 | }
24 | return resultList;
25 | }
26 |
27 | public static String getListString(List list) {
28 | return getListString(list, ",");
29 | }
30 |
31 | public static String getListString(List list, String delimiter) {
32 | String resultStr = "";
33 | boolean needDelim = false;
34 | for(T child: list) {
35 | if(needDelim) resultStr += delimiter;
36 | resultStr += child.toString();
37 | if(!needDelim) needDelim = true;
38 | }
39 | return resultStr;
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/src/main/java/XPress/XPathGeneration/LogicTree/InformationTree/InformationTreeFunctionNode/BooleanFunctionNode.java:
--------------------------------------------------------------------------------
1 | package XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode;
2 |
3 | import XPress.DatatypeControl.PrimitiveDatatype.*;
4 | import XPress.DatatypeControl.ValueHandler.XMLDurationHandler;
5 | import XPress.DatatypeControl.XMLSimple;
6 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeNode;
7 |
8 | @FunctionV1
9 | public class BooleanFunctionNode extends InformationTreeFunctionNode {
10 | public BooleanFunctionNode() {
11 | datatypeRecorder.xmlDatatype = XMLBoolean.getInstance();
12 | functionExpr = "boolean";
13 | }
14 | @Override
15 | public BooleanFunctionNode newInstance() {
16 | return new BooleanFunctionNode();
17 | }
18 |
19 | @Override
20 | public Boolean checkContextAcceptability(InformationTreeNode childNode) {
21 | if(childNode.datatypeRecorder.xmlDatatype instanceof XMLSequence) {
22 | return childNode.datatypeRecorder.subDatatype instanceof XMLNode;
23 | }
24 | if(childNode.datatypeRecorder.xmlDatatype instanceof XMLQName) return false;
25 | if(childNode.datatypeRecorder.xmlDatatype instanceof XMLDuration) return false;
26 | if(childNode.datatypeRecorder.xmlDatatype instanceof XMLSimple) return true;
27 | return false;
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/src/test/java/XPress/GlobalRandomTest.java:
--------------------------------------------------------------------------------
1 | package XPress;
2 |
3 | import org.junit.jupiter.api.Test;
4 |
5 | import java.util.HashSet;
6 | import java.util.List;
7 | import java.util.Set;
8 |
9 | import static org.junit.jupiter.api.Assertions.assertTrue;
10 | import static org.junit.jupiter.api.Assertions.assertFalse;
11 | public class GlobalRandomTest {
12 | @Test
13 | void nextIntListNoRepRandomGenerationTest() {
14 | for(int i = 0; i < 5; i ++) {
15 | int length = GlobalRandom.getInstance().nextInt(10);
16 | int maxBound = GlobalRandom.getInstance().nextInt(15);
17 | if (maxBound < length) {
18 | int t = maxBound;
19 | maxBound = length;
20 | length = t;
21 | }
22 | System.out.println("-------------" + length + " " + maxBound);
23 | List list = GlobalRandom.getInstance().nextIntListNoRep(length, maxBound);
24 | Set set = new HashSet<>();
25 | assertTrue(list.size() == length);
26 | for (Integer intVar : list) {
27 | assertFalse(set.contains(intVar));
28 | assertTrue(intVar < maxBound);
29 | }
30 | for (Integer intVar : list) {
31 | System.out.printf(intVar + " ");
32 | }
33 | System.out.println("");
34 | }
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/src/main/java/XPress/XPathGeneration/LogicTree/InformationTree/InformationTreeFunctionNode/InformationTreeDirectContentFunctionNode/NameFunctionNode.java:
--------------------------------------------------------------------------------
1 | package XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode.InformationTreeDirectContentFunctionNode;
2 |
3 | import XPress.DatatypeControl.PrimitiveDatatype.XMLNode;
4 | import XPress.DatatypeControl.PrimitiveDatatype.XMLSequence;
5 | import XPress.DatatypeControl.PrimitiveDatatype.XMLString;
6 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode.FunctionV3;
7 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeNode;
8 |
9 | @FunctionV3
10 | public class NameFunctionNode extends InformationTreeDirectContentFunctionNode {
11 | public NameFunctionNode() {
12 | functionExpr = "name";
13 | }
14 |
15 | @Override
16 | public NameFunctionNode newInstance() {
17 | return new NameFunctionNode();
18 | }
19 |
20 | @Override
21 | protected void fillContentParametersRandom(InformationTreeNode childNode) {
22 | if(childNode.datatypeRecorder.xmlDatatype instanceof XMLNode) {
23 | datatypeRecorder.xmlDatatype = XMLString.getInstance();
24 | }
25 | else {
26 | datatypeRecorder.xmlDatatype = XMLSequence.getInstance();
27 | datatypeRecorder.subDatatype = XMLString.getInstance();
28 | }
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/src/main/java/XPress/XPathGeneration/LogicTree/InformationTree/InformationTreeFunctionNode/InformationTreeSequenceFunctionNode/DistinctValuesFunctionNode.java:
--------------------------------------------------------------------------------
1 | package XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode.InformationTreeSequenceFunctionNode;
2 |
3 | import XPress.DatatypeControl.PrimitiveDatatype.XMLSequence;
4 | import XPress.DatatypeControl.XMLAtomic;
5 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeNode;
6 |
7 | // TODO: Should only accept atomic types (could be with implicit cast) and would also result in list of atomic types.
8 | //@FunctionV3
9 | public class DistinctValuesFunctionNode extends InformationTreeSequenceFunctionNode {
10 | public DistinctValuesFunctionNode() {
11 | functionExpr = "distinct-values";
12 | }
13 |
14 | @Override
15 | public DistinctValuesFunctionNode newInstance() {
16 | return new DistinctValuesFunctionNode();
17 | }
18 |
19 | @Override
20 | protected void fillContentParametersRandom(InformationTreeNode childNode) {
21 | datatypeRecorder.xmlDatatype = XMLSequence.getInstance();
22 | datatypeRecorder.subDatatype = childNode.datatypeRecorder.getActualDatatype();
23 | }
24 |
25 | @Override
26 | public Boolean checkContextAcceptability(InformationTreeNode childNode) {
27 | return childNode.datatypeRecorder.getActualDatatype() instanceof XMLAtomic;
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/src/main/java/XPress/CmdArgs/CmdArgs.java:
--------------------------------------------------------------------------------
1 | package XPress.CmdArgs;
2 | import com.beust.jcommander.Parameter;
3 |
4 | public class CmdArgs {
5 |
6 | @Parameter(names = "-log", description = "Place to output log file", required = true)
7 | public String log;
8 |
9 | @Parameter(names = "-test", description = "Semicolon-separated list of systems to be tested", required = true)
10 | public String testSystems;
11 |
12 | @Parameter(names = "-default", description = "System used for query generation")
13 | public String defaultSystem = "Saxon";
14 |
15 | public String defaultSystemConfig = "";
16 |
17 | @Parameter(names = "-standard", description = "XPath standard of tested systems")
18 | public Integer standard = 3;
19 |
20 | @Parameter(names = "-round", description = "Total round of testing")
21 | public Integer round = 20;
22 |
23 | @Parameter(names = "-xpath", description = "XPath expressions to test for each round",
24 | validateWith = XPathValidator.class)
25 | public Integer xpath = 200;
26 |
27 | @Parameter(names = "-node", description = "Number of element nodes to generate in XML tree",
28 | validateWith = NodeValidator.class)
29 | public Integer node = 50;
30 |
31 | @Parameter(names = "-section", description = "Maximum number of sections for each predicate",
32 | validateWith = SectionValidator.class)
33 | public Integer section = 4;
34 | }
35 |
36 |
--------------------------------------------------------------------------------
/src/main/java/XPress/XPathGeneration/LogicTree/InformationTree/InformationTreeFunctionNode/BinaryOperatorFunctionNode.java:
--------------------------------------------------------------------------------
1 | package XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode;
2 |
3 | import XPress.TestException.DebugErrorException;
4 | import XPress.XPathGeneration.LogicTree.LogicTreeNode;
5 |
6 | public abstract class BinaryOperatorFunctionNode extends InformationTreeFunctionNode {
7 |
8 | @Override
9 | public String getXPathExpression(boolean returnConstant, LogicTreeNode parentNode, boolean calculateString) throws DebugErrorException {
10 | String returnString = getXPathExpressionCheck(returnConstant, parentNode, calculateString);
11 | if(returnString != null) return binaryWrap(returnString, parentNode);
12 | returnString = childList.get(0).getXPathExpression(returnConstant, this, calculateString) + " " + functionExpr + " " +
13 | childList.get(1).getXPathExpression(returnConstant, this, calculateString);
14 | cacheXPathExpression(returnString, returnConstant, calculateString);
15 | return binaryWrap(returnString, parentNode);
16 | }
17 |
18 | public String binaryWrap(String resultString, LogicTreeNode parentNode) {
19 | if(parentNode != null) {
20 | if(parentNode instanceof BinaryOperatorFunctionNode)
21 | resultString = "(" + resultString + ")";
22 | }
23 | return resultString;
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/src/main/java/XPress/XPathGeneration/LogicTree/InformationTree/InformationTreeFunctionNode/InformationTreeDirectContentFunctionNode/LocalNameFunctionNode.java:
--------------------------------------------------------------------------------
1 | package XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode.InformationTreeDirectContentFunctionNode;
2 |
3 | import XPress.DatatypeControl.PrimitiveDatatype.XMLNode;
4 | import XPress.DatatypeControl.PrimitiveDatatype.XMLSequence;
5 | import XPress.DatatypeControl.PrimitiveDatatype.XMLString;
6 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode.FunctionV3;
7 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeNode;
8 |
9 | @FunctionV3
10 | public class LocalNameFunctionNode extends InformationTreeDirectContentFunctionNode {
11 | public LocalNameFunctionNode() {
12 | functionExpr = "local-name";
13 | }
14 |
15 | @Override
16 | public LocalNameFunctionNode newInstance() {
17 | return new LocalNameFunctionNode();
18 | }
19 |
20 | @Override
21 | protected void fillContentParametersRandom(InformationTreeNode childNode) {
22 | if(childNode.datatypeRecorder.xmlDatatype instanceof XMLNode) {
23 | datatypeRecorder.xmlDatatype = XMLString.getInstance();
24 | }
25 | else {
26 | datatypeRecorder.xmlDatatype = XMLSequence.getInstance();
27 | datatypeRecorder.subDatatype = XMLString.getInstance();
28 | }
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/src/main/java/XPress/CommonUtils.java:
--------------------------------------------------------------------------------
1 | package XPress;
2 |
3 | import java.io.*;
4 | import java.nio.charset.StandardCharsets;
5 | import java.util.List;
6 | import java.util.stream.Collectors;
7 |
8 | public class CommonUtils {
9 | public static void writeContextToFile(String xmlDataContent, String fileAddr) throws IOException {
10 | FileWriter writer =
11 | new FileWriter(fileAddr);
12 | writer.write(xmlDataContent);
13 | writer.close();
14 | }
15 |
16 | public static String readInputStream(InputStream inputStream) {
17 | String text = new BufferedReader(
18 | new InputStreamReader(inputStream, StandardCharsets.UTF_8))
19 | .lines()
20 | .collect(Collectors.joining("\n"));
21 | return text;
22 | }
23 |
24 | public static boolean compareList(List listA, List listB) {
25 | if(listA.size() != listB.size())
26 | return false;
27 | for(int i = 0; i < listA.size(); i ++)
28 | if(!listA.get(i).equals(listB.get(i)))
29 | return false;
30 | return true;
31 | }
32 |
33 | public static Integer getEnclosedInteger(String context, int id) {
34 | for(int i = id; i < context.length(); i ++)
35 | if(context.charAt(i) == '\"') {
36 | return Integer.parseInt(context.substring(id, i));
37 | }
38 | return null;
39 | }
40 | }
41 |
--------------------------------------------------------------------------------
/src/test/java/XPress/DatatypeControl/ValueHandler/XMLStringHandlerTest.java:
--------------------------------------------------------------------------------
1 | package XPress.DatatypeControl.ValueHandler;
2 |
3 | import XPress.DatatypeControl.ValueHandler.XMLStringHandler;
4 | import org.junit.jupiter.api.Test;
5 | import static org.junit.jupiter.api.Assertions.assertTrue;
6 | import static org.junit.jupiter.api.Assertions.assertFalse;
7 |
8 | public class XMLStringHandlerTest {
9 | @Test
10 | void GenerateRandomXMLStringTest() {
11 | XMLStringHandler xmlStringHandler = new XMLStringHandler();
12 | String randomString = xmlStringHandler.getRandomValue();
13 | System.out.println(randomString);
14 | }
15 |
16 | @Test
17 | void EscapeSetContainsSingleDash() {
18 | XMLStringHandler xmlStringHandler = new XMLStringHandler();
19 | assertTrue(xmlStringHandler.escapeSet.contains('\''));
20 | }
21 |
22 | @Test
23 | void GeneratedStringDoesNotContainEscapedCharacters() {
24 | XMLStringHandler xmlStringHandler = new XMLStringHandler();
25 | for(int i = 1; i <= 10; i ++) {
26 | String randomString = xmlStringHandler.getRandomValue();
27 | for (int j = 0; j < randomString.length(); j ++) {
28 | assertFalse(xmlStringHandler.escapeSet.contains(randomString.charAt(j)));
29 | }
30 | }
31 | }
32 |
33 | @Test
34 | void ScratchTest() {
35 | String a = "a";
36 | a += "v";
37 | System.out.println(a);
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/src/main/java/XPress/XPathGeneration/LogicTree/InformationTree/InformationTreeFunctionNode/InformationTreeDirectContentFunctionNode/NodeNameFunctionNode.java:
--------------------------------------------------------------------------------
1 | package XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode.InformationTreeDirectContentFunctionNode;
2 |
3 | import XPress.DatatypeControl.PrimitiveDatatype.XMLNode;
4 | import XPress.DatatypeControl.PrimitiveDatatype.XMLQName;
5 | import XPress.DatatypeControl.PrimitiveDatatype.XMLSequence;
6 | import XPress.DatatypeControl.PrimitiveDatatype.XMLString;
7 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode.FunctionV3;
8 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeNode;
9 |
10 | @FunctionV3
11 | public class NodeNameFunctionNode extends InformationTreeDirectContentFunctionNode {
12 | public NodeNameFunctionNode() {
13 | functionExpr = "node-name";
14 | }
15 |
16 | @Override
17 | public NodeNameFunctionNode newInstance() {
18 | return new NodeNameFunctionNode();
19 | }
20 |
21 | @Override
22 | protected void fillContentParametersRandom(InformationTreeNode childNode) {
23 | if(childNode.datatypeRecorder.xmlDatatype instanceof XMLNode) {
24 | datatypeRecorder.xmlDatatype = XMLQName.getInstance();
25 | }
26 | else {
27 | datatypeRecorder.xmlDatatype = XMLSequence.getInstance();
28 | datatypeRecorder.subDatatype = XMLQName.getInstance();
29 | }
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/scripts/evaluation_result2.py:
--------------------------------------------------------------------------------
1 | from collections import defaultdict
2 | import os
3 | import sys
4 |
5 | root_dir = sys.argv[1]
6 | tem_dict0 = {}
7 | tem_dict = {
8 | 'XQGen': tem_dict0.copy(),
9 | 'Com': tem_dict0.copy(),
10 | }
11 | evaluation_dict = {
12 | 's_r': tem_dict.copy(),
13 | 's_nr': tem_dict.copy(),
14 | 'p_r': tem_dict.copy(),
15 | 'p_nr': tem_dict.copy(),
16 | }
17 |
18 | config_list = ['s_r', 's_nr', 'p_r', 'p_nr']
19 | generator_list=['Com', 'XQGen']
20 | answer_dict = defaultdict(lambda: defaultdict(lambda: 0))
21 | collect_list = ['successful', 'non-empty']
22 |
23 | for config in config_list:
24 | for generator in generator_list:
25 | tot = 0
26 | for i in range(1, 10):
27 | result_dir = root_dir + str(i) + "/"
28 | results = open(result_dir + "diagnosis_" + config + "_" + generator + "_24.txt", 'r').read().splitlines()
29 | for data in results:
30 | data = data.split(" ", 1)
31 | evaluation_dict[config][generator][data[0].rstrip(':')] = data[1]
32 | for collect in collect_list:
33 | answer_dict[config][generator][collect] += int(evaluation_dict[config][generator][collect])
34 | answer_dict[config][generator]['rate'] += int(evaluation_dict[config][generator]['non-empty']) / int(evaluation_dict[config][generator]['successful'])
35 | tot += 1
36 | print(config, generator, answer_dict[config][generator]['rate'] / tot)
37 |
38 |
--------------------------------------------------------------------------------
/src/main/java/XPress/DatatypeControl/PrimitiveDatatype/XMLDouble.java:
--------------------------------------------------------------------------------
1 | package XPress.DatatypeControl.PrimitiveDatatype;
2 |
3 | import XPress.DatatypeControl.*;
4 | import XPress.DatatypeControl.ValueHandler.XMLDoubleHandler;
5 |
6 | @Datatype
7 | public class XMLDouble extends XMLNumeric implements XMLComparable, XMLSimple, XMLAtomic {
8 | static XMLDouble instance;
9 |
10 | XMLDouble() {
11 | valueHandler = new XMLDoubleHandler();
12 | officialTypeName = "xs:double";
13 | }
14 |
15 | static public XMLDouble getInstance() {
16 | if(instance == null) {
17 | instance = new XMLDouble();
18 | }
19 | return instance;
20 | }
21 |
22 | @Override
23 | public XMLComparedResult compare(String baseValue, String compareValue) {
24 | Double value1 = Double.parseDouble(baseValue);
25 | Double value2 = Double.parseDouble(compareValue);
26 | return compareT(value1, value2);
27 | }
28 |
29 | @Override
30 | public String getDefiniteGreater(String baseValue) {
31 | Double value = Double.parseDouble(baseValue);
32 | Double valueAdd = Double.parseDouble(valueHandler.getValue(false));
33 | return Double.toString(value + valueAdd);
34 | }
35 |
36 | @Override
37 | public String getDefiniteLess(String baseValue) {
38 | Double value = Double.parseDouble(baseValue);
39 | Double valueMinus = Double.parseDouble(valueHandler.getValue(false));
40 | return Double.toString(value - valueMinus);
41 | }
42 | }
43 |
--------------------------------------------------------------------------------
/src/main/java/XPress/XPathGeneration/LogicTree/InformationTree/InformationTreeFunctionNode/ConcatFunctionNode.java:
--------------------------------------------------------------------------------
1 | package XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode;
2 |
3 | import XPress.DatatypeControl.PrimitiveDatatype.XMLString;
4 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeConstantNode;
5 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeNode;
6 |
7 | @FunctionV1
8 | public class ConcatFunctionNode extends InformationTreeFunctionNode {
9 | public ConcatFunctionNode() {
10 | this.datatypeRecorder.xmlDatatype = XMLString.getInstance();
11 | functionExpr = "concat";
12 | }
13 |
14 | @Override
15 | public ConcatFunctionNode newInstance() {
16 | return new ConcatFunctionNode();
17 | }
18 |
19 | @Override
20 | protected void fillContentParameters(InformationTreeNode childNode) {
21 | if(fillContentParameterBySubRoot(XMLString.getInstance())) return;
22 | fillContentParametersRandom(childNode);
23 | }
24 |
25 | @Override
26 | protected void fillContentParametersRandom(InformationTreeNode childNode) {
27 | String randomString = XMLString.getInstance().getValueHandler().getValue(false);
28 | InformationTreeConstantNode constantNode = new InformationTreeConstantNode(XMLString.getInstance(), randomString);
29 | childList.add(constantNode);
30 | }
31 |
32 | @Override
33 | public Boolean checkContextAcceptability(InformationTreeNode childNode) {
34 | return childNode.datatypeRecorder.xmlDatatype instanceof XMLString;
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/src/main/java/XPress/DatatypeControl/ValueHandler/XMLDoubleHandler.java:
--------------------------------------------------------------------------------
1 | package XPress.DatatypeControl.ValueHandler;
2 |
3 | import XPress.GlobalRandom;
4 |
5 | public class XMLDoubleHandler extends PooledValueHandler {
6 |
7 | @Override
8 | String getRandomValue() {
9 | Integer pre = GlobalRandom.getInstance().nextInt(100000);
10 | Integer last = GlobalRandom.getInstance().nextInt(10000);
11 | if(pre == 0) pre = 1;
12 | if(last == 0) last = 1;
13 | String result = pre + "." + last;
14 | Double prob = GlobalRandom.getInstance().nextDouble();
15 | if(prob < 0.5)
16 | result = "-" + result;
17 | return result;
18 | }
19 |
20 | @Override
21 | public String mutateValue(String baseString) {
22 | double prob = 0.3;
23 | double prob2 = GlobalRandom.getInstance().nextDouble();
24 | String result = "";
25 | if(prob < 0.3) {
26 | Integer pre = GlobalRandom.getInstance().nextInt(100);
27 | Integer last = GlobalRandom.getInstance().nextInt(100);
28 | if(pre == 0) pre = 1;
29 | if(last == 0) last = 1;
30 | String delta = pre + "." + last;
31 | if(prob2 < 0.5)
32 | delta = "-" + delta;
33 | result = Double.toString(Double.parseDouble(baseString) + Double.parseDouble(delta));
34 | }
35 | else {
36 | Double value = Double.parseDouble(getRandomValueFromPool());
37 | if(prob2 < 0.5)
38 | value = -value;
39 | result = Double.toString(Double.parseDouble(baseString) + value);
40 | }
41 | return result;
42 | }
43 | }
44 |
--------------------------------------------------------------------------------
/src/main/java/XPress/XPathGeneration/LogicTree/InformationTree/InformationTreeFunctionNode/InformationTreeDirectContentFunctionNode/HasChildrenFunctionNode.java:
--------------------------------------------------------------------------------
1 | package XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode.InformationTreeDirectContentFunctionNode;
2 |
3 | import XPress.DatatypeControl.PrimitiveDatatype.XMLBoolean;
4 | import XPress.DatatypeControl.PrimitiveDatatype.XMLNode;
5 | import XPress.DatatypeControl.PrimitiveDatatype.XMLSequence;
6 | import XPress.GlobalSettings;
7 | import XPress.ReportGeneration.KnownBugs;
8 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode.FunctionV3;
9 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeNode;
10 |
11 | @FunctionV3
12 | public class HasChildrenFunctionNode extends InformationTreeDirectContentFunctionNode {
13 | public HasChildrenFunctionNode() {
14 | functionExpr = "has-children";
15 | }
16 |
17 | @Override
18 | protected void fillContentParametersRandom(InformationTreeNode childNode) {
19 | if(childNode.datatypeRecorder.xmlDatatype instanceof XMLNode) {
20 | datatypeRecorder.xmlDatatype = XMLBoolean.getInstance();
21 | }
22 | else {
23 | datatypeRecorder.xmlDatatype = XMLSequence.getInstance();
24 | datatypeRecorder.subDatatype = XMLBoolean.getInstance();
25 | }
26 | }
27 |
28 | @Override
29 | public Boolean checkContextAcceptability(InformationTreeNode childNode) {
30 | if(KnownBugs.basex2213) return false;
31 | return super.checkContextAcceptability(childNode);
32 | }
33 |
34 | @Override
35 | public HasChildrenFunctionNode newInstance() {
36 | return new HasChildrenFunctionNode();
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/src/main/java/XPress/XPathGeneration/LogicTree/InformationTree/InformationTreeFunctionNode/InformationTreeSequenceFunctionNode/InformationTreeSequenceAggregationFunctionNode/CountFunctionNode.java:
--------------------------------------------------------------------------------
1 | package XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode.InformationTreeSequenceFunctionNode.InformationTreeSequenceAggregationFunctionNode;
2 |
3 | import XPress.DatatypeControl.PrimitiveDatatype.XMLInteger;
4 | import XPress.GlobalSettings;
5 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeContextNode;
6 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode.FunctionV1;
7 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode.InformationTreeDirectContentFunctionNode.InformationTreeDirectContentFunctionNode;
8 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeNode;
9 |
10 | @FunctionV1
11 | public class CountFunctionNode extends InformationTreeSequenceAggregationFunctionNode {
12 | public CountFunctionNode() {
13 | functionExpr = "count";
14 | datatypeRecorder.xmlDatatype = XMLInteger.getInstance();
15 | }
16 |
17 | @Override
18 | public Boolean checkContextAcceptability(InformationTreeNode childNode) {
19 | boolean result = super.checkContextAcceptability(childNode);
20 | if(result && GlobalSettings.xPathVersion == GlobalSettings.XPathVersion.VERSION_1) {
21 | if(childNode instanceof InformationTreeContextNode) return true;
22 | return childNode instanceof InformationTreeDirectContentFunctionNode;
23 | }
24 | return result;
25 | }
26 |
27 |
28 | @Override
29 | public CountFunctionNode newInstance() {
30 | return new CountFunctionNode();
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/src/main/java/XPress/XPathGeneration/LogicTree/InformationTree/InformationTreeFunctionNode/IntegerModFunctionNode.java:
--------------------------------------------------------------------------------
1 | package XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode;
2 |
3 | import XPress.DatatypeControl.PrimitiveDatatype.XMLInteger;
4 | import XPress.GlobalRandom;
5 | import XPress.DatatypeControl.ValueHandler.XMLIntegerHandler;
6 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeConstantNode;
7 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeNode;
8 | @FunctionV3
9 | public class IntegerModFunctionNode extends BinaryNumericalOperatorFunctionNode {
10 | public IntegerModFunctionNode() {
11 | datatypeRecorder.xmlDatatype = XMLInteger.getInstance();
12 | functionExpr = "mod";
13 | priorityLevel = 3;
14 | }
15 |
16 | @Override
17 | protected void fillContentParameters(InformationTreeNode childNode) {
18 | fillContentParametersRandom(childNode);
19 | }
20 |
21 | @Override
22 | protected void fillContentParametersRandom(InformationTreeNode childNode) {
23 | String value = null;
24 | value = ((XMLIntegerHandler) XMLInteger.getInstance().getValueHandler()).
25 | getRandomValueBounded(Integer.MAX_VALUE / 2) + 1;
26 | double prob = GlobalRandom.getInstance().nextDouble();
27 | if(prob < 0.5) value = "-" + value;
28 | childList.add(new InformationTreeConstantNode(XMLInteger.getInstance(), value));
29 | }
30 |
31 | @Override
32 | public IntegerModFunctionNode newInstance() {
33 | return new IntegerModFunctionNode();
34 | }
35 |
36 | @Override
37 | public Boolean checkContextAcceptability(InformationTreeNode childNode) {
38 | return childNode.datatypeRecorder.xmlDatatype instanceof XMLInteger;
39 | }
40 | }
41 |
--------------------------------------------------------------------------------
/scripts/evaluation_get2.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | base_dir=$1
4 | configs=("s_r" "p_nr" "p_r" "s_nr")
5 | number=1
6 | generators=("Com" "XQGen" "XPress")
7 |
8 | for i in $(eval echo {1..$2} ); do
9 | for generator in ${generators[@]};
10 | do
11 | for config in ${configs[@]};
12 | do
13 | echo docker run -e EVAL_TYPE=2 -e CONFIG=$config -e TIME=$3 -e GEN=$generator --name ${config}_${generator}_2 -d xpress_eval:latest &
14 | docker run -e EVAL_TYPE=2 -e CONFIG=$config -e TIME=$3 -e GEN=$generator --name ${config}_${generator}_2 -d xpress_eval:latest &
15 | if [ $generator != "XPress" ]; then
16 | break
17 | fi
18 | done
19 |
20 | sleep 5
21 | done
22 | for generator in ${generators[@]};
23 | do
24 | for config in ${configs[@]};
25 | do
26 | echo docker wait ${config}_${generator}_2
27 | docker wait ${config}_${generator}_2
28 | if [ $generator != "XPress" ]; then
29 | break
30 | fi
31 | done
32 | done
33 | mkdir -p $base_dir/$number
34 | for generator in ${generators[@]};
35 | do
36 | for config in ${configs[@]};
37 | do
38 | docker cp ${config}_${generator}_2:/experiment/diagnosis_${config}_${generator}_24.txt $base_dir/$number/
39 | if [ $generator != "XPress" ]; then
40 | break
41 | fi
42 | done
43 | done
44 |
45 | for generator in ${generators[@]};
46 | do
47 | for config in ${configs[@]};
48 | do
49 | docker rm ${config}_${generator}_2
50 | if [ $generator != "XPress" ]; then
51 | break
52 | fi
53 | done
54 | done
55 | number=$(($number + 1))
56 | done
--------------------------------------------------------------------------------
/src/main/java/XPress/XPathGeneration/LogicTree/InformationTree/InformationTreeFunctionNode/InformationTreeSequenceFunctionNode/SortFunctionNode.java:
--------------------------------------------------------------------------------
1 | package XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode.InformationTreeSequenceFunctionNode;
2 |
3 | import XPress.DatatypeControl.PrimitiveDatatype.XMLQName;
4 | import XPress.DatatypeControl.XMLSimple;
5 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode.FunctionV3;
6 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode.MapFunctionNode;
7 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeNode;
8 |
9 | @FunctionV3
10 | public class SortFunctionNode extends InformationTreeSequenceFunctionNode {
11 |
12 | public SortFunctionNode() {
13 | functionExpr = "sort";
14 | }
15 |
16 | @Override
17 | public SortFunctionNode newInstance() {
18 | return new SortFunctionNode();
19 | }
20 |
21 | @Override
22 | public Boolean checkContextAcceptability(InformationTreeNode childNode) {
23 | if(childNode instanceof MapFunctionNode)
24 | if(((MapFunctionNode) childNode).mixAttrFlag)
25 | return false;
26 | if(!(childNode.datatypeRecorder.getActualDatatype() instanceof XMLSimple))
27 | return false;
28 | if(childNode.datatypeRecorder.getActualDatatype() instanceof XMLQName)
29 | return false;
30 | try {
31 | childNode.contextInfo.mainExecutor.setReportLock();
32 | childNode.contextInfo.mainExecutor.executeSingleProcessor("sort(" + childNode.getCalculationString() + ")");
33 | } catch (Exception e) {
34 | if(childNode.contextInfo.mainExecutor != null)
35 | childNode.contextInfo.mainExecutor.unlockReportLock();
36 | return false;
37 | }
38 | return true;
39 | }
40 | }
41 |
--------------------------------------------------------------------------------
/src/main/java/XPress/XPathGeneration/LogicTree/InformationTree/InformationTreeFunctionNode/BinaryNumericalOperatorFunctionNode.java:
--------------------------------------------------------------------------------
1 | package XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode;
2 |
3 | import XPress.TestException.DebugErrorException;
4 | import XPress.XPathGeneration.LogicTree.LogicTreeNode;
5 |
6 | public abstract class BinaryNumericalOperatorFunctionNode extends BinaryOperatorFunctionNode {
7 | /**
8 | * Integer which represents the priority level of the binary operator. Higher value has higher priority.
9 | * If parent operator node has higher priority level than child node, child node XPath expression has to be
10 | * wrapped by parentheses.
11 | */
12 | int priorityLevel;
13 | @Override
14 | public String getXPathExpression(boolean returnConstant, LogicTreeNode parentNode, boolean calculateString) throws DebugErrorException {
15 | String returnString = getXPathExpressionCheck(returnConstant, parentNode, calculateString);
16 | if(returnString != null) {
17 | return binaryWrap(returnString, parentNode);
18 | }
19 | returnString = childList.get(0).getXPathExpression(returnConstant, this, calculateString) + " " + functionExpr + " " +
20 | childList.get(1).getXPathExpression(returnConstant, this, calculateString);
21 | cacheXPathExpression(returnString, returnConstant, calculateString);
22 | return binaryWrap(returnString, parentNode);
23 | }
24 |
25 | @Override
26 | public String binaryWrap(String resultString, LogicTreeNode parentNode) {
27 | if(parentNode != null) {
28 | if(!(parentNode instanceof BinaryNumericalOperatorFunctionNode &&
29 | ((BinaryNumericalOperatorFunctionNode) parentNode).priorityLevel > priorityLevel))
30 | resultString = "(" + resultString + ")";
31 | }
32 | return resultString;
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/src/main/java/XPress/XPathGeneration/LogicTree/InformationTree/InformationTreeFunctionNode/InformationTreeDirectContentFunctionNode/LastFunctionNode.java:
--------------------------------------------------------------------------------
1 | package XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode.InformationTreeDirectContentFunctionNode;
2 |
3 | import XPress.DatatypeControl.PrimitiveDatatype.XMLInteger;
4 | import XPress.DatatypeControl.PrimitiveDatatype.XMLNode;
5 | import XPress.DatatypeControl.PrimitiveDatatype.XMLSequence;
6 | import XPress.TestException.DebugErrorException;
7 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode.FunctionV3;
8 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeNode;
9 | import XPress.XPathGeneration.LogicTree.LogicTreeNode;
10 |
11 | @FunctionV3
12 | public class LastFunctionNode extends InformationTreeDirectContentFunctionNode {
13 | public LastFunctionNode() {
14 | functionExpr = "last";
15 | }
16 |
17 | @Override
18 | public String getCalculationString(LogicTreeNode parentNode, boolean checkImpact) throws DebugErrorException {
19 | if(datatypeRecorder.xmlDatatype instanceof XMLSequence) {
20 | return super.getCalculationString(parentNode, checkImpact);
21 | }
22 | return "count(" + childList.get(0).getCalculationString(parentNode, false) + ")";
23 | }
24 |
25 | @Override
26 | public LastFunctionNode newInstance() {
27 | return new LastFunctionNode();
28 | }
29 |
30 | @Override
31 | protected void fillContentParametersRandom(InformationTreeNode childNode) {
32 | childList.add(childNode);
33 | if(childNode.datatypeRecorder.xmlDatatype instanceof XMLNode) {
34 | datatypeRecorder.xmlDatatype = XMLInteger.getInstance();
35 | }
36 | else {
37 | datatypeRecorder.xmlDatatype = XMLSequence.getInstance();
38 | datatypeRecorder.subDatatype = XMLInteger.getInstance();
39 | }
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/src/main/java/XPress/DatatypeControl/XMLDatatypeComplexRecorder.java:
--------------------------------------------------------------------------------
1 | package XPress.DatatypeControl;
2 |
3 | import XPress.DatatypeControl.PrimitiveDatatype.XMLDatatype;
4 | import XPress.DatatypeControl.PrimitiveDatatype.XMLSequence;
5 |
6 | public class XMLDatatypeComplexRecorder {
7 | /**
8 | * Datatype of result of the current information tree node
9 | */
10 | public XMLDatatype xmlDatatype = null;
11 |
12 | /**
13 | * If tree node represents a sequence, denotes the datatype of the elements in sequence
14 | */
15 | public XMLDatatype subDatatype = null;
16 |
17 | /**
18 | * Only for check usage with a list of nodes. Evaluates to false only if all nodes in sequence (not only for starred node)
19 | * is ensured has the same dataType. (Also applies when type is single node(Refers to the original context)).
20 | */
21 | public boolean nodeMix = true;
22 |
23 | public XMLDatatypeComplexRecorder(XMLDatatype xmlDatatype) {
24 | this.xmlDatatype = xmlDatatype;
25 | }
26 |
27 | public XMLDatatypeComplexRecorder(XMLDatatypeComplexRecorder prevRecorder) {
28 | setData(prevRecorder.xmlDatatype, prevRecorder.subDatatype, prevRecorder.nodeMix);
29 | }
30 |
31 | public XMLDatatypeComplexRecorder() {}
32 |
33 | public XMLDatatypeComplexRecorder(XMLDatatype xmlDatatype, XMLDatatype subDatatype, boolean nodeMix) {
34 | setData(xmlDatatype, subDatatype, nodeMix);
35 | }
36 |
37 | public void setData(XMLDatatype xmlDatatype) {
38 | this.xmlDatatype = xmlDatatype;
39 | }
40 |
41 | public void setData(XMLDatatype xmlDatatype, XMLDatatype subDatatype, boolean nodeMix) {
42 | this.xmlDatatype = xmlDatatype;
43 | this.subDatatype = subDatatype;
44 | this.nodeMix = nodeMix;
45 | }
46 |
47 | public XMLDatatype getActualDatatype() {
48 | if(xmlDatatype instanceof XMLSequence) return subDatatype;
49 | return xmlDatatype;
50 | }
51 | }
52 |
--------------------------------------------------------------------------------
/src/test/java/XPress/XPathGeneration/SequenceGeneratorTest.java:
--------------------------------------------------------------------------------
1 | package XPress.XPathGeneration;
2 |
3 | import XPress.DatabaseExecutor.*;
4 | import XPress.GlobalRandom;
5 | import XPress.XMLGeneration.ContextNode;
6 | import XPress.XMLGeneration.XMLDocumentGenerator;
7 | import org.junit.jupiter.api.BeforeEach;
8 | import org.junit.jupiter.api.Test;
9 |
10 | import java.util.ArrayList;
11 | import java.util.List;
12 |
13 | public class SequenceGeneratorTest {
14 |
15 | List contextNodeList = new ArrayList<>();
16 | MainExecutor mainExecutor = new MainExecutor();
17 | int totalContextNode = 10;
18 | List currentContextNodeList = new ArrayList<>();
19 | SequenceGenerator sequenceGenerator;
20 |
21 | @BeforeEach
22 | public void init() {
23 | XMLDocumentGenerator xmlDocumentGenerator = new XMLDocumentGenerator();
24 | ContextNode root = xmlDocumentGenerator.generateXMLDocument(totalContextNode);
25 | getNodes(root);
26 | List extraLeafNodes = xmlDocumentGenerator.generateExtraLeafNodes(10);
27 | mainExecutor.extraLeafNodeList = extraLeafNodes;
28 |
29 | List currentContextIdList = GlobalRandom.getInstance().nextIntListNoRep(
30 | GlobalRandom.getInstance().nextInt(totalContextNode) + 1, totalContextNode);
31 | for(Integer id : currentContextIdList)
32 | currentContextNodeList.add(contextNodeList.get(id));
33 |
34 | sequenceGenerator = new SequenceGenerator(mainExecutor);
35 | }
36 |
37 | public void getNodes(ContextNode currentNode) {
38 | contextNodeList.add(currentNode);
39 | for(ContextNode childNode : currentNode.childList)
40 | getNodes(childNode);
41 | }
42 |
43 | @Test
44 | void generateNodeSequenceFromContext() {
45 | String nodeSequence = sequenceGenerator.generateNodeSequenceFromContext(5, currentContextNodeList);
46 | System.out.println(nodeSequence);
47 | }
48 | }
49 |
--------------------------------------------------------------------------------
/src/main/java/XPress/XPathGeneration/LogicTree/InformationTree/InformationTreeFunctionNode/InformationTreeDirectContentFunctionNode/PositionFunctionNode.java:
--------------------------------------------------------------------------------
1 | package XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode.InformationTreeDirectContentFunctionNode;
2 |
3 | import XPress.DatatypeControl.PrimitiveDatatype.XMLInteger;
4 | import XPress.DatatypeControl.PrimitiveDatatype.XMLNode;
5 | import XPress.DatatypeControl.PrimitiveDatatype.XMLSequence;
6 | import XPress.TestException.DebugErrorException;
7 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode.FunctionV3;
8 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeNode;
9 | import XPress.XPathGeneration.LogicTree.LogicTreeNode;
10 |
11 | @FunctionV3
12 | public class PositionFunctionNode extends InformationTreeDirectContentFunctionNode {
13 | public PositionFunctionNode() {
14 | functionExpr = "position";
15 | }
16 |
17 | @Override
18 | public String getCalculationString(LogicTreeNode parentNode, boolean checkImpact) throws DebugErrorException {
19 | if(datatypeRecorder.xmlDatatype instanceof XMLSequence) {
20 | return super.getCalculationString(parentNode, checkImpact);
21 | }
22 | return "index-of((" + childList.get(0).getContextCalculationString() + ")/@id, \"" + childList.get(0).getContext().context + "\")";
23 | }
24 |
25 | @Override
26 | protected void fillContentParametersRandom(InformationTreeNode childNode) {
27 | if(childNode.datatypeRecorder.xmlDatatype instanceof XMLNode) {
28 | datatypeRecorder.xmlDatatype = XMLInteger.getInstance();
29 | }
30 | else {
31 | datatypeRecorder.xmlDatatype = XMLSequence.getInstance();
32 | datatypeRecorder.subDatatype = XMLInteger.getInstance();
33 | }
34 | }
35 |
36 | @Override
37 | public PositionFunctionNode newInstance() {
38 | return new PositionFunctionNode();
39 | }
40 | }
41 |
--------------------------------------------------------------------------------
/src/main/java/XPress/XPathGeneration/LogicTree/InformationTree/InformationTreeFunctionNode/SubstringBeforeFunctionNode.java:
--------------------------------------------------------------------------------
1 | package XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode;
2 |
3 | import XPress.DatatypeControl.PrimitiveDatatype.XMLString;
4 | import XPress.GlobalRandom;
5 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeConstantNode;
6 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeNode;
7 |
8 | @FunctionV1
9 | public class SubstringBeforeFunctionNode extends InformationTreeFunctionNode {
10 | private String internalStr = null;
11 | public SubstringBeforeFunctionNode() {
12 | datatypeRecorder.xmlDatatype = XMLString.getInstance();
13 | functionExpr = "substring-before";
14 | }
15 |
16 | @Override
17 | protected void fillContentParameters(InformationTreeNode childNode) {
18 | internalStr = GlobalRandom.getInstance().nextSubstring(childList.get(0).getContext().context);
19 | fillContentParametersWithStr(childNode);
20 | }
21 |
22 | @Override
23 | protected void fillContentParametersRandom(InformationTreeNode childNode) {
24 | internalStr = XMLString.getInstance().getValueHandler().getValue(false);
25 | fillContentParametersWithStr(childNode);
26 | }
27 |
28 | private void fillContentParametersWithStr(InformationTreeNode childNode) {
29 | double prob = GlobalRandom.getInstance().nextDouble();
30 | if(prob < 0.1)
31 | internalStr = "";
32 | childList.add(new InformationTreeConstantNode(XMLString.getInstance(), internalStr));
33 | internalStr = null;
34 | }
35 |
36 | @Override
37 | public Boolean checkContextAcceptability(InformationTreeNode childNode) {
38 | return childNode.datatypeRecorder.xmlDatatype instanceof XMLString;
39 | }
40 |
41 | @Override
42 | public SubstringBeforeFunctionNode newInstance() {
43 | return new SubstringBeforeFunctionNode();
44 | }
45 | }
46 |
--------------------------------------------------------------------------------
/scripts/evaluation_get.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | base_dir=$1
4 | configs=("s_r" "p_nr" "p_r" "s_nr" )
5 | generators=("Com" "XQGen" "XPress")
6 | number=1
7 |
8 | for i in $(eval echo {1..$2} ); do
9 | for generator in ${generators[@]};
10 | do
11 | for config in ${configs[@]};
12 | do
13 | echo docker run -e EVAL_TYPE=1 -e CONFIG=$config -e TIME=$3 -e GEN=$generator --name ${config}_${generator}_1 -d xpress_eval:latest &
14 | docker run -e EVAL_TYPE=1 -e CONFIG=$config -e TIME=$3 -e GEN=$generator --name ${config}_${generator}_1 -d xpress_eval:latest &
15 | if [ $generator != "XPress" ]; then
16 | break
17 | fi
18 | done
19 | done
20 | sleep 5
21 | for generator in ${generators[@]};
22 | do
23 | for config in ${configs[@]};
24 | do
25 | echo docker wait ${config}_${generator}_1
26 | docker wait ${config}_${generator}_1
27 | if [ $generator != "XPress" ]; then
28 | break
29 | fi
30 | done
31 | done
32 | mkdir -p $base_dir/$number
33 | for generator in ${generators[@]};
34 | do
35 | for config in ${configs[@]};
36 | do
37 | docker cp ${config}_${generator}_1:/experiment/evaluation_${config}_${generator}_24.txt $base_dir/$number/
38 | docker cp ${config}_${generator}_1:/experiment/report_${config}_${generator}_24.txt $base_dir/$number/
39 | docker cp ${config}_${generator}_1:/experiment/log.out $base_dir/$number/
40 | if [ $generator != "XPress" ]; then
41 | break
42 | fi
43 | done
44 | done
45 | for generator in ${generators[@]};
46 | do
47 | for config in ${configs[@]};
48 | do
49 | docker rm ${config}_${generator}_1
50 | if [ $generator != "XPress" ]; then
51 | break
52 | fi
53 | done
54 | done
55 | number=$(($number + 1))
56 | done
--------------------------------------------------------------------------------
/src/main/java/XPress/XPathGeneration/LogicTree/InformationTree/InformationTreeFunctionNode/SubstringAfterFunctionNode.java:
--------------------------------------------------------------------------------
1 | package XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode;
2 |
3 | import XPress.DatatypeControl.PrimitiveDatatype.XMLString;
4 | import XPress.GlobalRandom;
5 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeConstantNode;
6 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeNode;
7 |
8 | @FunctionV1
9 | public class SubstringAfterFunctionNode extends InformationTreeFunctionNode {
10 | private String internalStr = null;
11 | public SubstringAfterFunctionNode() {
12 | datatypeRecorder.xmlDatatype = XMLString.getInstance();
13 | functionExpr = "substring-after";
14 | }
15 |
16 | @Override
17 | protected void fillContentParameters(InformationTreeNode childNode) {
18 | String subString = GlobalRandom.getInstance().nextSubstring(childList.get(0).getContext().context);
19 | internalStr = subString;
20 | fillContentParametersWithStr(childNode);
21 | }
22 |
23 | @Override
24 | protected void fillContentParametersRandom(InformationTreeNode childNode) {
25 | String subString = XMLString.getInstance().getValueHandler().getValue(false);
26 | internalStr = subString;
27 | fillContentParametersWithStr(childNode);
28 | }
29 |
30 | private void fillContentParametersWithStr(InformationTreeNode childNode) {
31 | double prob = GlobalRandom.getInstance().nextDouble();
32 | if(prob < 0.1)
33 | internalStr = "";
34 | childList.add(new InformationTreeConstantNode(XMLString.getInstance(), internalStr));
35 | internalStr = null;
36 | }
37 | @Override
38 | public SubstringAfterFunctionNode newInstance() {
39 | return new SubstringAfterFunctionNode();
40 | }
41 |
42 | @Override
43 | public Boolean checkContextAcceptability(InformationTreeNode childNode) {
44 | return childNode.datatypeRecorder.xmlDatatype instanceof XMLString;
45 | }
46 | }
47 |
--------------------------------------------------------------------------------
/src/main/java/XPress/XPathGeneration/LogicTree/LogicTreeComparisonNode.java:
--------------------------------------------------------------------------------
1 | package XPress.XPathGeneration.LogicTree;
2 |
3 | import XPress.DatatypeControl.PrimitiveDatatype.XMLBoolean;
4 | import XPress.GlobalRandom;
5 | import XPress.TestException.DebugErrorException;
6 |
7 | import java.util.ArrayList;
8 | import java.util.List;
9 |
10 | public abstract class LogicTreeComparisonNode extends LogicTreeNode {
11 | List childList = new ArrayList<>();
12 | static List candidateList = new ArrayList<>();
13 | String funcExpr;
14 |
15 | {
16 | datatypeRecorder.xmlDatatype = XMLBoolean.getInstance();
17 | }
18 |
19 | static {
20 | candidateList.add(new LogicTreeAndComparisonNode());
21 | candidateList.add(new LogicTreeOrComparisonNode());
22 | }
23 |
24 | @Override
25 | abstract public LogicTreeComparisonNode newInstance();
26 |
27 | public static LogicTreeComparisonNode getRandomCandidate() {
28 | return GlobalRandom.getInstance().getRandomFromList(candidateList);
29 | }
30 |
31 | public void fillContents(LogicTreeNode nodeA, LogicTreeNode nodeB) {
32 | childList.add(nodeA);
33 | childList.add(nodeB);
34 | contextInfo = new LogicTreeContextInfo(nodeA.contextInfo);
35 | }
36 |
37 | @Override
38 | public String getXPathExpression(boolean returnConstant, LogicTreeNode parentNode, boolean calculateString) throws DebugErrorException {
39 | if(returnConstant && getContext().context != null) return getContext().context;
40 | String returnString = childList.get(0).getXPathExpression(returnConstant, this, calculateString)
41 | + " " + funcExpr + " " + childList.get(1).getXPathExpression(returnConstant, this, calculateString);
42 | if(parentNode instanceof LogicTreeComparisonNode) {
43 | returnString = "(" + returnString + ")";
44 | }
45 | return returnString;
46 | }
47 |
48 | @Override
49 | public List getChildList() {
50 | return childList;
51 | }
52 | }
53 |
--------------------------------------------------------------------------------
/src/main/java/XPress/XPathGeneration/LogicTree/InformationTree/InformationTreeFunctionNode/ContainsTokenFunctionNode.java:
--------------------------------------------------------------------------------
1 | package XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode;
2 |
3 | import XPress.DatatypeControl.PrimitiveDatatype.XMLBoolean;
4 | import XPress.DatatypeControl.PrimitiveDatatype.XMLString;
5 | import XPress.GlobalRandom;
6 | import XPress.DatatypeControl.ValueHandler.XMLStringHandler;
7 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeConstantNode;
8 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeNode;
9 |
10 | import java.util.Arrays;
11 | import java.util.List;
12 |
13 | @FunctionV3
14 | public class ContainsTokenFunctionNode extends InformationTreeFunctionNode {
15 | ContainsTokenFunctionNode() {
16 | datatypeRecorder.xmlDatatype = XMLBoolean.getInstance();
17 | functionExpr = "contains-token";
18 | }
19 |
20 | @Override
21 | public ContainsTokenFunctionNode newInstance() {
22 | return new ContainsTokenFunctionNode();
23 | }
24 |
25 | @Override
26 | protected void fillContentParameters(InformationTreeNode childNode) {
27 | List subStringList = Arrays.stream(childList.get(0).getContext().context.split("\\s+")).toList();
28 | if(subStringList.size() == 0)
29 | fillContentParametersRandom(childNode);
30 | else childList.add(new InformationTreeConstantNode(XMLString.getInstance(), GlobalRandom.getInstance().getRandomFromList(subStringList)));
31 | }
32 |
33 | @Override
34 | protected void fillContentParametersRandom(InformationTreeNode childNode) {
35 | String subString = ((XMLStringHandler) XMLString.getInstance().getValueHandler()).getRandomValue(
36 | GlobalRandom.getInstance().nextInt(5) + 1);
37 | childList.add(new InformationTreeConstantNode(XMLString.getInstance(), subString));
38 | }
39 |
40 | @Override
41 | public Boolean checkContextAcceptability(InformationTreeNode childNode) {
42 | return childNode.datatypeRecorder.xmlDatatype instanceof XMLString;
43 | }
44 | }
45 |
--------------------------------------------------------------------------------
/scripts/cal_avg.py:
--------------------------------------------------------------------------------
1 | import os
2 | import sys
3 | root_dir = sys.argv[1]
4 | final_dict = {
5 | 's_r': [],
6 | 's_nr': [],
7 | 'p_r': [],
8 | 'p_nr': [],
9 | }
10 |
11 | tem_dict = {
12 | 'total-query-cnt':0,
13 | 'discrepancy-total':0,
14 | 'discrepancy-section-total':0,
15 | 'reduced-cnt':0,
16 | 'avg-length-after-reduce':0,
17 | }
18 |
19 | evaluation_dict = {
20 | 's_r': tem_dict.copy(),
21 | 's_nr': tem_dict.copy(),
22 | 'p_r': tem_dict.copy(),
23 | 'p_nr': tem_dict.copy(),
24 | }
25 |
26 | config_list = ['s_r', 's_nr', 'p_r', 'p_nr']
27 | generator_list=["XPress"]
28 |
29 | for i in range(1, int(sys.argv[2]) + 1):
30 | result_dir = root_dir + "/" + str(i) + "/"
31 | results = open(result_dir + "final.txt", 'r').read().splitlines()
32 | for result in results:
33 | data_list = result.split(' ')
34 | for data in data_list:
35 | if('_' in data):
36 | config = data
37 | id = 0
38 | else:
39 | if(len(final_dict[config]) <= id):
40 | final_dict[config].append(0)
41 | final_dict[config][id] += int(data)
42 | id += 1
43 | for config in config_list:
44 | for generator in generator_list:
45 | results = open(result_dir + "evaluation_" + config + "_" + generator + "_24.txt").read().splitlines()
46 | for j in range(len(results)):
47 | if(j == 0):
48 | continue
49 | result = results[j].split(':')
50 | evaluation_dict[config][result[0]] += 0 if result[1] == 'NaN' else int(result[1])
51 |
52 | result_file = open("result.txt", "w")
53 | for key in final_dict:
54 | print(key, end = "")
55 | result_file.write(key)
56 | for result in final_dict[key]:
57 | print("," + str(result / 10), end = "")
58 | result_file.write("," + str(result / 10))
59 | result_file.write("\n")
60 | print("")
61 |
62 | for key in evaluation_dict:
63 | print(key)
64 | for result_key in evaluation_dict[key]:
65 | print(result_key, evaluation_dict[key][result_key] / 10)
--------------------------------------------------------------------------------
/src/main/java/XPress/XPathGeneration/LogicTree/InformationTree/InformationTreeFunctionNode/TranslateFunctionNode.java:
--------------------------------------------------------------------------------
1 | package XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode;
2 |
3 | import XPress.DatatypeControl.PrimitiveDatatype.XMLString;
4 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeConstantNode;
5 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeNode;
6 |
7 | @FunctionV1
8 | public class TranslateFunctionNode extends InformationTreeFunctionNode {
9 | public TranslateFunctionNode() {
10 | datatypeRecorder.xmlDatatype = XMLString.getInstance();
11 | functionExpr = "translate";
12 | }
13 |
14 | @Override
15 | protected void fillContentParameters(InformationTreeNode childNode) {;
16 | String mapStr = XMLString.getInstance().getValueHandler().mutateValue(childNode.context.context);
17 | String transStr = XMLString.getInstance().getValueHandler().getValue();
18 | InformationTreeConstantNode mapNode = new InformationTreeConstantNode(XMLString.getInstance(), mapStr);
19 | InformationTreeConstantNode transNode = new InformationTreeConstantNode(XMLString.getInstance(), transStr);
20 | childList.add(mapNode);
21 | childList.add(transNode);
22 | }
23 |
24 | @Override
25 | protected void fillContentParametersRandom(InformationTreeNode childNode) {
26 | String mapStr = XMLString.getInstance().getValueHandler().getValue();
27 | String transStr = XMLString.getInstance().getValueHandler().getValue();
28 | InformationTreeConstantNode mapNode = new InformationTreeConstantNode(XMLString.getInstance(), mapStr);
29 | InformationTreeConstantNode transNode = new InformationTreeConstantNode(XMLString.getInstance(), transStr);
30 | childList.add(mapNode);
31 | childList.add(transNode);
32 | }
33 |
34 | @Override
35 | public Boolean checkContextAcceptability(InformationTreeNode childNode) {
36 | return childNode.datatypeRecorder.xmlDatatype instanceof XMLString;
37 | }
38 |
39 | @Override
40 | public TranslateFunctionNode newInstance() {
41 | return new TranslateFunctionNode();
42 | }
43 | }
44 |
--------------------------------------------------------------------------------
/src/main/java/XPress/DatatypeControl/PrimitiveDatatype/XMLString.java:
--------------------------------------------------------------------------------
1 | package XPress.DatatypeControl.PrimitiveDatatype;
2 |
3 | import XPress.DatatypeControl.*;
4 | import XPress.DatatypeControl.ValueHandler.XMLStringHandler;
5 | import XPress.GlobalRandom;
6 |
7 | @Datatype
8 | public class XMLString extends XMLDatatype implements XMLComparable, XMLSimple, XMLAtomic {
9 | static XMLString instance;
10 |
11 | public XMLString() {
12 | valueHandler = new XMLStringHandler();
13 | officialTypeName = "xs:string";
14 | }
15 |
16 | static public XMLString getInstance() {
17 | if(instance == null) {
18 | instance = new XMLString();
19 | }
20 | return instance;
21 | }
22 |
23 | @Override
24 | public XMLComparedResult compare(String baseValue, String compareValue) {
25 | return compareT(baseValue, compareValue);
26 | }
27 |
28 | @Override
29 | public String getDefiniteGreater(String baseValue) {
30 | double prob = GlobalRandom.getInstance().nextDouble();
31 | String compareString = null;
32 | if(prob < 0.5) {
33 | Character c = ((XMLStringHandler) valueHandler).getRandomCharacter();
34 | if(compareT(c + baseValue, baseValue) == XMLComparedResult.GREATER)
35 | compareString = c + baseValue;
36 | }
37 | if(compareString == null) {
38 | Character c = ((XMLStringHandler) valueHandler).getRandomCharacter();
39 | compareString = baseValue + c;
40 | }
41 | return compareString;
42 | }
43 |
44 | @Override
45 | public String getDefiniteLess(String baseValue) {
46 | double prob = GlobalRandom.getInstance().nextDouble();
47 | String compareString = null;
48 | if(prob < 0.5 && baseValue.length() >= 1) {
49 | compareString = baseValue.substring(1);
50 | if(compareT(baseValue, compareString) != XMLComparedResult.LESS)
51 | compareString = null;
52 | }
53 | if(compareString == null && baseValue.length() >= 1) {
54 | compareString = baseValue.substring(0, baseValue.length());
55 | }
56 | if(compareString == null)
57 | compareString = "";
58 | return compareString;
59 | }
60 | }
61 |
--------------------------------------------------------------------------------
/src/main/java/XPress/DatatypeControl/ValueHandler/PooledValueHandler.java:
--------------------------------------------------------------------------------
1 | package XPress.DatatypeControl.ValueHandler;
2 |
3 | import XPress.GlobalRandom;
4 |
5 | import java.util.*;
6 |
7 | import static XPress.XMLGeneration.DataGenerator.mutateProb;
8 | import static XPress.XMLGeneration.DataGenerator.newProb;
9 |
10 | public abstract class PooledValueHandler extends ValueHandler {
11 | int valuePoolIdCnt = 0;
12 | Set valuePool = new HashSet<>();
13 | Map valuePoolLookUpMap = new HashMap<>();
14 |
15 | abstract String getRandomValue();
16 |
17 | public String getValue() {
18 | return getValue(true);
19 | }
20 |
21 | public String getValue(boolean pooling) {
22 | boolean choice = GlobalRandom.getInstance().nextDouble() < newProb;
23 | String generatedString;
24 | if(choice) {
25 | // Generate new random value and add to pool;
26 | generatedString = getRandomValue();
27 | if(pooling) addValueToPool(getRandomValue());
28 | }
29 | else {
30 | // Get random value from original pool or from mutation
31 | boolean mutateChoice = GlobalRandom.getInstance().nextDouble() < mutateProb;
32 | String baseString = getRandomValueFromPool();
33 | if(mutateChoice) {
34 | generatedString = mutateValue(baseString);
35 | if(pooling) addValueToPool(generatedString);
36 | }
37 | else generatedString = baseString;
38 | }
39 | return generatedString;
40 | }
41 |
42 | public String getRandomValueFromPool() {
43 | if(valuePoolIdCnt == 0) {
44 | return getRandomValue();
45 | }
46 | int id = GlobalRandom.getInstance().nextInt(valuePoolIdCnt);
47 | return valuePoolLookUpMap.get(id);
48 | }
49 |
50 | void addValueToPool(String value) {
51 | if(!valuePool.contains(value)) {
52 | valuePool.add(value);
53 | valuePoolLookUpMap.put(valuePoolIdCnt, value);
54 | valuePoolIdCnt += 1;
55 | }
56 | }
57 |
58 | @Override
59 | public void clear() {
60 | valuePoolIdCnt = 0;
61 | valuePool = new HashSet<>();
62 | valuePoolLookUpMap = new HashMap<>();
63 | }
64 | }
65 |
--------------------------------------------------------------------------------
/src/main/java/XPress/XPathGeneration/LogicTree/InformationTree/InformationTreeFunctionNode/IntegerDivisionFunctionNode.java:
--------------------------------------------------------------------------------
1 | package XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode;
2 |
3 | import XPress.DatatypeControl.PrimitiveDatatype.XMLInteger;
4 | import XPress.GlobalRandom;
5 | import XPress.DatatypeControl.ValueHandler.XMLIntegerHandler;
6 | import XPress.TestException.DebugErrorException;
7 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeConstantNode;
8 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeNode;
9 |
10 | @FunctionV3
11 | public class IntegerDivisionFunctionNode extends BinaryNumericalOperatorFunctionNode {
12 | public IntegerDivisionFunctionNode() {
13 | datatypeRecorder.xmlDatatype = XMLInteger.getInstance();
14 | functionExpr = "idiv";
15 | priorityLevel = 3;
16 | }
17 |
18 | @Override
19 | protected void fillContentParameters(InformationTreeNode childNode) throws DebugErrorException {
20 | double prob = GlobalRandom.getInstance().nextDouble();
21 | String value = null;
22 | if(prob < 0.7 && Integer.parseInt(childNode.getContext().context) >= 2)
23 | value = ((XMLIntegerHandler) XMLInteger.getInstance().getValueHandler()).
24 | getRandomValueBounded(1, Integer.parseInt(childNode.getContext().context));
25 | else {
26 | value = XMLInteger.getInstance().getValueHandler().getValue(false);
27 | }
28 | if(Integer.parseInt(value) == 0)
29 | value = "2";
30 | childList.add(new InformationTreeConstantNode(XMLInteger.getInstance(), value));
31 | }
32 |
33 | @Override
34 | protected void fillContentParametersRandom(InformationTreeNode childNode) {
35 | String value = XMLInteger.getInstance().getValueHandler().getValue(false);
36 | childList.add(new InformationTreeConstantNode(XMLInteger.getInstance(), value));
37 | }
38 |
39 | @Override
40 | public Boolean checkContextAcceptability(InformationTreeNode childNode) {
41 | return childNode.datatypeRecorder.xmlDatatype instanceof XMLInteger;
42 | }
43 |
44 | @Override
45 | public IntegerDivisionFunctionNode newInstance() {
46 | return new IntegerDivisionFunctionNode();
47 | }
48 | }
49 |
--------------------------------------------------------------------------------
/src/main/java/XPress/XPathGeneration/LogicTree/InformationTree/InformationTreeFunctionNode/DoubleDivisionFunctionNode.java:
--------------------------------------------------------------------------------
1 | package XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode;
2 |
3 | import XPress.DatatypeControl.PrimitiveDatatype.XMLDouble;
4 | import XPress.GlobalRandom;
5 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeConstantNode;
6 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeNode;
7 |
8 | import static java.lang.Math.abs;
9 |
10 | @FunctionV1
11 | public class DoubleDivisionFunctionNode extends BinaryNumericalOperatorFunctionNode {
12 | public DoubleDivisionFunctionNode() {
13 | this.datatypeRecorder.xmlDatatype = XMLDouble.getInstance();
14 | priorityLevel = 3;
15 | functionExpr = "div";
16 | }
17 |
18 | @Override
19 | protected void fillContentParameters(InformationTreeNode childNode) {
20 | double currentValue = Double.parseDouble(childNode.getContext().context);
21 | if(abs(currentValue) > 10) {
22 | fillContentParametersRandom(childNode);
23 | return;
24 | }
25 | double divisionValue = GlobalRandom.getInstance().nextDouble() + 0.5;
26 | if(divisionValue > 1.2) divisionValue = 1;
27 | String divisionValueStr = Double.toString(divisionValue);
28 | childList.add(new InformationTreeConstantNode(XMLDouble.getInstance(), divisionValueStr));
29 | }
30 |
31 | @Override
32 | protected void fillContentParametersRandom(InformationTreeNode childNode) {
33 | Integer pre = GlobalRandom.getInstance().nextInt(10);
34 | Integer last = GlobalRandom.getInstance().nextInt(10);
35 | if(last == 0) last = 1;
36 | double divisionValue = Double.parseDouble(pre + "." + last);
37 | String divisionValueStr = Double.toString(divisionValue);
38 | childList.add(new InformationTreeConstantNode(XMLDouble.getInstance(), divisionValueStr));
39 | }
40 |
41 | @Override
42 | public DoubleDivisionFunctionNode newInstance() {
43 | return new DoubleDivisionFunctionNode();
44 | }
45 |
46 | @Override
47 | public Boolean checkContextAcceptability(InformationTreeNode childNode) {
48 | return childNode.datatypeRecorder.xmlDatatype instanceof XMLDouble;
49 | }
50 | }
51 |
--------------------------------------------------------------------------------
/src/main/java/XPress/DatatypeControl/ValueHandler/XMLIntegerHandler.java:
--------------------------------------------------------------------------------
1 | package XPress.DatatypeControl.ValueHandler;
2 |
3 | import XPress.DataCheckUtils;
4 | import XPress.DatatypeControl.PrimitiveDatatype.XMLDatatype;
5 | import XPress.GlobalRandom;
6 | import org.apache.commons.lang3.tuple.Pair;
7 |
8 | public class XMLIntegerHandler extends PooledValueHandler {
9 |
10 | @Override
11 | String getRandomValue() {
12 | return Integer.toString(GlobalRandom.getInstance().nextInt());
13 | }
14 |
15 | public String getRandomValueBounded(int minBound, int maxBound) {
16 | return Integer.toString(GlobalRandom.getInstance().nextInt(minBound, maxBound));
17 | }
18 |
19 | public String getRandomValueBounded(int maxBound) {
20 | return Integer.toString(GlobalRandom.getInstance().nextInt(maxBound));
21 | }
22 |
23 | @Override
24 | public String mutateValue(String baseString) {
25 | Integer currentNum = Integer.parseInt(baseString);
26 | double prob = GlobalRandom.getInstance().nextDouble();
27 | if(prob < 0.5 && currentNum < Integer.MAX_VALUE)
28 | currentNum += GlobalRandom.getInstance().nextInt(20);
29 | else if(prob < 0.8 && currentNum < Integer.MIN_VALUE)
30 | currentNum -= GlobalRandom.getInstance().nextInt(20);
31 | else {
32 | Integer num = Integer.parseInt(this.getRandomValueFromPool());
33 | prob = GlobalRandom.getInstance().nextDouble();
34 | if(prob < 0.5 && DataCheckUtils.integerAdditionCheck(currentNum, num))
35 | currentNum = currentNum + num;
36 | else if(prob > 0.5 && DataCheckUtils.integerSubtractionCheck(currentNum, num))
37 | currentNum = currentNum - num;
38 | }
39 | return currentNum.toString();
40 | }
41 |
42 | public Pair getSequenceValue(XMLDatatype xmlDatatype) {
43 | double prob = GlobalRandom.getInstance().nextDouble();
44 | if(prob < 0.5) {
45 | int l = GlobalRandom.getInstance().nextInt(-1000, 1000);
46 | int length = GlobalRandom.getInstance().nextInt(10) + 1;
47 | String s = "(" + l + " to " + (l + length) + ")";
48 | return Pair.of(length, s);
49 | }
50 | return super.getSequenceValue(xmlDatatype);
51 | };
52 | }
53 |
--------------------------------------------------------------------------------
/src/main/java/XPress/XPathGeneration/LogicTree/InformationTree/InformationTreeFunctionNode/IntegerAddFunctionNode.java:
--------------------------------------------------------------------------------
1 | package XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode;
2 |
3 | import XPress.DatatypeControl.PrimitiveDatatype.XMLInteger;
4 | import XPress.DatatypeControl.ValueHandler.XMLIntegerHandler;
5 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeConstantNode;
6 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeNode;
7 |
8 | @FunctionV1
9 | public class IntegerAddFunctionNode extends BinaryNumericalOperatorFunctionNode {
10 |
11 | public IntegerAddFunctionNode() {
12 | datatypeRecorder.xmlDatatype = XMLInteger.getInstance();
13 | priorityLevel = 2;
14 | functionExpr = "+";
15 | }
16 |
17 | @Override
18 | protected void fillContentParameters(InformationTreeNode childNode) {
19 | if(fillContentParameterBySubRoot(XMLInteger.getInstance())) return;
20 | String value;
21 | int inputValue = Integer.parseInt(childNode.getContext().context);
22 | if(inputValue < 0) {
23 | value = ((XMLIntegerHandler) XMLInteger.getInstance().getValueHandler()).
24 | getRandomValueBounded(Integer.MIN_VALUE - inputValue, Integer.MAX_VALUE);
25 | }
26 | else {
27 | value = ((XMLIntegerHandler) XMLInteger.getInstance().getValueHandler()).
28 | getRandomValueBounded(Integer.MAX_VALUE - inputValue);
29 | }
30 | childList.add(new InformationTreeConstantNode(XMLInteger.getInstance(), value));
31 | }
32 |
33 | @Override
34 | protected void fillContentParametersRandom(InformationTreeNode childNode) {
35 | String value;
36 | value = ((XMLIntegerHandler) XMLInteger.getInstance().getValueHandler()).
37 | getRandomValueBounded(Integer.MIN_VALUE, Integer.MAX_VALUE);
38 | childList.add(new InformationTreeConstantNode(XMLInteger.getInstance(), value));
39 | }
40 |
41 | @Override
42 | public Boolean checkContextAcceptability(InformationTreeNode childNode) {
43 | return childNode.datatypeRecorder.xmlDatatype instanceof XMLInteger;
44 | }
45 |
46 | @Override
47 | public IntegerAddFunctionNode newInstance() {
48 | return new IntegerAddFunctionNode();
49 | }
50 | }
51 |
--------------------------------------------------------------------------------
/src/main/java/XPress/XPathGeneration/LogicTree/InformationTree/InformationTreeFunctionNode/IntegerSubtractionFunctionNode.java:
--------------------------------------------------------------------------------
1 | package XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode;
2 |
3 | import XPress.DatatypeControl.PrimitiveDatatype.XMLInteger;
4 | import XPress.DatatypeControl.ValueHandler.XMLIntegerHandler;
5 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeConstantNode;
6 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeNode;
7 |
8 | @FunctionV1
9 | public class IntegerSubtractionFunctionNode extends BinaryNumericalOperatorFunctionNode {
10 |
11 | public IntegerSubtractionFunctionNode() {
12 | datatypeRecorder.xmlDatatype = XMLInteger.getInstance();
13 | functionExpr = "-";
14 | priorityLevel = 2;
15 | }
16 | @Override
17 | protected void fillContentParameters(InformationTreeNode childNode) {
18 | if(fillContentParameterBySubRoot(XMLInteger.getInstance())) return;
19 | String value = null;
20 | Integer inputValue = Integer.parseInt(childNode.getContext().context);
21 | if(inputValue < 0)
22 | value = ((XMLIntegerHandler) XMLInteger.getInstance().getValueHandler()).
23 | getRandomValueBounded(Integer.MIN_VALUE - inputValue);
24 | else {
25 | value = ((XMLIntegerHandler) XMLInteger.getInstance().getValueHandler()).
26 | getRandomValueBounded(inputValue - Integer.MAX_VALUE, Integer.MAX_VALUE);
27 | }
28 | childList.add(new InformationTreeConstantNode(XMLInteger.getInstance(), value));
29 | }
30 |
31 | @Override
32 | protected void fillContentParametersRandom(InformationTreeNode childNode) {
33 | String value = ((XMLIntegerHandler) XMLInteger.getInstance().getValueHandler()).
34 | getRandomValueBounded(Integer.MIN_VALUE, Integer.MAX_VALUE);
35 | childList.add(new InformationTreeConstantNode(XMLInteger.getInstance(), value));
36 | }
37 |
38 | @Override
39 | public Boolean checkContextAcceptability(InformationTreeNode childNode) {
40 | return childNode.datatypeRecorder.xmlDatatype instanceof XMLInteger;
41 | }
42 |
43 | @Override
44 | public IntegerSubtractionFunctionNode newInstance() {
45 | return new IntegerSubtractionFunctionNode();
46 | }
47 | }
48 |
--------------------------------------------------------------------------------
/src/main/java/XPress/XPathGeneration/LogicTree/InformationTree/InformationTreeFunctionNode/InformationTreeSequenceFunctionNode/HeadFunctionNode.java:
--------------------------------------------------------------------------------
1 | package XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode.InformationTreeSequenceFunctionNode;
2 |
3 | import XPress.DatatypeControl.PrimitiveDatatype.XMLMixed;
4 | import XPress.DatatypeControl.PrimitiveDatatype.XMLSequence;
5 | import XPress.DatatypeControl.XMLAtomic;
6 | import XPress.DatatypeControl.XMLDatatypeComplexRecorder;
7 | import XPress.TestException.DebugErrorException;
8 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode.FunctionV3;
9 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeNode;
10 | import XPress.XPathGeneration.LogicTree.LogicTreeNode;
11 |
12 | @FunctionV3
13 | public class HeadFunctionNode extends InformationTreeSequenceFunctionNode {
14 | public HeadFunctionNode() {
15 | functionExpr = "head";
16 | }
17 |
18 | @Override
19 | public String getCalculationString(LogicTreeNode parentNode, boolean checkImpact) throws DebugErrorException {
20 | String calculationStr;
21 | if(!(datatypeRecorder.xmlDatatype instanceof XMLSequence) &&
22 | datatypeRecorder.xmlDatatype instanceof XMLAtomic)
23 | calculationStr = "(" + functionExpr + "(" + childList.get(0).getCalculationString(parentNode, false)
24 | + ") cast as " + this.datatypeRecorder.getActualDatatype().officialTypeName + ")";
25 | else {
26 | calculationStr = functionExpr + "(" + childList.get(0).getCalculationString(parentNode, false) + ")";
27 | }
28 | return calculationStr;
29 | }
30 |
31 | @Override
32 | protected void fillContentParameters(InformationTreeNode childNode) {
33 | fillContentParametersRandom(childNode);
34 | }
35 |
36 | @Override
37 | protected void fillContentParametersRandom(InformationTreeNode childNode) {
38 | if(childNode.datatypeRecorder.getActualDatatype() instanceof XMLMixed)
39 | datatypeRecorder = new XMLDatatypeComplexRecorder(childNode.datatypeRecorder);
40 | else datatypeRecorder.xmlDatatype = childNode.datatypeRecorder.getActualDatatype();
41 | }
42 |
43 | @Override
44 | public HeadFunctionNode newInstance() {
45 | return new HeadFunctionNode();
46 | }
47 | }
48 |
--------------------------------------------------------------------------------
/src/main/java/XPress/XPathGeneration/LogicTree/InformationTree/InformationTreeFunctionNode/IntegerMultiplicationFunctionNode.java:
--------------------------------------------------------------------------------
1 | package XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode;
2 |
3 | import XPress.DatatypeControl.PrimitiveDatatype.XMLInteger;
4 | import XPress.GlobalRandom;
5 | import XPress.DatatypeControl.ValueHandler.XMLIntegerHandler;
6 | import XPress.TestException.DebugErrorException;
7 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeConstantNode;
8 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeNode;
9 |
10 | @FunctionV1
11 | public class IntegerMultiplicationFunctionNode extends BinaryNumericalOperatorFunctionNode {
12 | public IntegerMultiplicationFunctionNode() {
13 | datatypeRecorder.xmlDatatype = XMLInteger.getInstance();
14 | functionExpr = "*";
15 | priorityLevel = 3;
16 | }
17 |
18 | @Override
19 | protected void fillContentParameters(InformationTreeNode childNode) throws DebugErrorException {
20 | String value;
21 | Integer inputValue = Math.abs(Integer.parseInt(childNode.getContext().context));
22 | if(inputValue == 0) {
23 | value = Integer.toString(GlobalRandom.getInstance().nextInt(1000));
24 | }
25 | else {
26 | Integer boundValue = Integer.MAX_VALUE / inputValue;
27 | value = ((XMLIntegerHandler) XMLInteger.getInstance().getValueHandler()).
28 | getRandomValueBounded(-boundValue, boundValue);
29 | if (value.equals("0"))
30 | value = Integer.toString(1);
31 | }
32 | childList.add(new InformationTreeConstantNode(XMLInteger.getInstance(), value));
33 | }
34 | @Override
35 | protected void fillContentParametersRandom(InformationTreeNode childNode) {
36 | String value = Integer.toString(GlobalRandom.getInstance().nextInt(1000));
37 | childList.add(new InformationTreeConstantNode(XMLInteger.getInstance(), value));
38 | }
39 |
40 | @Override
41 | public Boolean checkContextAcceptability(InformationTreeNode childNode) {
42 | return childNode.datatypeRecorder.xmlDatatype instanceof XMLInteger;
43 | }
44 |
45 | @Override
46 | public IntegerMultiplicationFunctionNode newInstance() {
47 | return new IntegerMultiplicationFunctionNode();
48 | }
49 |
50 | }
51 |
--------------------------------------------------------------------------------
/src/main/java/XPress/XPathGeneration/LogicTree/InformationTree/InformationTreeFunctionNode/DoubleSubtractFunctionNode.java:
--------------------------------------------------------------------------------
1 | package XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode;
2 |
3 | import XPress.DatatypeControl.PrimitiveDatatype.XMLDouble;
4 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeConstantNode;
5 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeNode;
6 |
7 | import static java.lang.Math.abs;
8 |
9 | @FunctionV1
10 | public class DoubleSubtractFunctionNode extends BinaryNumericalOperatorFunctionNode {
11 | public DoubleSubtractFunctionNode() {
12 | this.datatypeRecorder.xmlDatatype = XMLDouble.getInstance();
13 | functionExpr = "-";
14 | priorityLevel = 2;
15 | }
16 |
17 | @Override
18 | protected void fillContentParameters(InformationTreeNode childNode) {
19 | String value = XMLDouble.getInstance().getValueHandler().getValue(false);
20 | double currentValue;
21 | currentValue = Double.parseDouble(childNode.getContext().context);
22 | double subtractValue = Double.parseDouble(value);
23 | if(abs(currentValue - subtractValue) < 0.5) {
24 | if(subtractValue < 0) value = value.substring(1);
25 | else value = "-" + value;
26 | }
27 | else {
28 | if (currentValue > 10000 && subtractValue < 0) {
29 | value = value.substring(1);
30 | } else if (currentValue < 10000 && subtractValue > 0) {
31 | value = "-" + value;
32 | }
33 | }
34 | childList.add(new InformationTreeConstantNode(XMLDouble.getInstance(), value));
35 | }
36 |
37 | @Override
38 | protected void fillContentParametersRandom(InformationTreeNode childNode) {
39 | // TODO: Control interval of randomly generated value to avoid overflow if necessary
40 | String value = XMLDouble.getInstance().getValueHandler().getValue(false);
41 | childList.add(new InformationTreeConstantNode(XMLDouble.getInstance(), value));
42 | }
43 |
44 | @Override
45 | public Boolean checkContextAcceptability(InformationTreeNode childNode) {
46 | return childNode.datatypeRecorder.xmlDatatype instanceof XMLDouble;
47 | }
48 |
49 | @Override
50 | public DoubleSubtractFunctionNode newInstance() {
51 | return new DoubleSubtractFunctionNode();
52 | }
53 | }
54 |
--------------------------------------------------------------------------------
/src/main/java/XPress/XPathGeneration/LogicTree/InformationTree/InformationTreeFunctionNode/InformationTreeDirectContentFunctionNode/InformationTreeDirectContentFunctionNode.java:
--------------------------------------------------------------------------------
1 | package XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode.InformationTreeDirectContentFunctionNode;
2 |
3 | import XPress.DatatypeControl.PrimitiveDatatype.XMLNode;
4 | import XPress.DatatypeControl.PrimitiveDatatype.XMLSequence;
5 | import XPress.GlobalSettings;
6 | import XPress.TestException.DebugErrorException;
7 | import XPress.TestException.UnexpectedExceptionThrownException;
8 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode.InformationTreeFunctionNode;
9 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeNode;
10 | import XPress.XPathGeneration.LogicTree.LogicTreeNode;
11 |
12 | import java.io.IOException;
13 | import java.sql.SQLException;
14 |
15 | public abstract class InformationTreeDirectContentFunctionNode extends InformationTreeFunctionNode {
16 |
17 | @Override
18 | protected void fillContentParameters(InformationTreeNode childNode) throws SQLException, UnexpectedExceptionThrownException, IOException, DebugErrorException {
19 | fillContentParametersRandom(childNode);
20 | }
21 |
22 | @Override
23 | public Boolean checkContextAcceptability(InformationTreeNode childNode) {
24 | Boolean checkResult = childNode.datatypeRecorder.xmlDatatype instanceof XMLNode;
25 | if(!checkResult) {
26 | if(!GlobalSettings.starNodeSelection) return false;
27 | if(childNode.datatypeRecorder.xmlDatatype instanceof XMLSequence && childNode.datatypeRecorder.subDatatype instanceof XMLNode &&
28 | Integer.parseInt(childNode.getContext().context) != 0)
29 | checkResult = true;
30 | }
31 | return checkResult;
32 | }
33 |
34 | public String getXPathExpression(boolean returnConstant, LogicTreeNode parentNode, boolean calculateString) throws DebugErrorException {
35 | String expr = getXPathExpressionCheck(returnConstant, parentNode, calculateString);
36 | if(expr != null) return expr;
37 | String childExpr = childList.get(0).getXPathExpression(returnConstant, parentNode, calculateString);
38 | if(childExpr.equals(".")) {
39 | return functionExpr + "()";
40 | }
41 | return childExpr + "/" + functionExpr + "()";
42 | }
43 | }
44 |
--------------------------------------------------------------------------------
/src/main/java/XPress/XPathGeneration/LogicTree/InformationTree/InformationTreeFunctionNode/DoubleAddFunctionNode.java:
--------------------------------------------------------------------------------
1 | package XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode;
2 |
3 | import XPress.DatatypeControl.PrimitiveDatatype.XMLDouble;
4 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeConstantNode;
5 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeNode;
6 |
7 | import static XPress.StringUtils.getListString;
8 | import static java.lang.Math.abs;
9 |
10 | @FunctionV1
11 | public class DoubleAddFunctionNode extends BinaryNumericalOperatorFunctionNode {
12 | public DoubleAddFunctionNode() {
13 | this.datatypeRecorder.xmlDatatype = XMLDouble.getInstance();
14 | priorityLevel = 2;
15 | functionExpr = "+";
16 | }
17 |
18 | @Override
19 | public DoubleAddFunctionNode newInstance() {
20 | return new DoubleAddFunctionNode();
21 | }
22 |
23 | @Override
24 | protected void fillContentParameters(InformationTreeNode childNode) {
25 | double currentValue = Double.parseDouble(childNode.getContext().context);
26 | String value = XMLDouble.getInstance().getValueHandler().getValue(false);
27 | double addValue = Double.parseDouble(value);
28 | if(abs(currentValue + addValue) < 0.5) {
29 | if(addValue > 0) value = "-" + value;
30 | else value = value.substring(1);
31 | }
32 | else {
33 | if (currentValue > 10000 && Double.parseDouble(value) > 0) {
34 | value = "-" + value;
35 | } else if (currentValue < 10000 && Double.parseDouble(value) < 0) {
36 | value = value.substring(1);
37 | }
38 | }
39 | childList.add(new InformationTreeConstantNode(XMLDouble.getInstance(), value));
40 | }
41 |
42 | @Override
43 | protected void fillContentParametersRandom(InformationTreeNode childNode) {
44 | // TODO: Control interval of randomly generated value to avoid overflow if necessary
45 | String value = XMLDouble.getInstance().getValueHandler().getValue(false);
46 | childList.add(new InformationTreeConstantNode(XMLDouble.getInstance(), value));
47 | }
48 |
49 | @Override
50 | public Boolean checkContextAcceptability(InformationTreeNode childNode) {
51 | return childNode.datatypeRecorder.xmlDatatype instanceof XMLDouble;
52 | }
53 | }
54 |
--------------------------------------------------------------------------------
/src/main/java/XPress/XPathGeneration/LogicTree/InformationTree/InformationTreeFunctionNode/InformationTreeComparisonOperatorNode/LessOrEqualOperatorNode.java:
--------------------------------------------------------------------------------
1 | package XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode.InformationTreeComparisonOperatorNode;
2 |
3 | import XPress.DatatypeControl.PrimitiveDatatype.XMLDouble;
4 | import XPress.GlobalSettings;
5 | import XPress.DatatypeControl.XMLComparable;
6 | import XPress.TestException.DebugErrorException;
7 | import XPress.TestException.UnexpectedExceptionThrownException;
8 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeConstantNode;
9 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode.FunctionV1;
10 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeNode;
11 |
12 | import java.io.IOException;
13 | import java.sql.SQLException;
14 |
15 | @FunctionV1
16 | public class LessOrEqualOperatorNode extends InformationTreeComparisonOperatorNode {
17 | public LessOrEqualOperatorNode() {
18 | functionExpr = "<=";
19 | }
20 |
21 | @Override
22 | public InformationTreeNode modifyToContainStarredNode(int starredNodeId) throws SQLException, UnexpectedExceptionThrownException, IOException, DebugErrorException {
23 | if(!GlobalSettings.starNodeSelection && GlobalSettings.rectifySelection) {
24 | return super.modifyToContainStarredNode(starredNodeId);
25 | }
26 | InformationTreeComparisonOperatorNode newRoot = new GreaterThanOperatorNode();
27 | newRoot.transferInfo(this);
28 | return newRoot;
29 | }
30 |
31 | @Override
32 | public LessOrEqualOperatorNode newInstance() {
33 | return new LessOrEqualOperatorNode();
34 | }
35 |
36 | @Override
37 | protected void fillContentParameters(InformationTreeNode childNode) {
38 | String value = ((XMLComparable) childNode.datatypeRecorder.xmlDatatype.getValueHandler()).getGreater(childNode.getContext().context);
39 | childList.add(new InformationTreeConstantNode(childNode.datatypeRecorder.xmlDatatype, value));
40 | }
41 |
42 | @Override
43 | public Boolean checkContextAcceptability(InformationTreeNode childNode) {
44 | boolean result = super.checkContextAcceptability(childNode);
45 | if(result) {
46 | return !(childNode.datatypeRecorder.getActualDatatype() instanceof XMLDouble);
47 | } else return false;
48 | }
49 | }
50 |
--------------------------------------------------------------------------------
/src/test/java/XPress/XMLDatatypeIntegrationTest.java:
--------------------------------------------------------------------------------
1 | package XPress;
2 |
3 | import XPress.DatabaseExecutor.DatabaseExecutor;
4 | import XPress.DatabaseExecutor.MainExecutor;
5 | import XPress.DatabaseExecutor.SaxonExecutor;
6 | import XPress.DatatypeControl.PrimitiveDatatype.XMLDatatype;
7 | import XPress.DatatypeControl.XMLSimple;
8 | import XPress.TestException.UnexpectedExceptionThrownException;
9 | import XPress.TestException.UnsupportedContextSetUpException;
10 | import XPress.XMLGeneration.XMLContext;
11 | import XPress.XMLGeneration.XMLDocumentGenerator;
12 | import XPress.XPathGeneration.XPathGeneratorImpl;
13 | import net.sf.saxon.s9api.SaxonApiException;
14 | import org.junit.jupiter.api.Test;
15 | import org.xmldb.api.base.XMLDBException;
16 |
17 | import java.io.IOException;
18 | import java.sql.SQLException;
19 | import java.util.ArrayList;
20 | import java.util.List;
21 |
22 | public class XMLDatatypeIntegrationTest {
23 | @Test
24 | void getCastableTest() throws SQLException, UnsupportedContextSetUpException, XMLDBException, IOException, SaxonApiException, UnexpectedExceptionThrownException {
25 | XMLDocumentGenerator xmlDocumentGenerator = new XMLDocumentGenerator();
26 | XMLContext xmlContext = xmlDocumentGenerator.generateXMLContext(15);
27 | System.out.println(xmlContext.getXmlContent());
28 | MainExecutor mainExecutor = new MainExecutor();
29 | List dbExecutorList = new ArrayList<>();
30 | dbExecutorList.add(SaxonExecutor.getInstance());
31 | for(DatabaseExecutor dbExecutor: dbExecutorList)
32 | dbExecutor.registerDatabase(mainExecutor);
33 | XPathGeneratorImpl XPathGenerator = new XPathGeneratorImpl(mainExecutor);
34 | mainExecutor.setXPathGenerationContext(xmlContext);
35 |
36 | XMLDatatype.getCastable(mainExecutor);
37 |
38 | for(XMLDatatype xmlDatatype : XMLDatatype.allDatatypeList) {
39 | if(xmlDatatype instanceof XMLSimple) {
40 | for(XMLDatatype xmlDatatype2 : XMLDatatype.allDatatypeList) {
41 | if(xmlDatatype2 instanceof XMLSimple) {
42 | System.out.println(xmlDatatype.officialTypeName + " castable as " +
43 | xmlDatatype2.officialTypeName + " = " + XMLDatatype.checkCastable(mainExecutor, xmlDatatype, xmlDatatype2));
44 | }
45 | }
46 | }
47 | }
48 | }
49 | }
50 |
--------------------------------------------------------------------------------
/src/main/java/XPress/XPathGeneration/LogicTree/InformationTree/InformationTreeFunctionNode/InformationTreeComparisonOperatorNode/GreaterOrEqualOperatorNode.java:
--------------------------------------------------------------------------------
1 | package XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode.InformationTreeComparisonOperatorNode;
2 |
3 | import XPress.DatatypeControl.PrimitiveDatatype.XMLDouble;
4 | import XPress.GlobalSettings;
5 | import XPress.DatatypeControl.XMLComparable;
6 | import XPress.TestException.DebugErrorException;
7 | import XPress.TestException.UnexpectedExceptionThrownException;
8 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeConstantNode;
9 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode.FunctionV1;
10 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeNode;
11 |
12 | import java.io.IOException;
13 | import java.sql.SQLException;
14 |
15 | @FunctionV1
16 | public class GreaterOrEqualOperatorNode extends InformationTreeComparisonOperatorNode {
17 | public GreaterOrEqualOperatorNode() {
18 | functionExpr = ">=";
19 | }
20 |
21 | @Override
22 | public InformationTreeNode modifyToContainStarredNode(int starredNodeId) throws SQLException, UnexpectedExceptionThrownException, IOException, DebugErrorException {
23 | if(!GlobalSettings.starNodeSelection && GlobalSettings.rectifySelection) {
24 | return super.modifyToContainStarredNode(starredNodeId);
25 | }
26 | InformationTreeComparisonOperatorNode newRoot = new LessThanOperatorNode();
27 | newRoot.transferInfo(this);
28 | return newRoot;
29 | }
30 |
31 | @Override
32 | public GreaterOrEqualOperatorNode newInstance() {
33 | return new GreaterOrEqualOperatorNode();
34 | }
35 |
36 | @Override
37 | protected void fillContentParameters(InformationTreeNode childNode) {
38 | String value = ((XMLComparable) childNode.datatypeRecorder.xmlDatatype.getValueHandler()).getLess(childNode.getContext().context);
39 | childList.add(new InformationTreeConstantNode(childNode.datatypeRecorder.xmlDatatype, value));
40 | }
41 |
42 | @Override
43 | public Boolean checkContextAcceptability(InformationTreeNode childNode) {
44 | boolean result = super.checkContextAcceptability(childNode);
45 | if(result) {
46 | return !(childNode.datatypeRecorder.getActualDatatype() instanceof XMLDouble);
47 | } else return false;
48 | }
49 | }
50 |
--------------------------------------------------------------------------------
/src/main/java/XPress/XPathGeneration/LogicTree/InformationTree/InformationTreeFunctionNode/ContainsFunctionNode.java:
--------------------------------------------------------------------------------
1 | package XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode;
2 |
3 | import XPress.DatatypeControl.PrimitiveDatatype.XMLBoolean;
4 | import XPress.DatatypeControl.PrimitiveDatatype.XMLString;
5 | import XPress.GlobalRandom;
6 | import XPress.Pair;
7 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeConstantNode;
8 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeNode;
9 | @FunctionV1
10 | public class ContainsFunctionNode extends InformationTreeFunctionNode {
11 | public ContainsFunctionNode() {
12 | this.datatypeRecorder.xmlDatatype = XMLBoolean.getInstance();
13 | functionExpr = "contains";
14 | }
15 |
16 | @Override
17 | public ContainsFunctionNode newInstance() {
18 | return new ContainsFunctionNode();
19 | }
20 |
21 | @Override
22 | protected void fillContentParameters(InformationTreeNode childNode) {
23 | String childString = childList.get(0).getContext().context;
24 | if(childString.length() == 0) {
25 | fillContentParametersRandom(childNode);
26 | return;
27 | }
28 | Pair subStringInterval = GlobalRandom.getInstance().nextInterval(childString.length());
29 | int l = subStringInterval.x, r = subStringInterval.y;
30 | String subString;
31 | double prob = GlobalRandom.getInstance().nextDouble();
32 | subString = childString.substring(l, r);
33 | if(prob < 0.2)
34 | subString = XMLString.getInstance().getValueHandler().mutateValue(subString);
35 | InformationTreeConstantNode constantNode = new InformationTreeConstantNode
36 | (XMLString.getInstance(), subString);
37 | childList.add(constantNode);
38 | }
39 |
40 | @Override
41 | protected void fillContentParametersRandom(InformationTreeNode childNode) {
42 | String subString;
43 | subString = XMLString.getInstance().getValueHandler().getValue();
44 | InformationTreeConstantNode constantNode = new InformationTreeConstantNode
45 | (XMLString.getInstance(), subString);
46 | childList.add(constantNode);
47 | }
48 |
49 | @Override
50 | public Boolean checkContextAcceptability(InformationTreeNode childNode) {
51 | return childNode.datatypeRecorder.xmlDatatype instanceof XMLString;
52 | }
53 | }
54 |
--------------------------------------------------------------------------------
/src/main/java/XPress/XMLGeneration/ContextTemplateGeneratorImpl.java:
--------------------------------------------------------------------------------
1 | package XPress.XMLGeneration;
2 |
3 | import XPress.DatatypeControl.PrimitiveDatatype.XMLDatatype;
4 | import XPress.GlobalRandom;
5 |
6 | import java.util.ArrayList;
7 | import java.util.List;
8 |
9 | import static org.apache.commons.lang3.math.NumberUtils.min;
10 |
11 | public class ContextTemplateGeneratorImpl implements ContextTemplateGenerator {
12 | NameGenerator contextNodeNameGenerator;
13 | AttributeTemplateGenerator attributeTemplateGenerator;
14 | List attributeTemplateList;
15 |
16 |
17 | ContextTemplateGeneratorImpl(NameGenerator contextNodeNameGenerator,
18 | AttributeTemplateGenerator attributeTemplateGenerator) {
19 | this.contextNodeNameGenerator = contextNodeNameGenerator;
20 | this.attributeTemplateGenerator = attributeTemplateGenerator;
21 | }
22 |
23 | @Override
24 | public List generateContextTemplate(int templateSize) {
25 | int attributeSize;
26 | if(attributeTemplateList == null) {
27 | attributeSize = (int) (templateSize * 0.8) + 1;
28 | attributeTemplateList = attributeTemplateGenerator.generateAttributeTemplate(attributeSize);
29 | }
30 | else attributeSize = attributeTemplateList.size();
31 | List contextTemplateList = new ArrayList<>();
32 | for(int i = 0; i < templateSize; i ++) {
33 | ContextNode contextNode = new ContextNode();
34 | int attributeTotalNum = min(attributeSize, GlobalRandom.getInstance().nextInt(5) + 1);
35 | contextNode.addAttribute(attributeTemplateList.get(0));
36 | List attributeIdList = GlobalRandom.getInstance().nextIntListNoRep(attributeTotalNum - 1, attributeSize - 1);
37 | for(int j = 0; j < attributeTotalNum - 1; j ++)
38 | attributeIdList.set(j, attributeIdList.get(j) + 1);
39 | for(int j = 0; j < attributeTotalNum - 1; j ++) {
40 | AttributeNode attributeNode = new AttributeNode(
41 | attributeTemplateList.get(attributeIdList.get(j))
42 | );
43 | contextNode.addAttribute(attributeNode);
44 | }
45 | contextNode.tagName = contextNodeNameGenerator.generateName();
46 | contextNode.dataType = XMLDatatype.getRandomDataType();
47 | contextTemplateList.add(contextNode);
48 | }
49 | return contextTemplateList;
50 | }
51 | }
52 |
--------------------------------------------------------------------------------
/src/main/java/XPress/DatabaseExecutor/LibXML2Executor.java:
--------------------------------------------------------------------------------
1 | package XPress.DatabaseExecutor;
2 |
3 | import XPress.GlobalSettings;
4 | import XPress.TestException.UnsupportedContextSetUpException;
5 |
6 | import java.io.IOException;
7 | import java.sql.SQLException;
8 | import java.util.ArrayList;
9 | import java.util.List;
10 |
11 | public class LibXML2Executor extends DatabaseExecutor {
12 | String fileAddr;
13 | static LibXML2Executor libXML2Executor;
14 | LibXML2ExecutorLow libXML2ExecutorLow;
15 |
16 | private LibXML2Executor() {
17 | libXML2ExecutorLow = new LibXML2ExecutorLow();
18 | dbName = "libXML2";
19 | dbXPathVersion = GlobalSettings.XPathVersion.VERSION_1;
20 | }
21 |
22 | public static void registerMap() {
23 | nameExecutorMap.put("libXML2", LibXML2Executor.class);
24 | }
25 |
26 | static public LibXML2Executor getInstance() throws SQLException, ClassNotFoundException {
27 | if(libXML2Executor == null)
28 | libXML2Executor = new LibXML2Executor();
29 | return libXML2Executor;
30 | }
31 |
32 | @Override
33 | void setContext(String info) throws IOException, UnsupportedContextSetUpException {
34 | setContextByFile(info);
35 | }
36 |
37 | @Override
38 | void setContextByFileLow(String fileAddr) {
39 | this.fileAddr = fileAddr;
40 | }
41 |
42 | @Override
43 | void setContextByContentLow(String content) throws UnsupportedContextSetUpException {
44 | throw new UnsupportedContextSetUpException();
45 | }
46 |
47 | @Override
48 | public String execute(String Xquery) throws IOException, SQLException {
49 | return libXML2ExecutorLow.execute(fileAddr, Xquery).trim();
50 | }
51 |
52 | @Override
53 | void setContextWithCheck(String content, String fileAddr) throws SQLException, UnsupportedContextSetUpException, IOException {
54 | setContextByFileWithCheck(fileAddr);
55 | }
56 |
57 | @Override
58 | public void close() throws IOException, SQLException {}
59 |
60 | @Override
61 | public List executeGetNodeIdList(String Xquery) throws SQLException, IOException {
62 | String result = execute(Xquery);
63 | if(result.length() == 0)
64 | return new ArrayList<>();
65 | String[] resultIdStrList = result.split("\\s+");
66 | List resultIdList = new ArrayList<>();
67 | for(String id : resultIdStrList) {
68 | resultIdList.add(Integer.parseInt(id));
69 | }
70 | return resultIdList;
71 | }
72 | }
73 |
--------------------------------------------------------------------------------
/src/main/java/XPress/XPathGeneration/LogicTree/InformationTree/InformationTreeFunctionNode/InformationTreeComparisonOperatorNode/LessThanOperatorNode.java:
--------------------------------------------------------------------------------
1 | package XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode.InformationTreeComparisonOperatorNode;
2 |
3 | import XPress.GlobalRandom;
4 | import XPress.GlobalSettings;
5 | import XPress.DatatypeControl.XMLComparable;
6 | import XPress.TestException.DebugErrorException;
7 | import XPress.TestException.UnexpectedExceptionThrownException;
8 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeConstantNode;
9 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode.FunctionV1;
10 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode.InformationTreeFunctionNodeManager;
11 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeNode;
12 |
13 | import java.io.IOException;
14 | import java.sql.SQLException;
15 | @FunctionV1
16 | public class LessThanOperatorNode extends InformationTreeComparisonOperatorNode {
17 | public LessThanOperatorNode() {
18 | functionExpr = "<";
19 | }
20 |
21 | @Override
22 | public InformationTreeNode modifyToContainStarredNode(int starredNodeId) throws SQLException, UnexpectedExceptionThrownException, IOException, DebugErrorException {
23 | if(!GlobalSettings.starNodeSelection && GlobalSettings.rectifySelection) {
24 | return super.modifyToContainStarredNode(starredNodeId);
25 | }
26 | InformationTreeComparisonOperatorNode newRoot = new GreaterOrEqualOperatorNode();
27 | newRoot.transferInfo(this);
28 | return newRoot;
29 | }
30 |
31 | @Override
32 | public LessThanOperatorNode newInstance() {
33 | return new LessThanOperatorNode();
34 | }
35 |
36 | @Override
37 | protected void fillContentParameters(InformationTreeNode childNode) {
38 | double prob = GlobalRandom.getInstance().nextDouble();
39 | if(prob < 0.4) {
40 | InformationTreeNode node = InformationTreeFunctionNodeManager.getInstance().getNodeWithSimpleType(childNode.datatypeRecorder.getActualDatatype());
41 | if(node != null) {
42 | childList.add(node);
43 | return;
44 | }
45 | }
46 | String value = ((XMLComparable) childNode.datatypeRecorder.xmlDatatype.getValueHandler()).getGreaterOrEqual(childNode.getContext().context);
47 | childList.add(new InformationTreeConstantNode(childNode.datatypeRecorder.xmlDatatype, value));
48 | }
49 | }
50 |
--------------------------------------------------------------------------------
/src/main/java/XPress/XPathGeneration/LogicTree/InformationTree/InformationTreeFunctionNode/InformationTreeComparisonOperatorNode/GreaterThanOperatorNode.java:
--------------------------------------------------------------------------------
1 | package XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode.InformationTreeComparisonOperatorNode;
2 |
3 | import XPress.GlobalRandom;
4 | import XPress.GlobalSettings;
5 | import XPress.DatatypeControl.XMLComparable;
6 | import XPress.TestException.DebugErrorException;
7 | import XPress.TestException.UnexpectedExceptionThrownException;
8 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeConstantNode;
9 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode.FunctionV1;
10 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode.InformationTreeFunctionNodeManager;
11 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeNode;
12 |
13 | import java.io.IOException;
14 | import java.sql.SQLException;
15 |
16 | @FunctionV1
17 | public class GreaterThanOperatorNode extends InformationTreeComparisonOperatorNode {
18 | public GreaterThanOperatorNode() {
19 | functionExpr = ">";
20 | }
21 |
22 | @Override
23 | public InformationTreeNode modifyToContainStarredNode(int starredNodeId) throws SQLException, UnexpectedExceptionThrownException, IOException, DebugErrorException {
24 | if(!GlobalSettings.starNodeSelection && GlobalSettings.rectifySelection) {
25 | return super.modifyToContainStarredNode(starredNodeId);
26 | }
27 | InformationTreeComparisonOperatorNode newRoot = new LessOrEqualOperatorNode();
28 | newRoot.transferInfo(this);
29 | return newRoot;
30 | }
31 |
32 | @Override
33 | public GreaterThanOperatorNode newInstance() {
34 | return new GreaterThanOperatorNode();
35 | }
36 |
37 | @Override
38 | protected void fillContentParameters(InformationTreeNode childNode) {
39 | double prob = GlobalRandom.getInstance().nextDouble();
40 | if(prob < 0.4) {
41 | InformationTreeNode node = InformationTreeFunctionNodeManager.getInstance().getNodeWithSimpleType(childNode.datatypeRecorder.getActualDatatype());
42 | if(node != null) {
43 | childList.add(node);
44 | return;
45 | }
46 | }
47 | String value = ((XMLComparable) childNode.datatypeRecorder.xmlDatatype.getValueHandler()).getLessOrEqual(childNode.getContext().context);
48 | childList.add(new InformationTreeConstantNode(childNode.datatypeRecorder.xmlDatatype, value));
49 | }
50 | }
51 |
--------------------------------------------------------------------------------
/src/main/java/XPress/XPathGeneration/LogicTree/InformationTree/InformationTreeFunctionNode/InformationTreeComparisonOperatorNode/NotEqualOperatorNode.java:
--------------------------------------------------------------------------------
1 | package XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode.InformationTreeComparisonOperatorNode;
2 |
3 | import XPress.DatatypeControl.PrimitiveDatatype.*;
4 | import XPress.GlobalSettings;
5 | import XPress.TestException.DebugErrorException;
6 | import XPress.TestException.UnexpectedExceptionThrownException;
7 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeConstantNode;
8 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode.FunctionV1;
9 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeNode;
10 |
11 | import java.io.IOException;
12 | import java.sql.SQLException;
13 |
14 | @FunctionV1
15 | public class NotEqualOperatorNode extends InformationTreeComparisonOperatorNode {
16 | public NotEqualOperatorNode() {
17 | functionExpr = "!=";
18 | }
19 |
20 | @Override
21 | public InformationTreeNode modifyToContainStarredNode(int starredNodeId) throws SQLException, UnexpectedExceptionThrownException, IOException, DebugErrorException {
22 | if(!GlobalSettings.starNodeSelection && GlobalSettings.rectifySelection) {
23 | return super.modifyToContainStarredNode(starredNodeId);
24 | }
25 | InformationTreeComparisonOperatorNode newRoot = new EqualOperatorNode();
26 | newRoot.transferInfo(this);
27 | return newRoot;
28 | }
29 |
30 | @Override
31 | public NotEqualOperatorNode newInstance() {
32 | return new NotEqualOperatorNode();
33 | }
34 |
35 | @Override
36 | protected void fillContentParameters(InformationTreeNode childNode) {
37 | String value = childNode.datatypeRecorder.xmlDatatype.getValueHandler().getNotEqual(childNode.getContext().context);
38 | childList.add(new InformationTreeConstantNode(childNode.datatypeRecorder.xmlDatatype, value));
39 | }
40 |
41 | @Override
42 | public Boolean checkContextAcceptability(InformationTreeNode childNode) {
43 | if(childNode.datatypeRecorder.getActualDatatype() instanceof XMLQName)
44 | return false;
45 | if(childNode.datatypeRecorder.getActualDatatype() instanceof XMLDouble)
46 | return false;
47 | return !(childNode.datatypeRecorder.xmlDatatype instanceof XMLSequence) &&
48 | !(childNode.datatypeRecorder.xmlDatatype instanceof XMLNode) &&
49 | !(childNode.datatypeRecorder.xmlDatatype instanceof XMLMixed);
50 | }
51 | }
--------------------------------------------------------------------------------
/scripts/efficiency_plot.py:
--------------------------------------------------------------------------------
1 | import matplotlib.pyplot as plt
2 | import numpy as np
3 | import pandas as pd
4 |
5 | SMALL_SIZE = 8
6 | MEDIUM_SIZE = 10
7 | BIGGER_SIZE = 14.5
8 |
9 | plt.rc('font', size=BIGGER_SIZE) # controls default text sizes
10 | plt.rc('axes', titlesize=BIGGER_SIZE) # fontsize of the axes title
11 | plt.rc('axes', labelsize=BIGGER_SIZE) # fontsize of the x and y labels
12 | plt.rc('xtick', labelsize=BIGGER_SIZE) # fontsize of the tick labels
13 | plt.rc('ytick', labelsize=BIGGER_SIZE) # fontsize of the tick labels
14 | plt.rc('legend', fontsize=BIGGER_SIZE) # legend fontsize
15 | plt.rc('figure', titlesize=BIGGER_SIZE) # fontsize of the figure title
16 |
17 | fig, ax1 = plt.subplots()
18 | fig.set_figheight(5)
19 | fig.set_figwidth(8)
20 |
21 | result_dict = {}
22 | result_file = open("result.txt")
23 | for line in result_file:
24 | data = line.split(",")
25 | result_dict[data[0]] = data[1:]
26 | time_range = [i for i in range(1, len(result_dict['s_r']) + 1)]
27 |
28 | def color(color_tuple):
29 | return(color_tuple[0] / 255, color_tuple[1] / 255, color_tuple[2] / 255)
30 |
31 | ax1.plot(time_range, result_dict["s_r"], color=color((81,102,129)),
32 | marker='*',
33 | fillstyle='full',
34 | mfc=color((78, 175, 193)),
35 | markeredgecolor=color((81,102,129)),
36 | markeredgewidth=1.2, label="Targeted")
37 | ax1.plot(time_range, result_dict["s_nr"], color=color(( 108, 198, 178 )),
38 | marker='*',
39 | fillstyle='full',
40 | mfc=color(( 173, 227, 214 )),
41 | markeredgecolor=color(( 108, 198, 178 )),
42 | markeredgewidth=1.5, label="Targeted w/o Rect")
43 | ax1.plot(time_range, result_dict["p_r"], color=color((183,107,117, 100)),
44 | marker='*',
45 | fillstyle='full',
46 | mfc=color((252, 165, 174, 100)),
47 | markeredgecolor=color((183,107,117, 100)),
48 | markeredgewidth=1.5, label="Untargeted w/ Rect")
49 | ax1.plot(time_range, result_dict["p_nr"], color=color(( 225, 178, 3 )),
50 | marker='*',
51 | fillstyle='full',
52 | mfc=color(( 243, 200, 144 )),
53 | markeredgecolor=color(( 225, 178, 3 )),
54 | markeredgewidth=1.5, label="Untargeted w/o Rect")
55 | # plt.plot(time_range, unemployment_rate3, 'yx-')
56 | # plt.plot(time_range, unemployment_rate4, 'g+-')
57 | ax1.legend(loc="lower right", ncol=2)
58 | ax1.set_xlim([0, 25])
59 | ax1.set_ylim([0, 13.5])
60 | ax1.set_xlabel('Elapsed Time(h)')
61 | ax1.set_ylabel('Total amount of unique bugs found')
62 | fig.tight_layout()
63 | plt.savefig('unique_bug_num.png')
--------------------------------------------------------------------------------
/src/main/java/XPress/XMLGeneration/XMLWriter.java:
--------------------------------------------------------------------------------
1 | package XPress.XMLGeneration;
2 |
3 | import org.apache.commons.lang3.tuple.Pair;
4 |
5 | public class XMLWriter {
6 |
7 | static public String newLine(String currentBuilder, Boolean withStructure) {
8 | if(withStructure) currentBuilder += "\n";
9 | return currentBuilder;
10 | }
11 |
12 | static public String newTab(String currentBuilder, Boolean withStructure) {
13 | if(withStructure) currentBuilder += "\t";
14 | return currentBuilder;
15 | }
16 |
17 | static public String writeContext(String currentBuilder, ContextNode currentNode, Boolean withStructure) {
18 | String preSpace = "";
19 | if(withStructure)
20 | for(int i = 0; i < currentNode.depth; i ++)
21 | preSpace += "\t";
22 | currentBuilder += preSpace;
23 | currentBuilder += "<" + (currentNode.prefix != null ? currentNode.prefix + ":" : "") + currentNode.tagName;
24 | for(AttributeNode attributeNode : currentNode.attributeList) {
25 | currentBuilder += " ";
26 | currentBuilder = writeAttribute(currentBuilder, attributeNode);
27 | }
28 | if(currentNode.declareNamespace != null)
29 | currentBuilder += " xmlns=\"" + currentNode.declareNamespace + "\"";
30 | for(Pair prefixPair : currentNode.declarePrefixNamespacePair) {
31 | currentBuilder += " xmlns:" + prefixPair.getLeft() + "=\"" + prefixPair.getRight() + "\"";
32 | }
33 | currentBuilder += ">";
34 | for (ContextNode childNode : currentNode.childList) {
35 | currentBuilder = newLine(currentBuilder, withStructure);
36 | currentBuilder = writeContext(currentBuilder, childNode, withStructure);
37 | }
38 | currentBuilder = newLine(currentBuilder, withStructure);
39 | currentBuilder = newTab(currentBuilder, withStructure);
40 | currentBuilder += preSpace + currentNode.dataContext;
41 | currentBuilder = newLine(currentBuilder, withStructure);
42 | currentBuilder += preSpace + "" + (currentNode.prefix != null ? currentNode.prefix + ":" : "") + currentNode.tagName + ">";
43 | return currentBuilder;
44 | }
45 |
46 | static public String writeContext(String currentBuilder, ContextNode currentNode) {
47 | return writeContext(currentBuilder, currentNode, false);
48 | }
49 |
50 | static public String writeAttribute(String currentBuilder, AttributeNode currentNode) {
51 | currentBuilder += currentNode.tagName + "=\"" + currentNode.dataContext + "\"";
52 | return currentBuilder;
53 | }
54 | }
55 |
--------------------------------------------------------------------------------
/src/main/java/XPress/XPathGeneration/LogicTree/InformationTree/InformationTreeContextInfo.java:
--------------------------------------------------------------------------------
1 | package XPress.XPathGeneration.LogicTree.InformationTree;
2 |
3 | import XPress.DatabaseExecutor.MainExecutor;
4 | import XPress.XPathGeneration.LogicTree.LogicTreeContextInfo;
5 |
6 | public class InformationTreeContextInfo extends LogicTreeContextInfo {
7 | /**
8 | * Starred node id which is recorded in the unique context node.
9 | */
10 | public int starredNodeId;
11 |
12 | /**
13 | * Only set to true when there is a context node in represented subtree.
14 | */
15 | public boolean containsContext = false;
16 |
17 | /**
18 | * If within subtree there is no context node or an ancestor node of the context node is
19 | * with calculated context value is set to true.
20 | */
21 | public boolean constantExpr = false;
22 |
23 | /**
24 | * If set to true unique context node refers to the starred node in context of XPath prefix.
25 | * Else refers to a derived sequence from the starred node with itself as the context or does not contain
26 | * any context node.
27 | */
28 | public boolean selfContext = true;
29 |
30 | public InformationTreeContextInfo() {}
31 |
32 | public InformationTreeContextInfo(MainExecutor mainExecutor, String XPathPrefix, int starredNodeId,
33 | boolean containsContext, boolean constantExpr, boolean selfContext) {
34 | setInfo(mainExecutor, XPathPrefix, starredNodeId, containsContext, constantExpr, selfContext);
35 | }
36 |
37 | public void setInfo(MainExecutor mainExecutor, String XPathPrefix, int starredNodeId,
38 | boolean containsContext, boolean constantExpr, boolean selfContext) {
39 | super.setInfo(mainExecutor, XPathPrefix);
40 | this.starredNodeId = starredNodeId;
41 | this.containsContext = containsContext;
42 | this.constantExpr = constantExpr;
43 | this.selfContext = selfContext;
44 | }
45 |
46 | public InformationTreeContextInfo(InformationTreeContextInfo infoNode) {
47 | inheritInfo(infoNode);
48 | }
49 |
50 | public InformationTreeContextInfo(InformationTreeNode informationTreeNode) {
51 | inheritInfo(informationTreeNode.getContextInfo());
52 | }
53 |
54 | public void inheritInfo(InformationTreeContextInfo infoNode) {
55 | starredNodeId = infoNode.starredNodeId;
56 | containsContext = infoNode.containsContext;
57 | constantExpr = infoNode.constantExpr;
58 | selfContext = infoNode.selfContext;
59 | super.inheritInfo(infoNode);
60 | }
61 | }
62 |
--------------------------------------------------------------------------------
/src/main/java/XPress/XPathGeneration/LogicTree/InformationTree/InformationTreeFunctionNode/ReplaceFunctionNode.java:
--------------------------------------------------------------------------------
1 | package XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode;
2 |
3 | import XPress.DatatypeControl.PrimitiveDatatype.XMLString;
4 | import XPress.GlobalRandom;
5 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeConstantNode;
6 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeNode;
7 |
8 | //@FunctionV3
9 | public class ReplaceFunctionNode extends InformationTreeFunctionNode {
10 | private String internalStr = null;
11 |
12 | public ReplaceFunctionNode() {
13 | datatypeRecorder.xmlDatatype = XMLString.getInstance();
14 | functionExpr = "replace";
15 | }
16 |
17 | @Override
18 | protected void fillContentParameters(InformationTreeNode childNode) {
19 | String subString = GlobalRandom.getInstance().nextSubstring(childList.get(0).getContext().context);
20 | internalStr = subString;
21 | fillContentParametersWithStr(childNode);
22 | }
23 |
24 | @Override
25 | protected void fillContentParametersRandom(InformationTreeNode childNode) {
26 | String subString = XMLString.getInstance().getValueHandler().getValue(false);
27 | internalStr = subString;
28 | fillContentParametersWithStr(childNode);
29 | }
30 |
31 | private void fillContentParametersWithStr(InformationTreeNode childNode) {
32 | if(internalStr.length() == 0) internalStr = "a";
33 | childList.add(new InformationTreeConstantNode(XMLString.getInstance(), internalStr.replaceAll("[{}()*.]", "e").replace('\\', 'q')));
34 | double prob = GlobalRandom.getInstance().nextDouble();
35 | if(prob < 0.6) {
36 | childList.add(new InformationTreeConstantNode(XMLString.getInstance(),
37 | XMLString.getInstance().getValueHandler().getValue(false).replaceAll("[${}()*.]", "c")
38 | .replace('\\', 'z')));
39 | } else {
40 | if(prob < 0.9) childList.add(new InformationTreeConstantNode(XMLString.getInstance(), "$1"));
41 | else {
42 | int num = GlobalRandom.getInstance().nextInt(10) + 1;
43 | childList.add(new InformationTreeConstantNode(XMLString.getInstance(), "$" + num));
44 | }
45 | }
46 | internalStr = null;
47 | }
48 |
49 | @Override
50 | public Boolean checkContextAcceptability(InformationTreeNode childNode) {
51 | return childNode.datatypeRecorder.xmlDatatype instanceof XMLString;
52 | }
53 |
54 |
55 | @Override
56 | public ReplaceFunctionNode newInstance() {
57 | return new ReplaceFunctionNode();
58 | }
59 | }
60 |
--------------------------------------------------------------------------------
/src/main/java/XPress/XPathGeneration/LogicTree/InformationTree/InformationTreeFunctionNode/InformationTreeDirectContentFunctionNode/TextFunctionNode.java:
--------------------------------------------------------------------------------
1 | package XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode.InformationTreeDirectContentFunctionNode;
2 |
3 | import XPress.DatatypeControl.PrimitiveDatatype.XMLMixed;
4 | import XPress.DatatypeControl.PrimitiveDatatype.XMLNode;
5 | import XPress.DatatypeControl.PrimitiveDatatype.XMLSequence;
6 | import XPress.XMLGeneration.ContextNode;
7 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeFunctionNode.FunctionV1;
8 | import XPress.XPathGeneration.LogicTree.InformationTree.InformationTreeNode;
9 |
10 | @FunctionV1
11 | public class TextFunctionNode extends InformationTreeDirectContentFunctionNode {
12 | public TextFunctionNode() {
13 | functionExpr = "text";
14 | }
15 |
16 | @Override
17 | protected void fillContentParameters(InformationTreeNode childNode) {
18 | int nodeId;
19 | if(childNode.datatypeRecorder.xmlDatatype instanceof XMLNode) {
20 | nodeId = Integer.parseInt(childNode.getContext().context);
21 | }
22 | else {
23 | // Else is applied to a sequence of nodes
24 | nodeId = Integer.parseInt(childNode.getContext().supplementaryContext);
25 | }
26 | ContextNode contextNode = contextInfo.mainExecutor.contextNodeMap.get(nodeId);
27 | if(childNode.datatypeRecorder.xmlDatatype instanceof XMLNode) {
28 | datatypeRecorder.xmlDatatype = contextNode.dataType;
29 | }
30 | else {
31 | datatypeRecorder.xmlDatatype = XMLSequence.getInstance();
32 | datatypeRecorder.subDatatype = contextNode.dataType;
33 | }
34 | }
35 |
36 | @Override
37 | protected void fillContentParametersRandom(InformationTreeNode childNode) {
38 | datatypeRecorder.xmlDatatype = XMLSequence.getInstance();
39 | datatypeRecorder.subDatatype = XMLMixed.getInstance();
40 | }
41 |
42 | @Override
43 | public Boolean checkContextAcceptability(InformationTreeNode childNode) {
44 | Boolean checkResult = (childNode.datatypeRecorder.xmlDatatype instanceof XMLNode && !childNode.datatypeRecorder.nodeMix);
45 | if (!checkResult) {
46 | if (childNode.datatypeRecorder.xmlDatatype instanceof XMLSequence &&
47 | childNode.datatypeRecorder.subDatatype instanceof XMLNode &&
48 | (!childNode.datatypeRecorder.nodeMix))
49 | checkResult = true;
50 | }
51 | return checkResult;
52 | }
53 |
54 | @Override
55 | public TextFunctionNode newInstance() {
56 | return new TextFunctionNode();
57 | }
58 | }
59 |
--------------------------------------------------------------------------------
/docs/Found Bugs.md:
--------------------------------------------------------------------------------
1 | ## Found Bugs
2 |
3 | ### BaseX Found Bugs
4 |
5 | 1. Error in arithmetic calculation result comparison https://github.com/BaseXdb/basex/issues/2188
6 | 2. Unexpected exception of division by zero https://github.com/BaseXdb/basex/issues/2189
7 | 3. Bug of operation on non-existing attribute https://github.com/BaseXdb/basex/issues/2190
8 | 4. Bug on node selection with last() https://github.com/BaseXdb/basex/issues/2191
9 | 5. Bug on child node selection with count() https://github.com/BaseXdb/basex/issues/2193
10 | 6. Bug on node selection with self axis https://github.com/BaseXdb/basex/issues/2194
11 | 7. Internal crash on has-children() result comparison https://github.com/BaseXdb/basex/issues/2213
12 | 8. Incorrect result for count after subsequence https://github.com/BaseXdb/basex/issues/2214
13 | 9. Unexpected exception of mapping double attributes https://github.com/BaseXdb/basex/issues/2215
14 | 10. Bug on map operation of empty sequence https://github.com/BaseXdb/basex/issues/2216
15 | 11. Bug on consecutive map with distinct-values https://github.com/BaseXdb/basex/issues/2217
16 | 12. Bug on node selection with position() https://github.com/BaseXdb/basex/issues/2219
17 | 13. Bug on arithmetic operations with last() and position() https://github.com/BaseXdb/basex/issues/2220
18 | 14. Bug on contains-token() with token index https://github.com/BaseXdb/basex/issues/2222
19 | 15. Unexpected exception of arithemetic operations with positional expression https://github.com/BaseXdb/basex/issues/2224
20 | 16. Incorrect result count with multiple sequence operators https://github.com/BaseXdb/basex/issues/2225
21 |
22 | _______
23 |
24 | ### eXist Found Bugs
25 |
26 | 1. Bug of node selection of tail() after subsequence() https://github.com/eXist-db/exist/issues/4830
27 | 2. Query with index after predicate selection https://github.com/eXist-db/exist/issues/4968
28 | 3. Fails to select node with true predicatehttps://github.com/eXist-db/exist/issues/4958
29 | 4. Bug on selecting nodes with last() https://github.com/eXist-db/exist/issues/4824
30 | 5. Simple node selection return duplicate nodes https://github.com/eXist-db/exist/issues/4811
31 | 6. Wrong results on start-with comparison https://github.com/eXist-db/exist/issues/4810
32 |
33 | ____
34 |
35 | ### Saxon Found Bugs
36 |
37 | 1. Bug on exist() with non-existing attribute https://saxonica.plan.io/issues/6051
38 | 2. Bug on predicate with last() https://saxonica.plan.io/issues/6093
39 | 3. Bug on "-" castable to xs:duration https://saxonica.plan.io/issues/6059
40 | 4. NullPointerException with upper-case function https://saxonica.plan.io/issues/6067
41 |
42 | ___
43 |
44 | ### Oracle Found Bugs
45 |
46 | 1. Bug on selecting node with self axis
47 | 2. Bug on comparison of last to negative value
48 |
49 |
--------------------------------------------------------------------------------