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