From faeaa445f94cd1650bccce6f90fcdaa83b096755 Mon Sep 17 00:00:00 2001 From: Zane Dunnings <zldunn@umich.edu> Date: Mon, 9 Apr 2018 13:38:20 -0400 Subject: [PATCH] QL works with nested parentheses (sp) --- query/queryLanguage/QueryParser.cpp | 45 +++++++++++++++++-- query/queryLanguage/tests/testQueryParser.cpp | 2 +- util/stringProcessing.cpp | 9 +++- util/tests/stringProcessingTest.cpp | 2 +- 4 files changed, 52 insertions(+), 6 deletions(-) diff --git a/query/queryLanguage/QueryParser.cpp b/query/queryLanguage/QueryParser.cpp index 9d79ee2..0950f23 100644 --- a/query/queryLanguage/QueryParser.cpp +++ b/query/queryLanguage/QueryParser.cpp @@ -130,6 +130,25 @@ vector<Tuple * > QueryParser::breakOnOR( string input ) if( query[ i ] == "(") { ++depth; + ++i; + string text; + + while ( depth != 0) + { + if( query[ i ] == "(") + ++depth; + else if ( query[ i ] == ")") + --depth; + if( depth != 0) + { + if( text!= "") + text+=" "; + text+=query[ i ]; + } + } + Tuple * subConstraint = Constraint( text ); + constraintList.push_back( subConstraint ); + start = i + 1; } else if( query[ i ] == ")") { @@ -173,7 +192,7 @@ vector<Tuple * > QueryParser::breakOnOR( string input ) */ bool QueryParser::isOrType( string input ) { - vector<string> query = splitStr (input, ' ', true); + vector<string> query = splitStr (input, ' ', false); int depth = 0; for( auto word = query.begin(); word != query.end(); ++word ) { @@ -198,7 +217,7 @@ bool QueryParser::isOrType( string input ) */ bool QueryParser::isAndType( string input ) { - vector<string> query = splitStr (input, ' ', true); + vector<string> query = splitStr (input, ' ', false); if( query.size( ) == 1) return false; @@ -238,7 +257,7 @@ vector<Tuple * > QueryParser::breakOnAND( string input ) closedBracket.insert(')'); closedBracket.insert('}'); closedBracket.insert(']'); - vector<string> query = splitStr (input, ' ', true); + vector<string> query = splitStr (input, ' ', false); vector<Tuple *> constraintList; int start = 0; @@ -248,6 +267,26 @@ vector<Tuple * > QueryParser::breakOnAND( string input ) if( query[ i ] == "(") { ++depth; + ++i; + string text; + + while ( depth != 0) + { + if( query[ i ] == "(") + ++depth; + else if ( query[ i ] == ")") + --depth; + if( depth != 0) + { + if( text!= "") + text+=" "; + text+=query[ i ]; + } + ++i; + } + Tuple * subConstraint = Constraint( text ); + constraintList.push_back( subConstraint ); + start = i + 1; } else if( query[ i ] == ")") { diff --git a/query/queryLanguage/tests/testQueryParser.cpp b/query/queryLanguage/tests/testQueryParser.cpp index 9e44ad7..f404e38 100644 --- a/query/queryLanguage/tests/testQueryParser.cpp +++ b/query/queryLanguage/tests/testQueryParser.cpp @@ -13,7 +13,7 @@ int main() parser.parse( query ); parser.printCompiledQuery(); - string query1 = " apollo moon (landing OR fake)"; + string query1 = " apollo moon ( landing OR fake )"; QueryParser parser1; parser1.parse( query1 ); parser1.printCompiledQuery (); diff --git a/util/stringProcessing.cpp b/util/stringProcessing.cpp index 5d5b678..1f6ea83 100644 --- a/util/stringProcessing.cpp +++ b/util/stringProcessing.cpp @@ -210,7 +210,14 @@ vector< string > splitStr ( string originalText, char delim, bool removeSyms ) string word = ""; while ( begin != delim && i < originalText.size( ) ) { - if ( removeSyms && ( isAlpha( begin ) || isNum( begin ) ) ) + if ( removeSyms) + { + if( isAlpha( begin ) || isNum( begin ) ) + { + word.push_back( begin ); + } + } + else { word.push_back( begin ); } diff --git a/util/tests/stringProcessingTest.cpp b/util/tests/stringProcessingTest.cpp index 11ae03c..6c22194 100644 --- a/util/tests/stringProcessingTest.cpp +++ b/util/tests/stringProcessingTest.cpp @@ -145,7 +145,7 @@ void testSplitStr ( string original ) assert( vec[ 0 ] == "hello" && vec[ 1 ] == "goodbye" ); word = "apollo moon OR landing"; - vec = splitStr( word, ' ', true ); + vec = splitStr( word, ' ', false ); assert( vec.size( ) == 4 ); assert( vec[ 0 ] == "apollo" && vec[ 1 ] == "moon" && vec[ 2 ] == "OR" && vec[ 3 ] == "landing" ); -- GitLab