├── .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 | 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 | 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 | 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 | 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 | 9 | 10 | 14 | 15 | 19 | 20 | 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 + ""; 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 | --------------------------------------------------------------------------------