Repository: paustint/soql-parser-js
Pull request #11 (2018-10-10 03:05:27)

Feature 5 6 new


Patch:
diff --git a/build/app/SoqlListener.js b/build/app/SoqlListener.js
index 03e14b8..b6a9436 100644
--- a/build/app/SoqlListener.js
+++ b/build/app/SoqlListener.js
@@ -12,98 +12,119 @@ class Listener {
             currSubqueryIdx: -1,
             currWhereConditionGroupIdx: 0,
             currentItem: null,
+            inWhereClauseGroup: false,
             tempData: null,
         };
         config.logging = _.isBoolean(config.logging) ? config.logging : false;
         config.includeSubqueryAsField = _.isBoolean(config.includeSubqueryAsField) ? config.includeSubqueryAsField : true;
         this.soqlQuery = new SoqlQuery_model_1.SoqlQuery();
     }
+    visitTerminal(ctx) {
+        if (this.config.logging) {
+            console.log('visitTerminal:', ctx.text);
+        }
+        if (this.context.currentItem === 'where') {
+            if (['NOT'].includes(ctx.text)) {
+                this.context.tempData.nextHasLogicalPrefix = ctx.text;
+            }
+            else if (['AND', 'OR'].includes(ctx.text)) {
+                this.context.tempData.currConditionOperation.operator = ctx.text;
+                // Because there is an operator, we know the right side will have at least one more condition
+                // reset current condition
+                this.context.tempData.currConditionOperation.right = {
+                    left: null,
+                };
+                this.context.tempData.currConditionOperation = this.context.tempData.currConditionOperation.right;
+                this.context.tempData.stack.push(this.context.tempData.currConditionOperation);
+            }
+        }
+    }
     getSoqlQuery() {
         return this.context.isSubQuery ? this.soqlQuery.subqueries[this.context.currSubqueryIdx] : this.soqlQuery;
     }
     enterKeywords_alias_allowed(ctx) {
         if (this.config.logging) {
-            console.log('enterKeywords_alias_allowed', ctx);
+            console.log('enterKeywords_alias_allowed:', ctx.text);
         }
     }
     exitKeywords_alias_allowed(ctx) {
         if (this.config.logging) {
-            console.log('exitKeywords_alias_allowed', ctx);
+            console.log('exitKeywords_alias_allowed:', ctx.text);
         }
     }
     enterKeywords_name_allowed(ctx) {
         if (this.config.logging) {
-            console.log('enterKeywords_name_allowed', ctx);
+            console.log('enterKeywords_name_allowed:', ctx.text);
         }
     }
     exitKeywords_name_allowed(ctx) {
         if (this.config.logging) {
-            console.log('exitKeywords_name_allowed', ctx);
+            console.log('exitKeywords_name_allowed:', ctx.text);
         }
     }
     enterName(ctx) {
         if (this.config.logging) {
-            console.log('enterName', ctx);
+            console.log('enterName:', ctx.text);
         }
     }
     exitName(ctx) {
         if (this.config.logging) {
-            console.log('exitName', ctx);
+            console.log('exitName:', ctx.text);
         }
     }
     enterObject_name(ctx) {
         if (this.config.logging) {
-            console.log('enterObject_name', ctx);
+            console.log('enterObject_name:', ctx.text);
         }
     }
     exitObject_name(ctx) {
         if (this.config.logging) {
-            console.log('exitObject_name', ctx);
+            console.log('exitObject_name:', ctx.text);
         }
     }
     enterField_name(ctx) {
         if (this.config.logging) {
-            console.log('enterField_name', ctx);
+            console.log('enterField_name:', ctx.text);
         }
     }
     exitField_name(ctx) {
         if (this.config.logging) {
-            console.log('exitField_name', ctx);
+            console.log('exitField_name:', ctx.text);
         }
     }
     enterFilter_scope_name(ctx) {
         if (this.config.logging) {
-            console.log('enterFilter_scope_name', ctx);
+            console.log('enterFilter_scope_name:', ctx.text);
         }
     }
     exitFilter_scope_name(ctx) {
         if (this.config.logging) {
-            console.log('exitFilter_scope_name', ctx);
+            console.log('exitFilter_scope_name:', ctx.text);
         }
     }
     enterData_category_group_name(ctx) {
         if (this.config.logging) {
-            console.log('enterData_category_group_name', ctx);
+            console.log('enterData_category_group_name:', ctx.text);
         }
     }
     exitData_category_group_name(ctx) {
         if (this.config.logging) {
-            console.log('exitData_category_group_name', ctx);
+            console.log('exitData_category_group_name:', ctx.text);
         }
     }
     enterData_category_name(ctx) {
         if (this.config.logging) {
-            console.log('enterData_category_name', ctx);
+            console.log('enterData_category_name:', ctx.text);
         }
     }
     exitData_category_name(ctx) {
         if (this.config.logging) {
-            console.log('exitData_category_name', ctx);
+            console.log('exitData_category_name:', ctx.text);
         }
     }
     enterAlias_name(ctx) {
         if (this.config.logging) {
-            console.log('enterAlias_name', ctx);
+            console.log('enterAlias_name:', ctx.text);
         }
         if (this.context.currentItem === 'from') {
             this.soqlQuery.sObjectAlias = ctx.text;
@@ -133,62 +154,62 @@ class Listener {
     }
     exitAlias_name(ctx) {
         if (this.config.logging) {
-            console.log('exitAlias_name', ctx);
+            console.log('exitAlias_name:', ctx.text);
         }
     }
     enterAlias(ctx) {
         if (this.config.logging) {
-            console.log('enterAlias', ctx);
+            console.log('enterAlias:', ctx.text);
         }
     }
     exitAlias(ctx) {
         if (this.config.logging) {
-            console.log('exitAlias', ctx);
+            console.log('exitAlias:', ctx.text);
         }
     }
     enterLiteral(ctx) {
         if (this.config.logging) {
-            console.log('enterLiteral', ctx);
+            console.log('enterLiteral:', ctx.text);
         }
     }
     exitLiteral(ctx) {
         if (this.config.logging) {
-            console.log('exitLiteral', ctx);
+            console.log('exitLiteral:', ctx.text);
         }
     }
     enterDate_formula_literal(ctx) {
         if (this.config.logging) {
-            console.log('enterDate_formula_literal', ctx);
+            console.log('enterDate_formula_literal:', ctx.text);
         }
     }
     exitDate_formula_literal(ctx) {
         if (this.config.logging) {
-            console.log('exitDate_formula_literal', ctx);
+            console.log('exitDate_formula_literal:', ctx.text);
         }
     }
     enterDate_formula_n_literal_name(ctx) {
         if (this.config.logging) {
-            console.log('enterDate_formula_n_literal_name', ctx);
+            console.log('enterDate_formula_n_literal_name:', ctx.text);
         }
     }
     exitDate_formula_n_literal_name(ctx) {
         if (this.config.logging) {
-            console.log('exitDate_formula_n_literal_name', ctx);
+            console.log('exitDate_formula_n_literal_name:', ctx.text);
         }
     }
     enterDate_formula_n_literal(ctx) {
         if (this.config.logging) {
-            console.log('enterDate_formula_n_literal', ctx);
+            console.log('enterDate_formula_n_literal:', ctx.text);
         }
     }
     exitDate_formula_n_literal(ctx) {
         if (this.config.logging) {
-            console.log('exitDate_formula_n_literal', ctx);
+            console.log('exitDate_formula_n_literal:', ctx.text);
         }
     }
     enterDatetime_literal(ctx) {
         if (this.config.logging) {
-            console.log('enterDatetime_literal', ctx);
+            console.log('enterDatetime_literal:', ctx.text);
         }
         if (this.context.currentItem === 'field') {
             this.context.tempData.type = 'datetime';
@@ -196,12 +217,12 @@ class Listener {
     }
     exitDatetime_literal(ctx) {
         if (this.config.logging) {
-            console.log('exitDatetime_literal', ctx);
+            console.log('exitDatetime_literal:', ctx.text);
         }
     }
     enterDate_literal(ctx) {
         if (this.config.logging) {
-            console.log('enterDate_literal', ctx);
+            console.log('enterDate_literal:', ctx.text);
         }
         if (this.context.currentItem === 'field') {
             this.context.tempData.type = 'date';
@@ -209,12 +230,12 @@ class Listener {
     }
     exitDate_literal(ctx) {
         if (this.config.logging) {
-            console.log('exitDate_literal', ctx);
+            console.log('exitDate_literal:', ctx.text);
         }
     }
     enterInteger_literal(ctx) {
         if (this.config.logging) {
-            console.log('enterInteger_literal', ctx);
+            console.log('enterInteger_literal:', ctx.text);
         }
         if (this.context.currentItem === 'field') {
             this.context.tempData.type = 'integer';
@@ -222,52 +243,52 @@ class Listener {
     }
     exitInteger_literal(ctx) {
         if (this.config.logging) {
-            console.log('exitInteger_literal', ctx);
+            console.log('exitInteger_literal:', ctx.text);
         }
     }
     enterReal_literal(ctx) {
         if (this.config.logging) {
-            console.log('enterReal_literal', ctx);
+            console.log('enterReal_literal:', ctx.text);
         }
     }
     exitReal_literal(ctx) {
         if (this.config.logging) {
-            console.log('exitReal_literal', ctx);
+            console.log('exitReal_literal:', ctx.text);
         }
     }
     enterString_literal(ctx) {
         if (this.config.logging) {
-            console.log('enterString_literal', ctx);
+            console.log('enterString_literal:', ctx.text);
         }
     }
     exitString_literal(ctx) {
         if (this.config.logging) {
-            console.log('exitString_literal', ctx);
+            console.log('exitString_literal:', ctx.text);
         }
     }
     enterBoolean_literal(ctx) {
         if (this.config.logging) {
-            console.log('enterBoolean_literal', ctx);
+            console.log('enterBoolean_literal:', ctx.text);
         }
     }
     exitBoolean_literal(ctx) {
         if (this.config.logging) {
-            console.log('exitBoolean_literal', ctx);
+            console.log('exitBoolean_literal:', ctx.text);
         }
     }
     enterNull_literal(ctx) {
         if (this.config.logging) {
-            console.log('enterNull_literal', ctx);
+            console.log('enterNull_literal:', ctx.text);
         }
     }
     exitNull_literal(ctx) {
         if (this.config.logging) {
-            console.log('exitNull_literal', ctx);
+            console.log('exitNull_literal:', ctx.text);
         }
     }
     enterFunction_name(ctx) {
         if (this.config.logging) {
-            console.log('enterFunction_name', ctx);
+            console.log('enterFunction_name:', ctx.text);
         }
         if (this.context.currentItem === 'field') {
             this.context.tempData.name = ctx.text;
@@ -281,183 +302,193 @@ class Listener {
     }
     exitFunction_name(ctx) {
         if (this.config.logging) {
-            console.log('exitFunction_name', ctx);
+            console.log('exitFunction_name:', ctx.text);
         }
     }
     enterFunction_date(ctx) {
         if (this.config.logging) {
-            console.log('enterFunction_date', ctx);
+            console.log('enterFunction_date:', ctx.text);
         }
     }
     exitFunction_date(ctx) {
         if (this.config.logging) {
-            console.log('exitFunction_date', ctx);
+            console.log('exitFunction_date:', ctx.text);
         }
     }
     enterFunction_aggregate(ctx) {
         if (this.config.logging) {
-            console.log('enterFunction_aggregate', ctx);
+            console.log('enterFunction_aggregate:', ctx.text);
         }
     }
     exitFunction_aggregate(ctx) {
         if (this.config.logging) {
-            console.log('exitFunction_aggregate', ctx);
+            console.log('exitFunction_aggregate:', ctx.text);
         }
     }
     enterFunction_location(ctx) {
         if (this.config.logging) {
-            console.log('enterFunction_location', ctx);
+            console.log('enterFunction_location:', ctx.text);
         }
     }
     exitFunction_location(ctx) {
         if (this.config.logging) {
-            console.log('exitFunction_location', ctx);
+            console.log('exitFunction_location:', ctx.text);
         }
     }
     enterFunction_other(ctx) {
         if (this.config.logging) {
-            console.log('enterFunction_other', ctx);
+            console.log('enterFunction_other:', ctx.text);
         }
     }
     exitFunction_other(ctx) {
         if (this.config.logging) {
-            console.log('exitFunction_other', ctx);
+            console.log('exitFunction_other:', ctx.text);
         }
     }
     enterSoql_query(ctx) {
         if (this.config.logging) {
-            console.log('enterSoql_query', ctx);
+            console.log('enterSoql_query:', ctx.text);
         }
     }
     exitSoql_query(ctx) {
         if (this.config.logging) {
-            console.log('exitSoql_query', ctx);
+            console.log('exitSoql_query:', ctx.text);
         }
     }
     enterSelect_clause(ctx) {
         if (this.config.logging) {
-            console.log('enterSelect_clause', ctx);
+            console.log('enterSelect_clause:', ctx.text);
         }
     }
     exitSelect_clause(ctx) {
         if (this.config.logging) {
-            console.log('exitSelect_clause', ctx);
+            console.log('exitSelect_clause:', ctx.text);
         }
     }
     enterFrom_clause(ctx) {
         if (this.config.logging) {
-            console.log('enterFrom_clause', ctx);
+            console.log('enterFrom_clause:', ctx.text);
         }
         this.context.currentItem = 'from';
     }
     exitFrom_clause(ctx) {
         if (this.config.logging) {
-            console.log('exitFrom_clause', ctx);
+            console.log('exitFrom_clause:', ctx.text);
         }
     }
     enterUsing_clause(ctx) {
         if (this.config.logging) {
-            console.log('enterUsing_clause', ctx);
+            console.log('enterUsing_clause:', ctx.text);
         }
     }
     exitUsing_clause(ctx) {
         if (this.config.logging) {
-            console.log('exitUsing_clause', ctx);
+            console.log('exitUsing_clause:', ctx.text);
         }
     }
     enterWhere_clause(ctx) {
         if (this.config.logging) {
-            console.log('enterWhere_clause', ctx);
+            console.log('enterWhere_clause:', ctx.text);
         }
         this.context.currentItem = 'where';
+        const currConditionOperation = {
+            left: null,
+        };
+        this.context.tempData = {
+            stack: [currConditionOperation],
+            currConditionOperation,
+            data: currConditionOperation,
+        };
     }
     exitWhere_clause(ctx) {
         if (this.config.logging) {
-            console.log('exitWhere_clause', ctx);
+            console.log('exitWhere_clause:', ctx.text);
         }
+        this.getSoqlQuery().whereClause = this.context.tempData.data;
+        this.context.tempData = null;
     }
     enterGroupby_clause(ctx) {
         if (this.config.logging) {
-            console.log('enterGroupby_clause', ctx);
+            console.log('enterGroupby_clause:', ctx.text);
         }
         this.context.currentItem = 'groupby';
         this.context.tempData = { field: null };
     }
     exitGroupby_clause(ctx) {
         if (this.config.logging) {
-            console.log('exitGroupby_clause', ctx);
+            console.log('exitGroupby_clause:', ctx.text);
         }
         this.getSoqlQuery().groupBy = this.context.tempData;
     }
     enterHaving_clause(ctx) {
         if (this.config.logging) {
-            console.log('enterHaving_clause', ctx);
+            console.log('enterHaving_clause:', ctx.text);
         }
         this.context.currentItem = 'having';
     }
     exitHaving_clause(ctx) {
         if (this.config.logging) {
-            console.log('exitHaving_clause', ctx);
+            console.log('exitHaving_clause:', ctx.text);
         }
         this.getSoqlQuery().having = this.context.tempData;
     }
     enterOrderby_clause(ctx) {
         if (this.config.logging) {
-            console.log('enterOrderby_clause', ctx);
+            console.log('enterOrderby_clause:', ctx.text);
         }
         this.context.currentItem = 'orderby';
         this.context.tempData = {};
     }
     exitOrderby_clause(ctx) {
         if (this.config.logging) {
-            console.log('exitOrderby_clause', ctx);
+            console.log('exitOrderby_clause:', ctx.text);
         }
     }
     enterLimit_clause(ctx) {
         if (this.config.logging) {
-            console.log('enterLimit_clause', ctx);
+            console.log('enterLimit_clause:', ctx.text);
         }
         this.getSoqlQuery().limit = Number(ctx.getChild(1).text);
     }
     exitLimit_clause(ctx) {
         if (this.config.logging) {
-            console.log('exitLimit_clause', ctx);
+            console.log('exitLimit_clause:', ctx.text);
         }
     }
     enterOffset_clause(ctx) {
         if (this.config.logging) {
-            console.log('enterOffset_clause', ctx);
+            console.log('enterOffset_clause:', ctx.text);
         }
         this.getSoqlQuery().offset = Number(ctx.getChild(1).text);
     }
     exitOffset_clause(ctx) {
         if (this.config.logging) {
-            console.log('exitOffset_clause', ctx);
+            console.log('exitOffset_clause:', ctx.text);
         }
     }
     enterFor_clause(ctx) {
         if (this.config.logging) {
-            console.log('enterFor_clause', ctx);
+            console.log('enterFor_clause:', ctx.text);
         }
     }
     exitFor_clause(ctx) {
         if (this.config.logging) {
-            console.log('exitFor_clause', ctx);
+            console.log('exitFor_clause:', ctx.text);
         }
     }
     enterUpdate_clause(ctx) {
         if (this.config.logging) {
-            console.log('enterUpdate_clause', ctx);
+            console.log('enterUpdate_clause:', ctx.text);
         }
     }
     exitUpdate_clause(ctx) {
         if (this.config.logging) {
-            console.log('exitUpdate_clause', ctx);
+            console.log('exitUpdate_clause:', ctx.text);
         }
     }
     enterSoql_subquery(ctx) {
         if (this.config.logging) {
-            console.log('enterSoql_subquery', ctx);
+            console.log('enterSoql_subquery:', ctx.text);
         }
         this.context.isSubQuery = true;
         this.soqlQuery.subqueries.push(new SoqlQuery_model_1.SoqlQuery());
@@ -465,46 +496,46 @@ class Listener {
     }
     exitSoql_subquery(ctx) {
         if (this.config.logging) {
-            console.log('exitSoql_subquery', ctx);
+            console.log('exitSoql_subquery:', ctx.text);
         }
         this.context.isSubQuery = false;
         this.context.currWhereConditionGroupIdx = 0; // ensure reset for base query or next subquery
     }
     enterSubquery_select_clause(ctx) {
         if (this.config.logging) {
-            console.log('enterSubquery_select_clause', ctx);
+            console.log('enterSubquery_select_clause:', ctx.text);
         }
     }
     exitSubquery_select_clause(ctx) {
         if (this.config.logging) {
-            console.log('exitSubquery_select_clause', ctx);
+            console.log('exitSubquery_select_clause:', ctx.text);
         }
     }
     enterSelect_spec(ctx) {
         if (this.config.logging) {
-            console.log('enterSelect_spec', ctx);
+            console.log('enterSelect_spec:', ctx.text);
         }
         this.context.currentItem = 'field';
     }
     exitSelect_spec(ctx) {
         if (this.config.logging) {
-            console.log('exitSelect_spec', ctx);
+            console.log('exitSelect_spec:', ctx.text);
         }
     }
     enterSubquery_select_spec(ctx) {
         if (this.config.logging) {
-            console.log('enterSubquery_select_spec', ctx);
+            console.log('enterSubquery_select_spec:', ctx.text);
         }
         this.context.currentItem = 'field';
     }
     exitSubquery_select_spec(ctx) {
         if (this.config.logging) {
-            console.log('exitSubquery_select_spec', ctx);
+            console.log('exitSubquery_select_spec:', ctx.text);
         }
     }
     enterField_spec(ctx) {
         if (this.config.logging) {
-            console.log('enterField_spec', ctx);
+            console.log('enterField_spec:', ctx.text);
         }
         this.context.currentItem = 'field';
         let relatedFields;
@@ -516,11 +547,11 @@ class Listener {
         }
     }
     // exitField_spec(ctx: Parser.Field_specContext) {
-    //   if(this.config.logging) { console.log('exitField_spec', ctx); }
+    //   if(this.config.logging) { console.log('exitField_spec:', ctx.text); }
     // };
     enterFunction_call_spec(ctx) {
         if (this.config.logging) {
-            console.log('enterFunction_call_spec', ctx);
+            console.log('enterFunction_call_spec:', ctx.text);
         }
         if (this.context.currentItem === 'field') {
             this.context.tempData = {};
@@ -531,7 +562,7 @@ class Listener {
     }
     exitFunction_call_spec(ctx) {
         if (this.config.logging) {
-            console.log('exitFunction_call_spec', ctx);
+            console.log('exitFunction_call_spec:', ctx.text);
         }
         if (this.context.currentItem === 'field') {
             this.getSoqlQuery().fields.push({ fn: this.context.tempData });
@@ -540,17 +571,17 @@ class Listener {
     }
     enterField(ctx) {
         if (this.config.logging) {
-            console.log('enterField', ctx);
+            console.log('enterField:', ctx.text);
         }
     }
     exitField(ctx) {
         if (this.config.logging) {
-            console.log('exitField', ctx);
+            console.log('exitField:', ctx.text);
         }
     }
     enterFunction_call(ctx) {
         if (this.config.logging) {
-            console.log('enterFunction_call', ctx);
+            console.log('enterFunction_call:', ctx.text);
         }
         // COUNT(ID) or Count()
         if (this.context.currentItem === 'field') {
@@ -565,22 +596,22 @@ class Listener {
     }
     exitFunction_call(ctx) {
         if (this.config.logging) {
-            console.log('exitFunction_call', ctx);
+            console.log('exitFunction_call:', ctx.text);
         }
     }
     enterFunction_parameter_list(ctx) {
         if (this.config.logging) {
-            console.log('enterFunction_parameter_list', ctx);
+            console.log('enterFunction_parameter_list:', ctx.text);
         }
     }
     exitFunction_parameter_list(ctx) {
         if (this.config.logging) {
-            console.log('exitFunction_parameter_list', ctx);
+            console.log('exitFunction_parameter_list:', ctx.text);
         }
     }
     enterFunction_parameter(ctx) {
         if (this.config.logging) {
-            console.log('enterFunction_parameter', ctx);
+            console.log('enterFunction_parameter:', ctx.text);
         }
         // Get correct fn object based on what is set in tempData (set differently for field vs having)
         if (this.context.currentItem === 'field' ||
@@ -602,72 +633,72 @@ class Listener {
     }
     exitFunction_parameter(ctx) {
         if (this.config.logging) {
-            console.log('exitFunction_parameter', ctx);
+            console.log('exitFunction_parameter:', ctx.text);
         }
     }
     enterTypeof_spec(ctx) {
         if (this.config.logging) {
-            console.log('enterTypeof_spec', ctx);
+            console.log('enterTypeof_spec:', ctx.text);
         }
     }
     exitTypeof_spec(ctx) {
         if (this.config.logging) {
-            console.log('exitTypeof_spec', ctx);
+            console.log('exitTypeof_spec:', ctx.text);
         }
     }
     enterTypeof_when_then_clause_list(ctx) {
         if (this.config.logging) {
-            console.log('enterTypeof_when_then_clause_list', ctx);
+            console.log('enterTypeof_when_then_clause_list:', ctx.text);
         }
     }
     exitTypeof_when_then_clause_list(ctx) {
         if (this.config.logging) {
-            console.log('exitTypeof_when_then_clause_list', ctx);
+            console.log('exitTypeof_when_then_clause_list:', ctx.text);
         }
     }
     enterTypeof_when_then_clause(ctx) {
         if (this.config.logging) {
-            console.log('enterTypeof_when_then_clause', ctx);
+            console.log('enterTypeof_when_then_clause:', ctx.text);
         }
     }
     exitTypeof_when_then_clause(ctx) {
         if (this.config.logging) {
-            console.log('exitTypeof_when_then_clause', ctx);
+            console.log('exitTypeof_when_then_clause:', ctx.text);
         }
     }
     enterTypeof_then_clause(ctx) {
         if (this.config.logging) {
-            console.log('enterTypeof_then_clause', ctx);
+            console.log('enterTypeof_then_clause:', ctx.text);
         }
     }
     exitTypeof_then_clause(ctx) {
         if (this.config.logging) {
-            console.log('exitTypeof_then_clause', ctx);
+            console.log('exitTypeof_then_clause:', ctx.text);
         }
     }
     enterTypeof_else_clause(ctx) {
         if (this.config.logging) {
-            console.log('enterTypeof_else_clause', ctx);
+            console.log('enterTypeof_else_clause:', ctx.text);
         }
     }
     exitTypeof_else_clause(ctx) {
         if (this.config.logging) {
-            console.log('exitTypeof_else_clause', ctx);
+            console.log('exitTypeof_else_clause:', ctx.text);
         }
     }
     enterField_list(ctx) {
         if (this.config.logging) {
-            console.log('enterField_list', ctx);
+            console.log('enterField_list:', ctx.text);
         }
     }
     exitField_list(ctx) {
         if (this.config.logging) {
-            console.log('exitField_list', ctx);
+            console.log('exitField_list:', ctx.text);
         }
     }
     enterObject_spec(ctx) {
         if (this.config.logging) {
-            console.log('enterObject_spec', ctx);
+            console.log('enterObject_spec:', ctx.text);
         }
         this.getSoqlQuery().sObject = ctx.getChild(0).text;
         if (this.config.includeSubqueryAsField && this.context.isSubQuery) {
@@ -678,97 +709,116 @@ class Listener {
     }
     exitObject_spec(ctx) {
         if (this.config.logging) {
-            console.log('exitObject_spec', ctx);
+            console.log('exitObject_spec:', ctx.text);
         }
     }
     enterObject_prefix(ctx) {
         if (this.config.logging) {
-            console.log('enterObject_prefix', ctx);
+            console.log('enterObject_prefix:', ctx.text);
         }
     }
     exitObject_prefix(ctx) {
         if (this.config.logging) {
-            console.log('exitObject_prefix', ctx);
+            console.log('exitObject_prefix:', ctx.text);
         }
     }
     enterComparison_operator(ctx) {
         if (this.config.logging) {
-            console.log('enterComparison_operator', ctx);
+            console.log('enterComparison_operator:', ctx.text);
         }
     }
     exitComparison_operator(ctx) {
         if (this.config.logging) {
-            console.log('exitComparison_operator', ctx);
+            console.log('exitComparison_operator:', ctx.text);
         }
     }
     enterSet_operator(ctx) {
         if (this.config.logging) {
-            console.log('enterSet_operator', ctx);
+            console.log('enterSet_operator:', ctx.text);
         }
     }
     exitSet_operator(ctx) {
         if (this.config.logging) {
-            console.log('exitSet_operator', ctx);
+            console.log('exitSet_operator:', ctx.text);
         }
     }
     enterCondition(ctx) {
         if (this.config.logging) {
-            console.log('enterCondition', ctx);
+            console.log('enterCondition:', ctx.text);
         }
     }
     exitCondition(ctx) {
         if (this.config.logging) {
-            console.log('exitCondition', ctx);
+            console.log('exitCondition:', ctx.text);
         }
     }
     enterCondition1(ctx) {
         if (this.config.logging) {
-            console.log('enterCondition1', ctx);
+            console.log('enterCondition1:', ctx.text);
         }
     }
     exitCondition1(ctx) {
         if (this.config.logging) {
-            console.log('exitCondition1', ctx);
-        }
-        if (this.context.currentItem === 'where' && this.context.tempData) {
-            this.getSoqlQuery().addWhereCondition(this.context.tempData, this.context.currWhereConditionGroupIdx);
-            this.context.tempData = null;
+            console.log('exitCondition1:', ctx.text);
         }
     }
     enterParenthesis(ctx) {
         if (this.config.logging) {
-            console.log('enterParenthesis', ctx);
+            console.log('enterParenthesis:', ctx.text);
+        }
+        if (this.context.currentItem === 'where') {
+            this.context.tempData.nextHasCloseParen = false;
+            this.context.tempData.nextHasOpenParen = true;
         }
     }
     exitParenthesis(ctx) {
         if (this.config.logging) {
-            console.log('exitParenthesis', ctx);
+            console.log('exitParenthesis:', ctx.text);
+        }
+        if (this.context.currentItem === 'where') {
+            if (this.context.tempData.nextHasCloseParen) {
+                this.context.tempData.stack.pop();
+            }
+            this.context.tempData.stack[this.context.tempData.stack.length - 1].left.closeParen = true;
+            this.context.tempData.nextHasCloseParen = true;
         }
-        this.context.currWhereConditionGroupIdx++;
     }
     enterSimple_condition(ctx) {
         if (this.config.logging) {
-            console.log('enterSimple_condition', ctx);
+            console.log('enterSimple_condition:', ctx.text);
         }
     }
     exitSimple_condition(ctx) {
         if (this.config.logging) {
-            console.log('exitSimple_condition', ctx);
+            console.log('exitSimple_condition:', ctx.text);
         }
     }
     enterField_based_condition(ctx) {
         if (this.config.logging) {
-            console.log('enterField_based_condition', ctx);
+            console.log('enterField_based_condition:', ctx.text);
         }
         if (this.config.logging) {
-            console.log('enterLike_based_condition', ctx);
+            console.log('enterLike_based_condition:', ctx.text);
         }
         if (this.context.currentItem === 'where') {
-            this.context.tempData = {
-                field: ctx.getChild(0).text,
-                operator: ctx.getChild(1).text,
-                value: ctx.getChild(2).text,
-            };
+            const currItem = {};
+            if (!this.context.tempData.currConditionOperation.left) {
+                this.context.tempData.currConditionOperation.left = currItem;
+                if (this.context.tempData.nextHasOpenParen) {
+                    currItem.openParen = true;
+                    this.context.tempData.nextHasOpenParen = false;
+                }
+                if (this.context.tempData.nextHasLogicalPrefix) {
+                    currItem.logicalPrefix = this.context.tempData.nextHasLogicalPrefix;
+                    this.context.tempData.nextHasLogicalPrefix = null;
+                }
+            }
+            else {
+                this.context.tempData.currConditionOperation.right = currItem;
+            }
+            currItem.field = ctx.getChild(0).text;
+            currItem.operator = ctx.getChild(1).text;
+            currItem.value = ctx.getChild(2).text;
         }
         if (this.context.currentItem === 'having') {
             this.context.tempData = {
@@ -780,188 +830,217 @@ class Listener {
     }
     exitField_based_condition(ctx) {
         if (this.config.logging) {
-            console.log('exitField_based_condition', ctx);
+            console.log('exitField_based_condition:', ctx.text);
         }
     }
     enterSet_based_condition(ctx) {
         if (this.config.logging) {
-            console.log('enterSet_based_condition', ctx);
+            console.log('enterSet_based_condition:', ctx.text);
         }
-        this.context.tempData = {
-            field: ctx.getChild(0).text,
-            operator: ctx.getChild(1).children.map(child => child.text).join(' '),
-            value: ctx.getChild(2).getChild(1).children
+        if (this.context.currentItem === 'where') {
+            const currItem = {};
+            if (!this.context.tempData.currConditionOperation.left) {
+                this.context.tempData.currConditionOperation.left = currItem;
+                if (this.context.tempData.nextHasOpenParen) {
+                    currItem.openParen = true;
+                    this.context.tempData.nextHasOpenParen = false;
+                }
+                if (this.context.tempData.nextHasLogicalPrefix) {
+                    currItem.logicalPrefix = this.context.tempData.nextHasLogicalPrefix;
+                    this.context.tempData.nextHasLogicalPrefix = null;
+                }
+            }
+            else {
+                this.context.tempData.currConditionOperation.right = currItem;
+            }
+            currItem.field = ctx.getChild(0).text;
+            currItem.operator = ctx.getChild(1).children.map(child => child.text).join(' ');
+            currItem.value = ctx.getChild(2).getChild(1).children
                 .filter(child => !(child instanceof tree_1.TerminalNode))
-                .map(child => child.text),
-        };
+                .map(child => child.text);
+        }
     }
     exitSet_based_condition(ctx) {
         if (this.config.logging) {
-            console.log('exitSet_based_condition', ctx);
+            console.log('exitSet_based_condition:', ctx.text);
         }
     }
     enterLike_based_condition(ctx) {
         if (this.config.logging) {
-            console.log('enterLike_based_condition', ctx);
+            console.log('enterLike_based_condition:', ctx.text);
         }
         if (this.context.currentItem === 'where') {
-            this.context.tempData = {
-                field: ctx.getChild(0).text,
-                operator: 'LIKE',
-                value: ctx.getChild(ctx.children.length - 1).text,
-            };
+            // Set current condition in temp data
+            const currItem = {};
+            if (!this.context.tempData.currConditionOperation.left) {
+                this.context.tempData.currConditionOperation.left = currItem;
+                if (this.context.tempData.nextHasOpenParen) {
+                    currItem.openParen = true;
+                    this.context.tempData.nextHasOpenParen = false;
+                }
+                if (this.context.tempData.nextHasLogicalPrefix) {
+                    currItem.logicalPrefix = this.context.tempData.nextHasLogicalPrefix;
+                    this.context.tempData.nextHasLogicalPrefix = null;
+                }
+            }
+            else {
+                this.context.tempData.currConditionOperation.right = currItem;
+            }
+            currItem.field = ctx.getChild(0).text;
+            currItem.operator = 'LIKE';
+            currItem.value = ctx.getChild(ctx.children.length - 1).text;
         }
     }
     exitLike_based_condition(ctx) {
         if (this.config.logging) {
-            console.log('exitLike_based_condition', ctx);
+            console.log('exitLike_based_condition:', ctx.text);
         }
     }
     enterCondition_field(ctx) {
         if (this.config.logging) {
-            console.log('enterCondition_field', ctx);
+            console.log('enterCondition_field:', ctx.text);
         }
     }
     exitCondition_field(ctx) {
         if (this.config.logging) {
-            console.log('exitCondition_field', ctx);
+            console.log('exitCondition_field:', ctx.text);
         }
     }
     enterSet_values(ctx) {
         if (this.config.logging) {
-            console.log('enterSet_values', ctx);
+            console.log('enterSet_values:', ctx.text);
         }
     }
     exitSet_values(ctx) {
         if (this.config.logging) {
-            console.log('exitSet_values', ctx);
+            console.log('exitSet_values:', ctx.text);
         }
     }
     enterSet_value_list(ctx) {
         if (this.config.logging) {
-            console.log('enterSet_value_list', ctx);
+            console.log('enterSet_value_list:', ctx.text);
         }
     }
     exitSet_value_list(ctx) {
         if (this.config.logging) {
-            console.log('exitSet_value_list', ctx);
+            console.log('exitSet_value_list:', ctx.text);
         }
     }
     enterWith_clause(ctx) {
         if (this.config.logging) {
-            console.log('enterWith_clause', ctx);
+            console.log('enterWith_clause:', ctx.text);
         }
     }
     exitWith_clause(ctx) {
         if (this.config.logging) {
-            console.log('exitWith_clause', ctx);
+            console.log('exitWith_clause:', ctx.text);
         }
     }
     enterWith_plain_clause(ctx) {
         if (this.config.logging) {
-            console.log('enterWith_plain_clause', ctx);
+            console.log('enterWith_plain_clause:', ctx.text);
         }
     }
     exitWith_plain_clause(ctx) {
         if (this.config.logging) {
-            console.log('exitWith_plain_clause', ctx);
+            console.log('exitWith_plain_clause:', ctx.text);
         }
     }
     enterWith_data_category_clause(ctx) {
         if (this.config.logging) {
-            console.log('enterWith_data_category_clause', ctx);
+            console.log('enterWith_data_category_clause:', ctx.text);
         }
     }
     exitWith_data_category_clause(ctx) {
         if (this.config.logging) {
-            console.log('exitWith_data_category_clause', ctx);
+            console.log('exitWith_data_category_clause:', ctx.text);
         }
     }
     enterData_category_spec_list(ctx) {
         if (this.config.logging) {
-            console.log('enterData_category_spec_list', ctx);
+            console.log('enterData_category_spec_list:', ctx.text);
         }
     }
     exitData_category_spec_list(ctx) {
         if (this.config.logging) {
-            console.log('exitData_category_spec_list', ctx);
+            console.log('exitData_category_spec_list:', ctx.text);
         }
     }
     enterData_category_spec(ctx) {
         if (this.config.logging) {
-            console.log('enterData_category_spec', ctx);
+            console.log('enterData_category_spec:', ctx.text);
         }
     }
     exitData_category_spec(ctx) {
         if (this.config.logging) {
-            console.log('exitData_category_spec', ctx);
+            console.log('exitData_category_spec:', ctx.text);
         }
     }
     enterData_category_parameter_list(ctx) {
         if (this.config.logging) {
-            console.log('enterData_category_parameter_list', ctx);
+            console.log('enterData_category_parameter_list:', ctx.text);
         }
     }
     exitData_category_parameter_list(ctx) {
         if (this.config.logging) {
-            console.log('exitData_category_parameter_list', ctx);
+            console.log('exitData_category_parameter_list:', ctx.text);
         }
     }
     enterData_category_selector(ctx) {
         if (this.config.logging) {
-            console.log('enterData_category_selector', ctx);
+            console.log('enterData_category_selector:', ctx.text);
         }
     }
     exitData_category_selector(ctx) {
         if (this.config.logging) {
-            console.log('exitData_category_selector', ctx);
+            console.log('exitData_category_selector:', ctx.text);
         }
     }
     enterGroup_by_plain_clause(ctx) {
         if (this.config.logging) {
-            console.log('enterGroup_by_plain_clause', ctx);
+            console.log('enterGroup_by_plain_clause:', ctx.text);
         }
     }
     exitGroup_by_plain_clause(ctx) {
         if (this.config.logging) {
-            console.log('exitGroup_by_plain_clause', ctx);
+            console.log('exitGroup_by_plain_clause:', ctx.text);
         }
     }
     enterGroup_by_rollup_clause(ctx) {
         if (this.config.logging) {
-            console.log('enterGroup_by_rollup_clause', ctx);
+            console.log('enterGroup_by_rollup_clause:', ctx.text);
         }
         this.context.tempData.type = 'ROLLUP';
     }
     exitGroup_by_rollup_clause(ctx) {
         if (this.config.logging) {
-            console.log('exitGroup_by_rollup_clause', ctx);
+            console.log('exitGroup_by_rollup_clause:', ctx.text);
         }
     }
     enterGroup_by_cube_clause(ctx) {
         if (this.config.logging) {
-            console.log('enterGroup_by_cube_clause', ctx);
+            console.log('enterGroup_by_cube_clause:', ctx.text);
         }
         this.context.tempData.type = 'CUBE';
     }
     exitGroup_by_cube_clause(ctx) {
         if (this.config.logging) {
-            console.log('exitGroup_by_cube_clause', ctx);
+            console.log('exitGroup_by_cube_clause:', ctx.text);
         }
     }
     enterGroup_by_list(ctx) {
         if (this.config.logging) {
-            console.log('enterGroup_by_list', ctx);
+            console.log('enterGroup_by_list:', ctx.text);
         }
     }
     exitGroup_by_list(ctx) {
         if (this.config.logging) {
-            console.log('exitGroup_by_list', ctx);
+            console.log('exitGroup_by_list:', ctx.text);
         }
     }
     enterGroup_by_spec(ctx) {
         if (this.config.logging) {
-            console.log('enterGroup_by_spec', ctx);
+            console.log('enterGroup_by_spec:', ctx.text);
         }
         if (_.isArray(this.context.tempData.field)) {
             this.context.tempData.field.push(ctx.text);
@@ -975,28 +1054,28 @@ class Listener {
     }
     exitGroup_by_spec(ctx) {
         if (this.config.logging) {
-            console.log('exitGroup_by_spec', ctx);
+            console.log('exitGroup_by_spec:', ctx.text);
         }
     }
     enterOrder_by_list(ctx) {
         if (this.config.logging) {
-            console.log('enterOrder_by_list', ctx);
+            console.log('enterOrder_by_list:', ctx.text);
         }
     }
     exitOrder_by_list(ctx) {
         if (this.config.logging) {
-            console.log('exitOrder_by_list', ctx);
+            console.log('exitOrder_by_list:', ctx.text);
         }
     }
     enterOrder_by_spec(ctx) {
         if (this.config.logging) {
-            console.log('enterOrder_by_spec', ctx);
+            console.log('enterOrder_by_spec:', ctx.text);
         }
         this.context.tempData = {};
     }
     exitOrder_by_spec(ctx) {
         if (this.config.logging) {
-            console.log('exitOrder_by_spec', ctx);
+            console.log('exitOrder_by_spec:', ctx.text);
         }
         const soqlQuery = this.getSoqlQuery();
         if (_.isNil(soqlQuery.orderBy)) {
@@ -1011,30 +1090,30 @@ class Listener {
     }
     enterOrder_by_direction_clause(ctx) {
         if (this.config.logging) {
-            console.log('enterOrder_by_direction_clause', ctx);
+            console.log('enterOrder_by_direction_clause:', ctx.text);
         }
         ctx.text;
         this.context.tempData.order = ctx.text.toUpperCase() === 'ASC' ? 'ASC' : 'DESC';
     }
     exitOrder_by_direction_clause(ctx) {
         if (this.config.logging) {
-            console.log('exitOrder_by_direction_clause', ctx);
+            console.log('exitOrder_by_direction_clause:', ctx.text);
         }
     }
     enterOrder_by_nulls_clause(ctx) {
         if (this.config.logging) {
-            console.log('enterOrder_by_nulls_clause', ctx);
+            console.log('enterOrder_by_nulls_clause:', ctx.text);
         }
-        this.context.tempData.nulls = ctx.text.toUpperCase() === 'FIRST' ? 'FIRST' : 'LAST';
+        this.context.tempData.nulls = ctx.getChild(1).text.toUpperCase() === 'FIRST' ? 'FIRST' : 'LAST';
     }
     exitOrder_by_nulls_clause(ctx) {
         if (this.config.logging) {
-            console.log('exitOrder_by_nulls_clause', ctx);
+            console.log('exitOrder_by_nulls_clause:', ctx.text);
         }
     }
     enterOrder_by_field(ctx) {
         if (this.config.logging) {
-            console.log('enterOrder_by_field', ctx);
+            console.log('enterOrder_by_field:', ctx.text);
         }
         // If order by is not a function, set field
         if (ctx.getChild(0) instanceof Parser.Function_callContext) {
@@ -1046,29 +1125,29 @@ class Listener {
     }
     exitOrder_by_field(ctx) {
         if (this.config.logging) {
-            console.log('exitOrder_by_field', ctx);
+            console.log('exitOrder_by_field:', ctx.text);
         }
     }
     enterFor_value(ctx) {
         if (this.config.logging) {
-            console.log('enterFor_value', ctx);
+            console.log('enterFor_value:', ctx.text);
         }
     }
     exitFor_value(ctx) {
         if (this.config.logging) {
-            console.log('exitFor_value', ctx);
+            console.log('exitFor_value:', ctx.text);
         }
     }
     enterUpdate_value(ctx) {
         if (this.config.logging) {
-            console.log('enterUpdate_value', ctx);
+            console.log('enterUpdate_value:', ctx.text);
         }
     }
     exitUpdate_value(ctx) {
         if (this.config.logging) {
-            console.log('exitUpdate_value', ctx);
+            console.log('exitUpdate_value:', ctx.text);
         }
     }
 }
 exports.Listener = Listener;
-//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU29xbExpc3RlbmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwcC9Tb3FsTGlzdGVuZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFPQSxrREFBa0Q7QUFDbEQsOERBQXdGO0FBQ3hGLHdDQUE2QztBQUM3Qyw0QkFBNEI7QUFjNUI7SUFXRSxZQUFvQixTQUFtQyxFQUFFO1FBQXJDLFdBQU0sR0FBTixNQUFNLENBQStCO1FBVnpELFlBQU8sR0FBWTtZQUNqQixVQUFVLEVBQUUsS0FBSztZQUNqQixlQUFlLEVBQUUsQ0FBQyxDQUFDO1lBQ25CLDBCQUEwQixFQUFFLENBQUM7WUFDN0IsV0FBVyxFQUFFLElBQUk7WUFDakIsUUFBUSxFQUFFLElBQUk7U0FDZixDQUFDO1FBS0EsTUFBTSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxNQUFNLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztRQUN0RSxNQUFNLENBQUMsc0JBQXNCLEdBQUcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsc0JBQXNCLENBQUMsR0FBRyxNQUFNLENBQUMsc0JBQXNCLEdBQUcsSUFBSSxDQUFDO1FBQ2xILElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSwyQkFBUyxFQUFFLENBQUM7SUFDbkMsQ0FBQztJQUVELFlBQVk7UUFDVixNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQzVHLENBQUM7SUFFRCwyQkFBMkIsQ0FBQyxHQUF5QztRQUNuRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDeEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyw2QkFBNkIs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
\ No newline at end of file
+//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU29xbExpc3RlbmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwcC9Tb3FsTGlzdGVuZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFPQSxrREFBa0Q7QUFDbEQsOERBQXlHO0FBQ3pHLHdDQUE2QztBQUM3Qyw0QkFBNEI7QUFlNUI7SUFZRSxZQUFvQixTQUFtQyxFQUFFO1FBQXJDLFdBQU0sR0FBTixNQUFNLENBQStCO1FBWHpELFlBQU8sR0FBWTtZQUNqQixVQUFVLEVBQUUsS0FBSztZQUNqQixlQUFlLEVBQUUsQ0FBQyxDQUFDO1lBQ25CLDBCQUEwQixFQUFFLENBQUM7WUFDN0IsV0FBVyxFQUFFLElBQUk7WUFDakIsa0JBQWtCLEVBQUUsS0FBSztZQUN6QixRQUFRLEVBQUUsSUFBSTtTQUNmLENBQUM7UUFLQSxNQUFNLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ3RFLE1BQU0sQ0FBQyxzQkFBc0IsR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxzQkFBc0IsR0FBRyxJQUFJLENBQUM7UUFDbEgsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLDJCQUFTLEVBQUUsQ0FBQztJQUNuQyxDQUFDO0lBRUQsYUFBYSxDQUFDLEdBQWlCO1FBQzdCLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUN4QixPQUFPLENBQUMsR0FBRyxDQUFDLGdCQUFnQixFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxQyxDQUFDO1FBQ0QsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQztZQUN6QyxFQUFFLENBQUMsQ0FB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
\ No newline at end of file
diff --git a/build/app/index.js b/build/app/index.js
index 3f6af28..006fbb3 100644
--- a/build/app/index.js
+++ b/build/app/index.js
@@ -25,9 +25,9 @@ const SoqlParser_1 = require("./SoqlParser");
 // const soqlQueryContext: Soql_queryContext = parser.soql_query();
 // const listener = new Listener();
 const queries = [
-    `SELECT Id, Name, BillingCity FROM Account`,
+    `SELECT Id FROM Account WHERE (Id IN ('1', '2', '3') OR (NOT Id = '2') OR (Name LIKE '%FOO%' OR (Name LIKE '%ARM%' AND FOO = 'bar')))`,
     `SELECT Id FROM Contact WHERE Name LIKE 'A%' AND MailingCity = 'California'`,
-    `SELECT Name FROM Account ORDER BY Name DESC NULLS LAST`,
+    `SELECT Name FROM Account ORDER BY Name DESC NULLS FIRST`,
     `SELECT Name FROM Account WHERE Industry = 'media' LIMIT 125`,
     `SELECT Name FROM Account WHERE Industry = 'media' ORDER BY BillingPostalCode ASC NULLS LAST LIMIT 125`,
     `SELECT COUNT() FROM Contact`,
@@ -57,12 +57,12 @@ const queries = [
     `SELECT Type, BillingCountry, GROUPING(Type) grpType, GROUPING(BillingCountry) grpCty, COUNT(id) accts FROM Account GROUP BY CUBE(Type, BillingCountry) ORDER BY GROUPING(Type), GROUPING(Id, BillingCountry), Name DESC NULLS FIRST, Id ASC NULLS LAST`,
     `SELECT c.Name, c.Account.Name FROM Contact c`,
 ];
-// const query = parseQuery(queries[30], { logging: true });
-// console.log(JSON.stringify(query, null, 2));
-const output = [];
-queries.forEach((soql, i) => {
-    const query = SoqlParser_1.parseQuery(soql, {});
-    output.push({ testCase: i + 1, soql, output: query });
-});
-console.log(JSON.stringify(output, null, 2));
-//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXBwL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBcUJBLDZDQUEwQztBQUUxQywrQkFBK0I7QUFDL0IsOENBQThDO0FBQzlDLG1EQUFtRDtBQUNuRCxlQUFlO0FBQ2YsV0FBVztBQUNYLHFCQUFxQjtBQUNyQiwwQkFBMEI7QUFDMUIsMkJBQTJCO0FBQzNCLHdCQUF3QjtBQUN4QixvQ0FBb0M7QUFDcEMsNEJBQTRCO0FBQzVCLGlDQUFpQztBQUNqQyxzREFBc0Q7QUFDdEQsMENBQTBDO0FBQzFDLG1DQUFtQztBQUNuQyxrREFBa0Q7QUFDbEQseUNBQXlDO0FBQ3pDLDRDQUE0QztBQUM1QyxtQ0FBbUM7QUFDbkMsaUNBQWlDO0FBQ2pDLHNEQUFzRDtBQUV0RCxtRUFBbUU7QUFFbkUsbUNBQW1DO0FBQ25DLE1BQU0sT0FBTyxHQUFHO0lBQ2QsMkNBQTJDO0lBQzNDLDRFQUE0RTtJQUM1RSx3REFBd0Q7SUFDeEQsNkRBQTZEO0lBQzdELHVHQUF1RztJQUN2Ryw2QkFBNkI7SUFDN0IsOERBQThEO0lBQzlELHdFQUF3RTtJQUN4RSw4REFBOEQ7SUFDOUQsdUVBQXVFO0lBQ3ZFLDZEQUE2RDtJQUM3RCw2RUFBNkU7SUFDN0UsMkRBQTJEO0lBQzNELG1GQUFtRjtJQUNuRixnSEFBZ0g7SUFDaEgsMEhBQTBIO0lBQzFILDJGQUEyRjtJQUMzRixpRUFBaUU7SUFDakUsa0ZBQWtGO0lBQ2xGLGlDQUFpQztJQUNqQyx1SUFBdUk7SUFDdkksOERBQThEO0lBQzlELGlKQUFpSjtJQUNqSiw0Q0FBNEM7SUFDNUMsZ0pBQWdKO0lBQ2hKLG9GQUFvRjtJQUNwRixvR0FBb0c7SUFDcEcsMEVBQTBFO0lBQzFFLDBGQUEwRjtJQUMxRix3UEFBd1A7SUFDeFAsOENBQThDO0NBQy9DLENBQUM7QUFFRiw0REFBNEQ7QUFDNUQsK0NBQStDO0FBRS9DLE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQztBQUNsQixPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDdEIsTUFBTSxLQUFLLEdBQUcsdUJBQVUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDbkMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztBQUN4RCxDQUFDLENBQUMsQ0FBQztBQUVILE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMifQ==
\ No newline at end of file
+const query = SoqlParser_1.parseQuery(queries[14], { logging: true });
+console.log(JSON.stringify(query, null, 2));
+// const output = [];
+// queries.forEach((soql, i) => {
+//   const query = parseQuery(soql, {});
+//   output.push({ testCase: i + 1, soql, output: query });
+// });
+// console.log(JSON.stringify(output, null, 2));
+//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXBwL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBcUJBLDZDQUEwQztBQUUxQywrQkFBK0I7QUFDL0IsOENBQThDO0FBQzlDLG1EQUFtRDtBQUNuRCxlQUFlO0FBQ2YsV0FBVztBQUNYLHFCQUFxQjtBQUNyQiwwQkFBMEI7QUFDMUIsMkJBQTJCO0FBQzNCLHdCQUF3QjtBQUN4QixvQ0FBb0M7QUFDcEMsNEJBQTRCO0FBQzVCLGlDQUFpQztBQUNqQyxzREFBc0Q7QUFDdEQsMENBQTBDO0FBQzFDLG1DQUFtQztBQUNuQyxrREFBa0Q7QUFDbEQseUNBQXlDO0FBQ3pDLDRDQUE0QztBQUM1QyxtQ0FBbUM7QUFDbkMsaUNBQWlDO0FBQ2pDLHNEQUFzRDtBQUV0RCxtRUFBbUU7QUFFbkUsbUNBQW1DO0FBQ25DLE1BQU0sT0FBTyxHQUFHO0lBQ2Qsc0lBQXNJO0lBQ3RJLDRFQUE0RTtJQUM1RSx5REFBeUQ7SUFDekQsNkRBQTZEO0lBQzdELHVHQUF1RztJQUN2Ryw2QkFBNkI7SUFDN0IsOERBQThEO0lBQzlELHdFQUF3RTtJQUN4RSw4REFBOEQ7SUFDOUQsdUVBQXVFO0lBQ3ZFLDZEQUE2RDtJQUM3RCw2RUFBNkU7SUFDN0UsMkRBQTJEO0lBQzNELG1GQUFtRjtJQUNuRixnSEFBZ0g7SUFDaEgsMEhBQTBIO0lBQzFILDJGQUEyRjtJQUMzRixpRUFBaUU7SUFDakUsa0ZBQWtGO0lBQ2xGLGlDQUFpQztJQUNqQyx1SUFBdUk7SUFDdkksOERBQThEO0lBQzlELGlKQUFpSjtJQUNqSiw0Q0FBNEM7SUFDNUMsZ0pBQWdKO0lBQ2hKLG9GQUFvRjtJQUNwRixvR0FBb0c7SUFDcEcsMEVBQTBFO0lBQzFFLDBGQUEwRjtJQUMxRix3UEFBd1A7SUFDeFAsOENBQThDO0NBQy9DLENBQUM7QUFFRixNQUFNLEtBQUssR0FBRyx1QkFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQ3pELE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFFNUMscUJBQXFCO0FBQ3JCLGlDQUFpQztBQUNqQyx3Q0FBd0M7QUFDeEMsMkRBQTJEO0FBQzNELE1BQU07QUFFTixnREFBZ0QifQ==
\ No newline at end of file
diff --git a/build/app/models/SoqlQuery.model.js b/build/app/models/SoqlQuery.model.js
index d815462..23e7f32 100644
--- a/build/app/models/SoqlQuery.model.js
+++ b/build/app/models/SoqlQuery.model.js
@@ -4,14 +4,7 @@ class SoqlQuery {
     constructor() {
         this.fields = [];
         this.subqueries = [];
-        this.whereClauseGroups = [];
-    }
-    addWhereCondition(condition, groupIdx) {
-        if (!Array.isArray(this.whereClauseGroups[groupIdx])) {
-            this.whereClauseGroups[groupIdx] = [];
-        }
-        this.whereClauseGroups[groupIdx].push(condition);
     }
 }
 exports.SoqlQuery = SoqlQuery;
-//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU29xbFF1ZXJ5Lm1vZGVsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwcC9tb2RlbHMvU29xbFF1ZXJ5Lm1vZGVsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUE7SUFZRTtRQUNFLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUVELGlCQUFpQixDQUFDLFNBQXNCLEVBQUUsUUFBZ0I7UUFDeEQsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNyRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3hDLENBQUM7UUFDRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ25ELENBQUM7Q0FDRjtBQXhCRCw4QkF3QkMifQ==
\ No newline at end of file
+//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU29xbFF1ZXJ5Lm1vZGVsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwcC9tb2RlbHMvU29xbFF1ZXJ5Lm1vZGVsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBR0E7SUFZRTtRQUNFLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7Q0FDRjtBQWhCRCw4QkFnQkMifQ==
\ No newline at end of file
diff --git a/src/app/SoqlListener.ts b/src/app/SoqlListener.ts
index 4fcd83a..ae2b8ec 100644
--- a/src/app/SoqlListener.ts
+++ b/src/app/SoqlListener.ts
@@ -6,7 +6,7 @@
  */
 import { SOQLListener } from '../generated//SOQLListener';
 import * as Parser from '../generated/SOQLParser';
-import { SoqlQuery, Query, FunctionExp, OrderByClause } from './models/SoqlQuery.model';
+import { SoqlQuery, Query, FunctionExp, OrderByClause, LogicalOperator } from './models/SoqlQuery.model';
 import { TerminalNode } from 'antlr4ts/tree';
 import * as _ from 'lodash';
 import { SoqlQueryConfig } from './SoqlParser';
@@ -19,6 +19,7 @@ interface Context {
   currSubqueryIdx: number;
   currWhereConditionGroupIdx: number;
   currentItem: currItem;
+  inWhereClauseGroup: boolean;
   tempData: any;
 }
 
@@ -28,6 +29,7 @@ export class Listener implements SOQLListener {
     currSubqueryIdx: -1,
     currWhereConditionGroupIdx: 0,
     currentItem: null,
+    inWhereClauseGroup: false,
     tempData: null,
   };
 
@@ -39,93 +41,115 @@ export class Listener implements SOQLListener {
     this.soqlQuery = new SoqlQuery();
   }
 
+  visitTerminal(ctx: TerminalNode) {
+    if (this.config.logging) {
+      console.log('visitTerminal:', ctx.text);
+    }
+    if (this.context.currentItem === 'where') {
+      if (['NOT'].includes(ctx.text)) {
+        this.context.tempData.nextHasLogicalPrefix = ctx.text;
+      } else if (['AND', 'OR'].includes(ctx.text)) {
+        this.context.tempData.currConditionOperation.operator = ctx.text;
+        // Because there is an operator, we know the right side will have at least one more condition
+        // reset current condition
+        this.context.tempData.currConditionOperation.right = {
+          left: null,
+          // right: null,
+          // operator: null,
+        };
+        this.context.tempData.currConditionOperation = this.context.tempData.currConditionOperation.right;
+        this.context.tempData.stack.push(this.context.tempData.currConditionOperation);
+      }
+    }
+  }
+
   getSoqlQuery(): Query {
     return this.context.isSubQuery ? this.soqlQuery.subqueries[this.context.currSubqueryIdx] : this.soqlQuery;
   }
 
   enterKeywords_alias_allowed(ctx: Parser.Keywords_alias_allowedContext) {
     if (this.config.logging) {
-      console.log('enterKeywords_alias_allowed', ctx);
+      console.log('enterKeywords_alias_allowed:', ctx.text);
     }
   }
   exitKeywords_alias_allowed(ctx: Parser.Keywords_alias_allowedContext) {
     if (this.config.logging) {
-      console.log('exitKeywords_alias_allowed', ctx);
+      console.log('exitKeywords_alias_allowed:', ctx.text);
     }
   }
   enterKeywords_name_allowed(ctx: Parser.Keywords_name_allowedContext) {
     if (this.config.logging) {
-      console.log('enterKeywords_name_allowed', ctx);
+      console.log('enterKeywords_name_allowed:', ctx.text);
     }
   }
   exitKeywords_name_allowed(ctx: Parser.Keywords_name_allowedContext) {
     if (this.config.logging) {
-      console.log('exitKeywords_name_allowed', ctx);
+      console.log('exitKeywords_name_allowed:', ctx.text);
     }
   }
   enterName(ctx: Parser.NameContext) {
     if (this.config.logging) {
-      console.log('enterName', ctx);
+      console.log('enterName:', ctx.text);
     }
   }
   exitName(ctx: Parser.NameContext) {
     if (this.config.logging) {
-      console.log('exitName', ctx);
+      console.log('exitName:', ctx.text);
     }
   }
   enterObject_name(ctx: Parser.Object_nameContext) {
     if (this.config.logging) {
-      console.log('enterObject_name', ctx);
+      console.log('enterObject_name:', ctx.text);
     }
   }
   exitObject_name(ctx: Parser.Object_nameContext) {
     if (this.config.logging) {
-      console.log('exitObject_name', ctx);
+      console.log('exitObject_name:', ctx.text);
     }
   }
   enterField_name(ctx: Parser.Field_nameContext) {
     if (this.config.logging) {
-      console.log('enterField_name', ctx);
+      console.log('enterField_name:', ctx.text);
     }
   }
   exitField_name(ctx: Parser.Field_nameContext) {
     if (this.config.logging) {
-      console.log('exitField_name', ctx);
+      console.log('exitField_name:', ctx.text);
     }
   }
   enterFilter_scope_name(ctx: Parser.Filter_scope_nameContext) {
     if (this.config.logging) {
-      console.log('enterFilter_scope_name', ctx);
+      console.log('enterFilter_scope_name:', ctx.text);
     }
   }
   exitFilter_scope_name(ctx: Parser.Filter_scope_nameContext) {
     if (this.config.logging) {
-      console.log('exitFilter_scope_name', ctx);
+      console.log('exitFilter_scope_name:', ctx.text);
     }
   }
   enterData_category_group_name(ctx: Parser.Data_category_group_nameContext) {
     if (this.config.logging) {
-      console.log('enterData_category_group_name', ctx);
+      console.log('enterData_category_group_name:', ctx.text);
     }
   }
   exitData_category_group_name(ctx: Parser.Data_category_group_nameContext) {
     if (this.config.logging) {
-      console.log('exitData_category_group_name', ctx);
+      console.log('exitData_category_group_name:', ctx.text);
     }
   }
   enterData_category_name(ctx: Parser.Data_category_nameContext) {
     if (this.config.logging) {
-      console.log('enterData_category_name', ctx);
+      console.log('enterData_category_name:', ctx.text);
     }
   }
   exitData_category_name(ctx: Parser.Data_category_nameContext) {
     if (this.config.logging) {
-      console.log('exitData_category_name', ctx);
+      console.log('exitData_category_name:', ctx.text);
     }
   }
   enterAlias_name(ctx: Parser.Alias_nameContext) {
     if (this.config.logging) {
-      console.log('enterAlias_name', ctx);
+      console.log('enterAlias_name:', ctx.text);
     }
     if (this.context.currentItem === 'from') {
       this.soqlQuery.sObjectAlias = ctx.text;
@@ -154,62 +178,62 @@ export class Listener implements SOQLListener {
   }
   exitAlias_name(ctx: Parser.Alias_nameContext) {
     if (this.config.logging) {
-      console.log('exitAlias_name', ctx);
+      console.log('exitAlias_name:', ctx.text);
     }
   }
   enterAlias(ctx: Parser.AliasContext) {
     if (this.config.logging) {
-      console.log('enterAlias', ctx);
+      console.log('enterAlias:', ctx.text);
     }
   }
   exitAlias(ctx: Parser.AliasContext) {
     if (this.config.logging) {
-      console.log('exitAlias', ctx);
+      console.log('exitAlias:', ctx.text);
     }
   }
   enterLiteral(ctx: Parser.LiteralContext) {
     if (this.config.logging) {
-      console.log('enterLiteral', ctx);
+      console.log('enterLiteral:', ctx.text);
     }
   }
   exitLiteral(ctx: Parser.LiteralContext) {
     if (this.config.logging) {
-      console.log('exitLiteral', ctx);
+      console.log('exitLiteral:', ctx.text);
     }
   }
   enterDate_formula_literal(ctx: Parser.Date_formula_literalContext) {
     if (this.config.logging) {
-      console.log('enterDate_formula_literal', ctx);
+      console.log('enterDate_formula_literal:', ctx.text);
     }
   }
   exitDate_formula_literal(ctx: Parser.Date_formula_literalContext) {
     if (this.config.logging) {
-      console.log('exitDate_formula_literal', ctx);
+      console.log('exitDate_formula_literal:', ctx.text);
     }
   }
   enterDate_formula_n_literal_name(ctx: Parser.Date_formula_n_literal_nameContext) {
     if (this.config.logging) {
-      console.log('enterDate_formula_n_literal_name', ctx);
+      console.log('enterDate_formula_n_literal_name:', ctx.text);
     }
   }
   exitDate_formula_n_literal_name(ctx: Parser.Date_formula_n_literal_nameContext) {
     if (this.config.logging) {
-      console.log('exitDate_formula_n_literal_name', ctx);
+      console.log('exitDate_formula_n_literal_name:', ctx.text);
     }
   }
   enterDate_formula_n_literal(ctx: Parser.Date_formula_n_literalContext) {
     if (this.config.logging) {
-      console.log('enterDate_formula_n_literal', ctx);
+      console.log('enterDate_formula_n_literal:', ctx.text);
     }
   }
   exitDate_formula_n_literal(ctx: Parser.Date_formula_n_literalContext) {
     if (this.config.logging) {
-      console.log('exitDate_formula_n_literal', ctx);
+      console.log('exitDate_formula_n_literal:', ctx.text);
     }
   }
   enterDatetime_literal(ctx: Parser.Datetime_literalContext) {
     if (this.config.logging) {
-      console.log('enterDatetime_literal', ctx);
+      console.log('enterDatetime_literal:', ctx.text);
     }
     if (this.context.currentItem === 'field') {
       this.context.tempData.type = 'datetime';
@@ -217,12 +241,12 @@ export class Listener implements SOQLListener {
   }
   exitDatetime_literal(ctx: Parser.Datetime_literalContext) {
     if (this.config.logging) {
-      console.log('exitDatetime_literal', ctx);
+      console.log('exitDatetime_literal:', ctx.text);
     }
   }
   enterDate_literal(ctx: Parser.Date_literalContext) {
     if (this.config.logging) {
-      console.log('enterDate_literal', ctx);
+      console.log('enterDate_literal:', ctx.text);
     }
     if (this.context.currentItem === 'field') {
       this.context.tempData.type = 'date';
@@ -230,12 +254,12 @@ export class Listener implements SOQLListener {
   }
   exitDate_literal(ctx: Parser.Date_literalContext) {
     if (this.config.logging) {
-      console.log('exitDate_literal', ctx);
+      console.log('exitDate_literal:', ctx.text);
     }
   }
   enterInteger_literal(ctx: Parser.Integer_literalContext) {
     if (this.config.logging) {
-      console.log('enterInteger_literal', ctx);
+      console.log('enterInteger_literal:', ctx.text);
     }
     if (this.context.currentItem === 'field') {
       this.context.tempData.type = 'integer';
@@ -243,52 +267,52 @@ export class Listener implements SOQLListener {
   }
   exitInteger_literal(ctx: Parser.Integer_literalContext) {
     if (this.config.logging) {
-      console.log('exitInteger_literal', ctx);
+      console.log('exitInteger_literal:', ctx.text);
     }
   }
   enterReal_literal(ctx: Parser.Real_literalContext) {
     if (this.config.logging) {
-      console.log('enterReal_literal', ctx);
+      console.log('enterReal_literal:', ctx.text);
     }
   }
   exitReal_literal(ctx: Parser.Real_literalContext) {
     if (this.config.logging) {
-      console.log('exitReal_literal', ctx);
+      console.log('exitReal_literal:', ctx.text);
     }
   }
   enterString_literal(ctx: Parser.String_literalContext) {
     if (this.config.logging) {
-      console.log('enterString_literal', ctx);
+      console.log('enterString_literal:', ctx.text);
     }
   }
   exitString_literal(ctx: Parser.String_literalContext) {
     if (this.config.logging) {
-      console.log('exitString_literal', ctx);
+      console.log('exitString_literal:', ctx.text);
     }
   }
   enterBoolean_literal(ctx: Parser.Boolean_literalContext) {
     if (this.config.logging) {
-      console.log('enterBoolean_literal', ctx);
+      console.log('enterBoolean_literal:', ctx.text);
     }
   }
   exitBoolean_literal(ctx: Parser.Boolean_literalContext) {
     if (this.config.logging) {
-      console.log('exitBoolean_literal', ctx);
+      console.log('exitBoolean_literal:', ctx.text);
     }
   }
   enterNull_literal(ctx: Parser.Null_literalContext) {
     if (this.config.logging) {
-      console.log('enterNull_literal', ctx);
+      console.log('enterNull_literal:', ctx.text);
     }
   }
   exitNull_literal(ctx: Parser.Null_literalContext) {
     if (this.config.logging) {
-      console.log('exitNull_literal', ctx);
+      console.log('exitNull_literal:', ctx.text);
     }
   }
   enterFunction_name(ctx: Parser.Function_nameContext) {
     if (this.config.logging) {
-      console.log('enterFunction_name', ctx);
+      console.log('enterFunction_name:', ctx.text);
     }
     if (this.context.currentItem === 'field') {
       this.context.tempData.name = ctx.text;
@@ -302,183 +326,196 @@ export class Listener implements SOQLListener {
   }
   exitFunction_name(ctx: Parser.Function_nameContext) {
     if (this.config.logging) {
-      console.log('exitFunction_name', ctx);
+      console.log('exitFunction_name:', ctx.text);
     }
   }
   enterFunction_date(ctx: Parser.Function_dateContext) {
     if (this.config.logging) {
-      console.log('enterFunction_date', ctx);
+      console.log('enterFunction_date:', ctx.text);
     }
   }
   exitFunction_date(ctx: Parser.Function_dateContext) {
     if (this.config.logging) {
-      console.log('exitFunction_date', ctx);
+      console.log('exitFunction_date:', ctx.text);
     }
   }
   enterFunction_aggregate(ctx: Parser.Function_aggregateContext) {
     if (this.config.logging) {
-      console.log('enterFunction_aggregate', ctx);
+      console.log('enterFunction_aggregate:', ctx.text);
     }
   }
   exitFunction_aggregate(ctx: Parser.Function_aggregateContext) {
     if (this.config.logging) {
-      console.log('exitFunction_aggregate', ctx);
+      console.log('exitFunction_aggregate:', ctx.text);
     }
   }
   enterFunction_location(ctx: Parser.Function_locationContext) {
     if (this.config.logging) {
-      console.log('enterFunction_location', ctx);
+      console.log('enterFunction_location:', ctx.text);
     }
   }
   exitFunction_location(ctx: Parser.Function_locationContext) {
     if (this.config.logging) {
-      console.log('exitFunction_location', ctx);
+      console.log('exitFunction_location:', ctx.text);
     }
   }
   enterFunction_other(ctx: Parser.Function_otherContext) {
     if (this.config.logging) {
-      console.log('enterFunction_other', ctx);
+      console.log('enterFunction_other:', ctx.text);
     }
   }
   exitFunction_other(ctx: Parser.Function_otherContext) {
     if (this.config.logging) {
-      console.log('exitFunction_other', ctx);
+      console.log('exitFunction_other:', ctx.text);
     }
   }
   enterSoql_query(ctx: Parser.Soql_queryContext) {
     if (this.config.logging) {
-      console.log('enterSoql_query', ctx);
+      console.log('enterSoql_query:', ctx.text);
     }
   }
   exitSoql_query(ctx: Parser.Soql_queryContext) {
     if (this.config.logging) {
-      console.log('exitSoql_query', ctx);
+      console.log('exitSoql_query:', ctx.text);
     }
   }
   enterSelect_clause(ctx: Parser.Select_clauseContext) {
     if (this.config.logging) {
-      console.log('enterSelect_clause', ctx);
+      console.log('enterSelect_clause:', ctx.text);
     }
   }
   exitSelect_clause(ctx: Parser.Select_clauseContext) {
     if (this.config.logging) {
-      console.log('exitSelect_clause', ctx);
+      console.log('exitSelect_clause:', ctx.text);
     }
   }
   enterFrom_clause(ctx: Parser.From_clauseContext) {
     if (this.config.logging) {
-      console.log('enterFrom_clause', ctx);
+      console.log('enterFrom_clause:', ctx.text);
     }
     this.context.currentItem = 'from';
   }
   exitFrom_clause(ctx: Parser.From_clauseContext) {
     if (this.config.logging) {
-      console.log('exitFrom_clause', ctx);
+      console.log('exitFrom_clause:', ctx.text);
     }
   }
   enterUsing_clause(ctx: Parser.Using_clauseContext) {
     if (this.config.logging) {
-      console.log('enterUsing_clause', ctx);
+      console.log('enterUsing_clause:', ctx.text);
     }
   }
   exitUsing_clause(ctx: Parser.Using_clauseContext) {
     if (this.config.logging) {
-      console.log('exitUsing_clause', ctx);
+      console.log('exitUsing_clause:', ctx.text);
     }
   }
   enterWhere_clause(ctx: Parser.Where_clauseContext) {
     if (this.config.logging) {
-      console.log('enterWhere_clause', ctx);
+      console.log('enterWhere_clause:', ctx.text);
     }
     this.context.currentItem = 'where';
+    const currConditionOperation = {
+      left: null,
+      // right: null,
+      // operator: null,
+    };
+    this.context.tempData = {
+      stack: [currConditionOperation],
+      currConditionOperation,
+      data: currConditionOperation,
+    };
   }
   exitWhere_clause(ctx: Parser.Where_clauseContext) {
     if (this.config.logging) {
-      console.log('exitWhere_clause', ctx);
+      console.log('exitWhere_clause:', ctx.text);
     }
+
+    this.getSoqlQuery().whereClause = this.context.tempData.data;
+    this.context.tempData = null;
   }
   enterGroupby_clause(ctx: Parser.Groupby_clauseContext) {
     if (this.config.logging) {
-      console.log('enterGroupby_clause', ctx);
+      console.log('enterGroupby_clause:', ctx.text);
     }
     this.context.currentItem = 'groupby';
     this.context.tempData = { field: null };
   }
   exitGroupby_clause(ctx: Parser.Groupby_clauseContext) {
     if (this.config.logging) {
-      console.log('exitGroupby_clause', ctx);
+      console.log('exitGroupby_clause:', ctx.text);
     }
     this.getSoqlQuery().groupBy = this.context.tempData;
   }
   enterHaving_clause(ctx: Parser.Having_clauseContext) {
     if (this.config.logging) {
-      console.log('enterHaving_clause', ctx);
+      console.log('enterHaving_clause:', ctx.text);
     }
     this.context.currentItem = 'having';
   }
   exitHaving_clause(ctx: Parser.Having_clauseContext) {
     if (this.config.logging) {
-      console.log('exitHaving_clause', ctx);
+      console.log('exitHaving_clause:', ctx.text);
     }
     this.getSoqlQuery().having = this.context.tempData;
   }
   enterOrderby_clause(ctx: Parser.Orderby_clauseContext) {
     if (this.config.logging) {
-      console.log('enterOrderby_clause', ctx);
+      console.log('enterOrderby_clause:', ctx.text);
     }
     this.context.currentItem = 'orderby';
     this.context.tempData = {};
   }
   exitOrderby_clause(ctx: Parser.Orderby_clauseContext) {
     if (this.config.logging) {
-      console.log('exitOrderby_clause', ctx);
+      console.log('exitOrderby_clause:', ctx.text);
     }
   }
   enterLimit_clause(ctx: Parser.Limit_clauseContext) {
     if (this.config.logging) {
-      console.log('enterLimit_clause', ctx);
+      console.log('enterLimit_clause:', ctx.text);
     }
     this.getSoqlQuery().limit = Number(ctx.getChild(1).text);
   }
   exitLimit_clause(ctx: Parser.Limit_clauseContext) {
     if (this.config.logging) {
-      console.log('exitLimit_clause', ctx);
+      console.log('exitLimit_clause:', ctx.text);
     }
   }
   enterOffset_clause(ctx: Parser.Offset_clauseContext) {
     if (this.config.logging) {
-      console.log('enterOffset_clause', ctx);
+      console.log('enterOffset_clause:', ctx.text);
     }
     this.getSoqlQuery().offset = Number(ctx.getChild(1).text);
   }
   exitOffset_clause(ctx: Parser.Offset_clauseContext) {
     if (this.config.logging) {
-      console.log('exitOffset_clause', ctx);
+      console.log('exitOffset_clause:', ctx.text);
     }
   }
   enterFor_clause(ctx: Parser.For_clauseContext) {
     if (this.config.logging) {
-      console.log('enterFor_clause', ctx);
+      console.log('enterFor_clause:', ctx.text);
     }
   }
   exitFor_clause(ctx: Parser.For_clauseContext) {
     if (this.config.logging) {
-      console.log('exitFor_clause', ctx);
+      console.log('exitFor_clause:', ctx.text);
     }
   }
   enterUpdate_clause(ctx: Parser.Update_clauseContext) {
     if (this.config.logging) {
-      console.log('enterUpdate_clause', ctx);
+      console.log('enterUpdate_clause:', ctx.text);
     }
   }
   exitUpdate_clause(ctx: Parser.Update_clauseContext) {
     if (this.config.logging) {
-      console.log('exitUpdate_clause', ctx);
+      console.log('exitUpdate_clause:', ctx.text);
     }
   }
   enterSoql_subquery(ctx: Parser.Soql_subqueryContext) {
     if (this.config.logging) {
-      console.log('enterSoql_subquery', ctx);
+      console.log('enterSoql_subquery:', ctx.text);
     }
     this.context.isSubQuery = true;
     this.soqlQuery.subqueries.push(new SoqlQuery());
@@ -486,46 +523,46 @@ export class Listener implements SOQLListener {
   }
   exitSoql_subquery(ctx: Parser.Soql_subqueryContext) {
     if (this.config.logging) {
-      console.log('exitSoql_subquery', ctx);
+      console.log('exitSoql_subquery:', ctx.text);
     }
     this.context.isSubQuery = false;
     this.context.currWhereConditionGroupIdx = 0; // ensure reset for base query or next subquery
   }
   enterSubquery_select_clause(ctx: Parser.Subquery_select_clauseContext) {
     if (this.config.logging) {
-      console.log('enterSubquery_select_clause', ctx);
+      console.log('enterSubquery_select_clause:', ctx.text);
     }
   }
   exitSubquery_select_clause(ctx: Parser.Subquery_select_clauseContext) {
     if (this.config.logging) {
-      console.log('exitSubquery_select_clause', ctx);
+      console.log('exitSubquery_select_clause:', ctx.text);
     }
   }
   enterSelect_spec(ctx: Parser.Select_specContext) {
     if (this.config.logging) {
-      console.log('enterSelect_spec', ctx);
+      console.log('enterSelect_spec:', ctx.text);
     }
     this.context.currentItem = 'field';
   }
   exitSelect_spec(ctx: Parser.Select_specContext) {
     if (this.config.logging) {
-      console.log('exitSelect_spec', ctx);
+      console.log('exitSelect_spec:', ctx.text);
     }
   }
   enterSubquery_select_spec(ctx: Parser.Subquery_select_specContext) {
     if (this.config.logging) {
-      console.log('enterSubquery_select_spec', ctx);
+      console.log('enterSubquery_select_spec:', ctx.text);
     }
     this.context.currentItem = 'field';
   }
   exitSubquery_select_spec(ctx: Parser.Subquery_select_specContext) {
     if (this.config.logging) {
-      console.log('exitSubquery_select_spec', ctx);
+      console.log('exitSubquery_select_spec:', ctx.text);
     }
   }
   enterField_spec(ctx: Parser.Field_specContext) {
     if (this.config.logging) {
-      console.log('enterField_spec', ctx);
+      console.log('enterField_spec:', ctx.text);
     }
     this.context.currentItem = 'field';
     let relatedFields: string[];
@@ -536,11 +573,11 @@ export class Listener implements SOQLListener {
     }
   }
   // exitField_spec(ctx: Parser.Field_specContext) {
-  //   if(this.config.logging) { console.log('exitField_spec', ctx); }
+  //   if(this.config.logging) { console.log('exitField_spec:', ctx.text); }
   // };
   enterFunction_call_spec(ctx: Parser.Function_call_specContext) {
     if (this.config.logging) {
-      console.log('enterFunction_call_spec', ctx);
+      console.log('enterFunction_call_spec:', ctx.text);
     }
     if (this.context.currentItem === 'field') {
       this.context.tempData = {};
@@ -551,7 +588,7 @@ export class Listener implements SOQLListener {
   }
   exitFunction_call_spec(ctx: Parser.Function_call_specContext) {
     if (this.config.logging) {
-      console.log('exitFunction_call_spec', ctx);
+      console.log('exitFunction_call_spec:', ctx.text);
     }
     if (this.context.currentItem === 'field') {
       this.getSoqlQuery().fields.push({ fn: this.context.tempData });
@@ -560,17 +597,17 @@ export class Listener implements SOQLListener {
   }
   enterField(ctx: Parser.FieldContext) {
     if (this.config.logging) {
-      console.log('enterField', ctx);
+      console.log('enterField:', ctx.text);
     }
   }
   exitField(ctx: Parser.FieldContext) {
     if (this.config.logging) {
-      console.log('exitField', ctx);
+      console.log('exitField:', ctx.text);
     }
   }
   enterFunction_call(ctx: Parser.Function_callContext) {
     if (this.config.logging) {
-      console.log('enterFunction_call', ctx);
+      console.log('enterFunction_call:', ctx.text);
     }
     // COUNT(ID) or Count()
     if (this.context.currentItem === 'field') {
@@ -585,22 +622,22 @@ export class Listener implements SOQLListener {
   }
   exitFunction_call(ctx: Parser.Function_callContext) {
     if (this.config.logging) {
-      console.log('exitFunction_call', ctx);
+      console.log('exitFunction_call:', ctx.text);
     }
   }
   enterFunction_parameter_list(ctx: Parser.Function_parameter_listContext) {
     if (this.config.logging) {
-      console.log('enterFunction_parameter_list', ctx);
+      console.log('enterFunction_parameter_list:', ctx.text);
     }
   }
   exitFunction_parameter_list(ctx: Parser.Function_parameter_listContext) {
     if (this.config.logging) {
-      console.log('exitFunction_parameter_list', ctx);
+      console.log('exitFunction_parameter_list:', ctx.text);
     }
   }
   enterFunction_parameter(ctx: Parser.Function_parameterContext) {
     if (this.config.logging) {
-      console.log('enterFunction_parameter', ctx);
+      console.log('enterFunction_parameter:', ctx.text);
     }
     // Get correct fn object based on what is set in tempData (set differently for field vs having)
     if (
@@ -622,72 +659,72 @@ export class Listener implements SOQLListener {
   }
   exitFunction_parameter(ctx: Parser.Function_parameterContext) {
     if (this.config.logging) {
-      console.log('exitFunction_parameter', ctx);
+      console.log('exitFunction_parameter:', ctx.text);
     }
   }
   enterTypeof_spec(ctx: Parser.Typeof_specContext) {
     if (this.config.logging) {
-      console.log('enterTypeof_spec', ctx);
+      console.log('enterTypeof_spec:', ctx.text);
     }
   }
   exitTypeof_spec(ctx: Parser.Typeof_specContext) {
     if (this.config.logging) {
-      console.log('exitTypeof_spec', ctx);
+      console.log('exitTypeof_spec:', ctx.text);
     }
   }
   enterTypeof_when_then_clause_list(ctx: Parser.Typeof_when_then_clause_listContext) {
     if (this.config.logging) {
-      console.log('enterTypeof_when_then_clause_list', ctx);
+      console.log('enterTypeof_when_then_clause_list:', ctx.text);
     }
   }
   exitTypeof_when_then_clause_list(ctx: Parser.Typeof_when_then_clause_listContext) {
     if (this.config.logging) {
-      console.log('exitTypeof_when_then_clause_list', ctx);
+      console.log('exitTypeof_when_then_clause_list:', ctx.text);
     }
   }
   enterTypeof_when_then_clause(ctx: Parser.Typeof_when_then_clauseContext) {
     if (this.config.logging) {
-      console.log('enterTypeof_when_then_clause', ctx);
+      console.log('enterTypeof_when_then_clause:', ctx.text);
     }
   }
   exitTypeof_when_then_clause(ctx: Parser.Typeof_when_then_clauseContext) {
     if (this.config.logging) {
-      console.log('exitTypeof_when_then_clause', ctx);
+      console.log('exitTypeof_when_then_clause:', ctx.text);
     }
   }
   enterTypeof_then_clause(ctx: Parser.Typeof_then_clauseContext) {
     if (this.config.logging) {
-      console.log('enterTypeof_then_clause', ctx);
+      console.log('enterTypeof_then_clause:', ctx.text);
     }
   }
   exitTypeof_then_clause(ctx: Parser.Typeof_then_clauseContext) {
     if (this.config.logging) {
-      console.log('exitTypeof_then_clause', ctx);
+      console.log('exitTypeof_then_clause:', ctx.text);
     }
   }
   enterTypeof_else_clause(ctx: Parser.Typeof_else_clauseContext) {
     if (this.config.logging) {
-      console.log('enterTypeof_else_clause', ctx);
+      console.log('enterTypeof_else_clause:', ctx.text);
     }
   }
   exitTypeof_else_clause(ctx: Parser.Typeof_else_clauseContext) {
     if (this.config.logging) {
-      console.log('exitTypeof_else_clause', ctx);
+      console.log('exitTypeof_else_clause:', ctx.text);
     }
   }
   enterField_list(ctx: Parser.Field_listContext) {
     if (this.config.logging) {
-      console.log('enterField_list', ctx);
+      console.log('enterField_list:', ctx.text);
     }
   }
   exitField_list(ctx: Parser.Field_listContext) {
     if (this.config.logging) {
-      console.log('exitField_list', ctx);
+      console.log('exitField_list:', ctx.text);
     }
   }
   enterObject_spec(ctx: Parser.Object_specContext) {
     if (this.config.logging) {
-      console.log('enterObject_spec', ctx);
+      console.log('enterObject_spec:', ctx.text);
     }
     this.getSoqlQuery().sObject = ctx.getChild(0).text;
     if (this.config.includeSubqueryAsField && this.context.isSubQuery) {
@@ -698,97 +735,116 @@ export class Listener implements SOQLListener {
   }
   exitObject_spec(ctx: Parser.Object_specContext) {
     if (this.config.logging) {
-      console.log('exitObject_spec', ctx);
+      console.log('exitObject_spec:', ctx.text);
     }
   }
   enterObject_prefix(ctx: Parser.Object_prefixContext) {
     if (this.config.logging) {
-      console.log('enterObject_prefix', ctx);
+      console.log('enterObject_prefix:', ctx.text);
     }
   }
   exitObject_prefix(ctx: Parser.Object_prefixContext) {
     if (this.config.logging) {
-      console.log('exitObject_prefix', ctx);
+      console.log('exitObject_prefix:', ctx.text);
     }
   }
   enterComparison_operator(ctx: Parser.Comparison_operatorContext) {
     if (this.config.logging) {
-      console.log('enterComparison_operator', ctx);
+      console.log('enterComparison_operator:', ctx.text);
     }
   }
   exitComparison_operator(ctx: Parser.Comparison_operatorContext) {
     if (this.config.logging) {
-      console.log('exitComparison_operator', ctx);
+      console.log('exitComparison_operator:', ctx.text);
     }
   }
   enterSet_operator(ctx: Parser.Set_operatorContext) {
     if (this.config.logging) {
-      console.log('enterSet_operator', ctx);
+      console.log('enterSet_operator:', ctx.text);
     }
   }
   exitSet_operator(ctx: Parser.Set_operatorContext) {
     if (this.config.logging) {
-      console.log('exitSet_operator', ctx);
+      console.log('exitSet_operator:', ctx.text);
     }
   }
   enterCondition(ctx: Parser.ConditionContext) {
     if (this.config.logging) {
-      console.log('enterCondition', ctx);
+      console.log('enterCondition:', ctx.text);
     }
   }
   exitCondition(ctx: Parser.ConditionContext) {
     if (this.config.logging) {
-      console.log('exitCondition', ctx);
+      console.log('exitCondition:', ctx.text);
     }
   }
   enterCondition1(ctx: Parser.Condition1Context) {
     if (this.config.logging) {
-      console.log('enterCondition1', ctx);
+      console.log('enterCondition1:', ctx.text);
     }
   }
   exitCondition1(ctx: Parser.Condition1Context) {
     if (this.config.logging) {
-      console.log('exitCondition1', ctx);
-    }
-    if (this.context.currentItem === 'where' && this.context.tempData) {
-      this.getSoqlQuery().addWhereCondition(this.context.tempData, this.context.currWhereConditionGroupIdx);
-      this.context.tempData = null;
+      console.log('exitCondition1:', ctx.text);
     }
   }
   enterParenthesis(ctx: Parser.ParenthesisContext) {
     if (this.config.logging) {
-      console.log('enterParenthesis', ctx);
+      console.log('enterParenthesis:', ctx.text);
+    }
+    if (this.context.currentItem === 'where') {
+      this.context.tempData.nextHasCloseParen = false;
+      this.context.tempData.nextHasOpenParen = true;
     }
   }
   exitParenthesis(ctx: Parser.ParenthesisContext) {
     if (this.config.logging) {
-      console.log('exitParenthesis', ctx);
+      console.log('exitParenthesis:', ctx.text);
+    }
+    if (this.context.currentItem === 'where') {
+      if (this.context.tempData.nextHasCloseParen) {
+        this.context.tempData.stack.pop();
+      }
+      this.context.tempData.stack[this.context.tempData.stack.length - 1].left.closeParen = true;
+      this.context.tempData.nextHasCloseParen = true;
     }
-    this.context.currWhereConditionGroupIdx++;
   }
   enterSimple_condition(ctx: Parser.Simple_conditionContext) {
     if (this.config.logging) {
-      console.log('enterSimple_condition', ctx);
+      console.log('enterSimple_condition:', ctx.text);
     }
   }
   exitSimple_condition(ctx: Parser.Simple_conditionContext) {
     if (this.config.logging) {
-      console.log('exitSimple_condition', ctx);
+      console.log('exitSimple_condition:', ctx.text);
     }
   }
   enterField_based_condition(ctx: Parser.Field_based_conditionContext) {
     if (this.config.logging) {
-      console.log('enterField_based_condition', ctx);
+      console.log('enterField_based_condition:', ctx.text);
     }
     if (this.config.logging) {
-      console.log('enterLike_based_condition', ctx);
+      console.log('enterLike_based_condition:', ctx.text);
     }
     if (this.context.currentItem === 'where') {
-      this.context.tempData = {
-        field: ctx.getChild(0).text,
-        operator: ctx.getChild(1).text,
-        value: ctx.getChild(2).text,
-      };
+      const currItem: any = {};
+      if (!this.context.tempData.currConditionOperation.left) {
+        this.context.tempData.currConditionOperation.left = currItem;
+        if (this.context.tempData.nextHasOpenParen) {
+          currItem.openParen = true;
+          this.context.tempData.nextHasOpenParen = false;
+        }
+        if (this.context.tempData.nextHasLogicalPrefix) {
+          currItem.logicalPrefix = this.context.tempData.nextHasLogicalPrefix;
+          this.context.tempData.nextHasLogicalPrefix = null;
+        }
+      } else {
+        this.context.tempData.currConditionOperation.right = currItem;
+      }
+
+      currItem.field = ctx.getChild(0).text;
+      currItem.operator = ctx.getChild(1).text;
+      currItem.value = ctx.getChild(2).text;
     }
     if (this.context.currentItem === 'having') {
       this.context.tempData = {
@@ -800,188 +856,217 @@ export class Listener implements SOQLListener {
   }
   exitField_based_condition(ctx: Parser.Field_based_conditionContext) {
     if (this.config.logging) {
-      console.log('exitField_based_condition', ctx);
+      console.log('exitField_based_condition:', ctx.text);
     }
   }
   enterSet_based_condition(ctx: Parser.Set_based_conditionContext) {
     if (this.config.logging) {
-      console.log('enterSet_based_condition', ctx);
+      console.log('enterSet_based_condition:', ctx.text);
     }
-    this.context.tempData = {
-      field: ctx.getChild(0).text,
-      operator: (ctx.getChild(1) as Parser.Set_operatorContext).children.map(child => child.text).join(' '),
-      value: (ctx.getChild(2).getChild(1) as Parser.Set_value_listContext).children
+    if (this.context.currentItem === 'where') {
+      const currItem: any = {};
+      if (!this.context.tempData.currConditionOperation.left) {
+        this.context.tempData.currConditionOperation.left = currItem;
+        if (this.context.tempData.nextHasOpenParen) {
+          currItem.openParen = true;
+          this.context.tempData.nextHasOpenParen = false;
+        }
+        if (this.context.tempData.nextHasLogicalPrefix) {
+          currItem.logicalPrefix = this.context.tempData.nextHasLogicalPrefix;
+          this.context.tempData.nextHasLogicalPrefix = null;
+        }
+      } else {
+        this.context.tempData.currConditionOperation.right = currItem;
+      }
+
+      currItem.field = ctx.getChild(0).text;
+      currItem.operator = (ctx.getChild(1) as Parser.Set_operatorContext).children.map(child => child.text).join(' ');
+      currItem.value = (ctx.getChild(2).getChild(1) as Parser.Set_value_listContext).children
         .filter(child => !(child instanceof TerminalNode))
-        .map(child => child.text),
-    };
+        .map(child => child.text);
+    }
   }
   exitSet_based_condition(ctx: Parser.Set_based_conditionContext) {
     if (this.config.logging) {
-      console.log('exitSet_based_condition', ctx);
+      console.log('exitSet_based_condition:', ctx.text);
     }
   }
   enterLike_based_condition(ctx: Parser.Like_based_conditionContext) {
     if (this.config.logging) {
-      console.log('enterLike_based_condition', ctx);
+      console.log('enterLike_based_condition:', ctx.text);
     }
     if (this.context.currentItem === 'where') {
-      this.context.tempData = {
-        field: ctx.getChild(0).text,
-        operator: 'LIKE',
-        value: ctx.getChild(ctx.children.length - 1).text,
-      };
+      // Set current condition in temp data
+      const currItem: any = {};
+      if (!this.context.tempData.currConditionOperation.left) {
+        this.context.tempData.currConditionOperation.left = currItem;
+        if (this.context.tempData.nextHasOpenParen) {
+          currItem.openParen = true;
+          this.context.tempData.nextHasOpenParen = false;
+        }
+        if (this.context.tempData.nextHasLogicalPrefix) {
+          currItem.logicalPrefix = this.context.tempData.nextHasLogicalPrefix;
+          this.context.tempData.nextHasLogicalPrefix = null;
+        }
+      } else {
+        this.context.tempData.currConditionOperation.right = currItem;
+      }
+
+      currItem.field = ctx.getChild(0).text;
+      currItem.operator = 'LIKE';
+      currItem.value = ctx.getChild(ctx.children.length - 1).text;
     }
   }
   exitLike_based_condition(ctx: Parser.Like_based_conditionContext) {
     if (this.config.logging) {
-      console.log('exitLike_based_condition', ctx);
+      console.log('exitLike_based_condition:', ctx.text);
     }
   }
   enterCondition_field(ctx: Parser.Condition_fieldContext) {
     if (this.config.logging) {
-      console.log('enterCondition_field', ctx);
+      console.log('enterCondition_field:', ctx.text);
     }
   }
   exitCondition_field(ctx: Parser.Condition_fieldContext) {
     if (this.config.logging) {
-      console.log('exitCondition_field', ctx);
+      console.log('exitCondition_field:', ctx.text);
     }
   }
   enterSet_values(ctx: Parser.Set_valuesContext) {
     if (this.config.logging) {
-      console.log('enterSet_values', ctx);
+      console.log('enterSet_values:', ctx.text);
     }
   }
   exitSet_values(ctx: Parser.Set_valuesContext) {
     if (this.config.logging) {
-      console.log('exitSet_values', ctx);
+      console.log('exitSet_values:', ctx.text);
     }
   }
   enterSet_value_list(ctx: Parser.Set_value_listContext) {
     if (this.config.logging) {
-      console.log('enterSet_value_list', ctx);
+      console.log('enterSet_value_list:', ctx.text);
     }
   }
   exitSet_value_list(ctx: Parser.Set_value_listContext) {
     if (this.config.logging) {
-      console.log('exitSet_value_list', ctx);
+      console.log('exitSet_value_list:', ctx.text);
     }
   }
   enterWith_clause(ctx: Parser.With_clauseContext) {
     if (this.config.logging) {
-      console.log('enterWith_clause', ctx);
+      console.log('enterWith_clause:', ctx.text);
     }
   }
   exitWith_clause(ctx: Parser.With_clauseContext) {
     if (this.config.logging) {
-      console.log('exitWith_clause', ctx);
+      console.log('exitWith_clause:', ctx.text);
     }
   }
   enterWith_plain_clause(ctx: Parser.With_plain_clauseContext) {
     if (this.config.logging) {
-      console.log('enterWith_plain_clause', ctx);
+      console.log('enterWith_plain_clause:', ctx.text);
     }
   }
   exitWith_plain_clause(ctx: Parser.With_plain_clauseContext) {
     if (this.config.logging) {
-      console.log('exitWith_plain_clause', ctx);
+      console.log('exitWith_plain_clause:', ctx.text);
     }
   }
   enterWith_data_category_clause(ctx: Parser.With_data_category_clauseContext) {
     if (this.config.logging) {
-      console.log('enterWith_data_category_clause', ctx);
+      console.log('enterWith_data_category_clause:', ctx.text);
     }
   }
   exitWith_data_category_clause(ctx: Parser.With_data_category_clauseContext) {
     if (this.config.logging) {
-      console.log('exitWith_data_category_clause', ctx);
+      console.log('exitWith_data_category_clause:', ctx.text);
     }
   }
   enterData_category_spec_list(ctx: Parser.Data_category_spec_listContext) {
     if (this.config.logging) {
-      console.log('enterData_category_spec_list', ctx);
+      console.log('enterData_category_spec_list:', ctx.text);
     }
   }
   exitData_category_spec_list(ctx: Parser.Data_category_spec_listContext) {
     if (this.config.logging) {
-      console.log('exitData_category_spec_list', ctx);
+      console.log('exitData_category_spec_list:', ctx.text);
     }
   }
   enterData_category_spec(ctx: Parser.Data_category_specContext) {
     if (this.config.logging) {
-      console.log('enterData_category_spec', ctx);
+      console.log('enterData_category_spec:', ctx.text);
     }
   }
   exitData_category_spec(ctx: Parser.Data_category_specContext) {
     if (this.config.logging) {
-      console.log('exitData_category_spec', ctx);
+      console.log('exitData_category_spec:', ctx.text);
     }
   }
   enterData_category_parameter_list(ctx: Parser.Data_category_parameter_listContext) {
     if (this.config.logging) {
-      console.log('enterData_category_parameter_list', ctx);
+      console.log('enterData_category_parameter_list:', ctx.text);
     }
   }
   exitData_category_parameter_list(ctx: Parser.Data_category_parameter_listContext) {
     if (this.config.logging) {
-      console.log('exitData_category_parameter_list', ctx);
+      console.log('exitData_category_parameter_list:', ctx.text);
     }
   }
   enterData_category_selector(ctx: Parser.Data_category_selectorContext) {
     if (this.config.logging) {
-      console.log('enterData_category_selector', ctx);
+      console.log('enterData_category_selector:', ctx.text);
     }
   }
   exitData_category_selector(ctx: Parser.Data_category_selectorContext) {
     if (this.config.logging) {
-      console.log('exitData_category_selector', ctx);
+      console.log('exitData_category_selector:', ctx.text);
     }
   }
   enterGroup_by_plain_clause(ctx: Parser.Group_by_plain_clauseContext) {
     if (this.config.logging) {
-      console.log('enterGroup_by_plain_clause', ctx);
+      console.log('enterGroup_by_plain_clause:', ctx.text);
     }
   }
   exitGroup_by_plain_clause(ctx: Parser.Group_by_plain_clauseContext) {
     if (this.config.logging) {
-      console.log('exitGroup_by_plain_clause', ctx);
+      console.log('exitGroup_by_plain_clause:', ctx.text);
     }
   }
   enterGroup_by_rollup_clause(ctx: Parser.Group_by_rollup_clauseContext) {
     if (this.config.logging) {
-      console.log('enterGroup_by_rollup_clause', ctx);
+      console.log('enterGroup_by_rollup_clause:', ctx.text);
     }
     this.context.tempData.type = 'ROLLUP';
   }
   exitGroup_by_rollup_clause(ctx: Parser.Group_by_rollup_clauseContext) {
     if (this.config.logging) {
-      console.log('exitGroup_by_rollup_clause', ctx);
+      console.log('exitGroup_by_rollup_clause:', ctx.text);
     }
   }
   enterGroup_by_cube_clause(ctx: Parser.Group_by_cube_clauseContext) {
     if (this.config.logging) {
-      console.log('enterGroup_by_cube_clause', ctx);
+      console.log('enterGroup_by_cube_clause:', ctx.text);
     }
     this.context.tempData.type = 'CUBE';
   }
   exitGroup_by_cube_clause(ctx: Parser.Group_by_cube_clauseContext) {
     if (this.config.logging) {
-      console.log('exitGroup_by_cube_clause', ctx);
+      console.log('exitGroup_by_cube_clause:', ctx.text);
     }
   }
   enterGroup_by_list(ctx: Parser.Group_by_listContext) {
     if (this.config.logging) {
-      console.log('enterGroup_by_list', ctx);
+      console.log('enterGroup_by_list:', ctx.text);
     }
   }
   exitGroup_by_list(ctx: Parser.Group_by_listContext) {
     if (this.config.logging) {
-      console.log('exitGroup_by_list', ctx);
+      console.log('exitGroup_by_list:', ctx.text);
     }
   }
   enterGroup_by_spec(ctx: Parser.Group_by_specContext) {
     if (this.config.logging) {
-      console.log('enterGroup_by_spec', ctx);
+      console.log('enterGroup_by_spec:', ctx.text);
     }
     if (_.isArray(this.context.tempData.field)) {
       this.context.tempData.field.push(ctx.text);
@@ -993,28 +1078,28 @@ export class Listener implements SOQLListener {
   }
   exitGroup_by_spec(ctx: Parser.Group_by_specContext) {
     if (this.config.logging) {
-      console.log('exitGroup_by_spec', ctx);
+      console.log('exitGroup_by_spec:', ctx.text);
     }
   }
   enterOrder_by_list(ctx: Parser.Order_by_listContext) {
     if (this.config.logging) {
-      console.log('enterOrder_by_list', ctx);
+      console.log('enterOrder_by_list:', ctx.text);
     }
   }
   exitOrder_by_list(ctx: Parser.Order_by_listContext) {
     if (this.config.logging) {
-      console.log('exitOrder_by_list', ctx);
+      console.log('exitOrder_by_list:', ctx.text);
     }
   }
   enterOrder_by_spec(ctx: Parser.Order_by_specContext) {
     if (this.config.logging) {
-      console.log('enterOrder_by_spec', ctx);
+      console.log('enterOrder_by_spec:', ctx.text);
     }
     this.context.tempData = {};
   }
   exitOrder_by_spec(ctx: Parser.Order_by_specContext) {
     if (this.config.logging) {
-      console.log('exitOrder_by_spec', ctx);
+      console.log('exitOrder_by_spec:', ctx.text);
     }
     const soqlQuery = this.getSoqlQuery();
     if (_.isNil(soqlQuery.orderBy)) {
@@ -1027,30 +1112,30 @@ export class Listener implements SOQLListener {
   }
   enterOrder_by_direction_clause(ctx: Parser.Order_by_direction_clauseContext) {
     if (this.config.logging) {
-      console.log('enterOrder_by_direction_clause', ctx);
+      console.log('enterOrder_by_direction_clause:', ctx.text);
     }
     ctx.text;
     this.context.tempData.order = ctx.text.toUpperCase() === 'ASC' ? 'ASC' : 'DESC';
   }
   exitOrder_by_direction_clause(ctx: Parser.Order_by_direction_clauseContext) {
     if (this.config.logging) {
-      console.log('exitOrder_by_direction_clause', ctx);
+      console.log('exitOrder_by_direction_clause:', ctx.text);
     }
   }
   enterOrder_by_nulls_clause(ctx: Parser.Order_by_nulls_clauseContext) {
     if (this.config.logging) {
-      console.log('enterOrder_by_nulls_clause', ctx);
+      console.log('enterOrder_by_nulls_clause:', ctx.text);
     }
-    this.context.tempData.nulls = ctx.text.toUpperCase() === 'FIRST' ? 'FIRST' : 'LAST';
+    this.context.tempData.nulls = ctx.getChild(1).text.toUpperCase() === 'FIRST' ? 'FIRST' : 'LAST';
   }
   exitOrder_by_nulls_clause(ctx: Parser.Order_by_nulls_clauseContext) {
     if (this.config.logging) {
-      console.log('exitOrder_by_nulls_clause', ctx);
+      console.log('exitOrder_by_nulls_clause:', ctx.text);
     }
   }
   enterOrder_by_field(ctx: Parser.Order_by_fieldContext) {
     if (this.config.logging) {
-      console.log('enterOrder_by_field', ctx);
+      console.log('enterOrder_by_field:', ctx.text);
     }
     // If order by is not a function, set field
     if (ctx.getChild(0) instanceof Parser.Function_callContext) {
@@ -1061,27 +1146,27 @@ export class Listener implements SOQLListener {
   }
   exitOrder_by_field(ctx: Parser.Order_by_fieldContext) {
     if (this.config.logging) {
-      console.log('exitOrder_by_field', ctx);
+      console.log('exitOrder_by_field:', ctx.text);
     }
   }
   enterFor_value(ctx: Parser.For_valueContext) {
     if (this.config.logging) {
-      console.log('enterFor_value', ctx);
+      console.log('enterFor_value:', ctx.text);
     }
   }
   exitFor_value(ctx: Parser.For_valueContext) {
     if (this.config.logging) {
-      console.log('exitFor_value', ctx);
+      console.log('exitFor_value:', ctx.text);
     }
   }
   enterUpdate_value(ctx: Parser.Update_valueContext) {
     if (this.config.logging) {
-      console.log('enterUpdate_value', ctx);
+      console.log('enterUpdate_value:', ctx.text);
     }
   }
   exitUpdate_value(ctx: Parser.Update_valueContext) {
     if (this.config.logging) {
-      console.log('exitUpdate_value', ctx);
+      console.log('exitUpdate_value:', ctx.text);
     }
   }
 }
diff --git a/src/app/index.ts b/src/app/index.ts
index b2dd947..576a879 100644
--- a/src/app/index.ts
+++ b/src/app/index.ts
@@ -47,9 +47,9 @@ import { parseQuery } from './SoqlParser';
 
 // const listener = new Listener();
 const queries = [
-  `SELECT Id, Name, BillingCity FROM Account`,
+  `SELECT Id FROM Account WHERE (Id IN ('1', '2', '3') OR (NOT Id = '2') OR (Name LIKE '%FOO%' OR (Name LIKE '%ARM%' AND FOO = 'bar')))`,
   `SELECT Id FROM Contact WHERE Name LIKE 'A%' AND MailingCity = 'California'`,
-  `SELECT Name FROM Account ORDER BY Name DESC NULLS LAST`,
+  `SELECT Name FROM Account ORDER BY Name DESC NULLS FIRST`,
   `SELECT Name FROM Account WHERE Industry = 'media' LIMIT 125`,
   `SELECT Name FROM Account WHERE Industry = 'media' ORDER BY BillingPostalCode ASC NULLS LAST LIMIT 125`,
   `SELECT COUNT() FROM Contact`,
@@ -80,13 +80,13 @@ const queries = [
   `SELECT c.Name, c.Account.Name FROM Contact c`,
 ];
 
-// const query = parseQuery(queries[30], { logging: true });
-// console.log(JSON.stringify(query, null, 2));
+const query = parseQuery(queries[14], { logging: true });
+console.log(JSON.stringify(query, null, 2));
 
-const output = [];
-queries.forEach((soql, i) => {
-  const query = parseQuery(soql, {});
-  output.push({ testCase: i + 1, soql, output: query });
-});
+// const output = [];
+// queries.forEach((soql, i) => {
+//   const query = parseQuery(soql, {});
+//   output.push({ testCase: i + 1, soql, output: query });
+// });
 
-console.log(JSON.stringify(output, null, 2));
+// console.log(JSON.stringify(output, null, 2));
diff --git a/src/app/models/SoqlQuery.model.ts b/src/app/models/SoqlQuery.model.ts
index 54d5e41..1e7b9ca 100644
--- a/src/app/models/SoqlQuery.model.ts
+++ b/src/app/models/SoqlQuery.model.ts
@@ -1,9 +1,12 @@
+export type LogicalOperator = 'AND' | 'OR';
+export type Operator = '=' | '<=' | '>=' | '>' | '<' | 'LIKE' | 'IN' | 'NOT IN' | 'INCLUDES' | 'EXCLUDES';
+
 export class SoqlQuery implements Query {
   fields: Field[];
   subqueries: Query[];
   sObject: string;
   sObjectAlias?: string;
-  whereClauseGroups: WhereClause[][];
+  whereClause?: WhereClause;
   limit?: number;
   offset?: number;
   groupBy?: GroupByClause;
@@ -13,14 +16,6 @@ export class SoqlQuery implements Query {
   constructor() {
     this.fields = [];
     this.subqueries = [];
-    this.whereClauseGroups = [];
-  }
-
-  addWhereCondition(condition: WhereClause, groupIdx: number) {
-    if (!Array.isArray(this.whereClauseGroups[groupIdx])) {
-      this.whereClauseGroups[groupIdx] = [];
-    }
-    this.whereClauseGroups[groupIdx].push(condition);
   }
 }
 
@@ -29,13 +24,12 @@ export interface Query {
   subqueries: Query[];
   sObject: string;
   sObjectAlias?: string;
-  whereClauseGroups: WhereClause[][];
+  whereClause?: WhereClause;
   limit?: number;
   offset?: number;
   groupBy?: GroupByClause;
   having?: any;
   orderBy?: OrderByClause | OrderByClause[];
-  addWhereCondition?: (condition: WhereClause, groupIdx: number) => void;
 }
 
 export interface SelectStatement {
@@ -50,9 +44,18 @@ export interface Field {
   subqueryObjName?: string; // populated if subquery
 }
 
-export interface WhereClause {
+interface WhereClause {
+  left: Condition | WhereClause;
+  right?: Condition | WhereClause;
+  operator?: LogicalOperator;
+}
+
+interface Condition {
+  openParen?: boolean;
+  closeParen?: boolean;
+  logicalPrefix?: 'NOT';
   field: string;
-  operator: string;
+  operator: Operator;
   value: string | string[];
 }
 
diff --git a/tsconfig.json b/tsconfig.json
index e4688e7..045c6b4 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -3,7 +3,8 @@
         "target": "es2015",
         "module": "commonjs",
         "lib": [
-            "es2015"
+            "dom",
+            "es2017"
         ],
         "moduleResolution": "node",
         "outDir": "build",


Test patch:
diff --git a/src/tests/TestCases.ts b/src/tests/TestCases.ts
index e47b6c3..494aec0 100644
--- a/src/tests/TestCases.ts
+++ b/src/tests/TestCases.ts
@@ -25,7 +25,6 @@ const testCases: TestCase[] = [
         },
       ],
       subqueries: [],
-      whereClauseGroups: [],
       sObject: 'Account',
     },
   },
@@ -39,21 +38,22 @@ const testCases: TestCase[] = [
         },
       ],
       subqueries: [],
-      whereClauseGroups: [
-        [
-          {
-            field: 'Name',
-            operator: 'LIKE',
-            value: "'A%'",
-          },
-          {
+      sObject: 'Contact',
+      whereClause: {
+        left: {
+          field: 'Name',
+          operator: 'LIKE',
+          value: "'A%'",
+        },
+        operator: 'AND',
+        right: {
+          left: {
             field: 'MailingCity',
             operator: '=',
             value: "'California'",
           },
-        ],
-      ],
-      sObject: 'Contact',
+        },
+      },
     },
   },
   {
@@ -66,7 +66,6 @@ const testCases: TestCase[] = [
         },
       ],
       subqueries: [],
-      whereClauseGroups: [],
       sObject: 'Account',
       orderBy: {
         field: 'Name',
@@ -85,16 +84,14 @@ const testCases: TestCase[] = [
         },
       ],
       subqueries: [],
-      whereClauseGroups: [
-        [
-          {
-            field: 'Industry',
-            operator: '=',
-            value: "'media'",
-          },
-        ],
-      ],
       sObject: 'Account',
+      whereClause: {
+        left: {
+          field: 'Industry',
+          operator: '=',
+          value: "'media'",
+        },
+      },
       limit: 125,
     },
   },
@@ -108,16 +105,14 @@ const testCases: TestCase[] = [
         },
       ],
       subqueries: [],
-      whereClauseGroups: [
-        [
-          {
-            field: 'Industry',
-            operator: '=',
-            value: "'media'",
-          },
-        ],
-      ],
       sObject: 'Account',
+      whereClause: {
+        left: {
+          field: 'Industry',
+          operator: '=',
+          value: "'media'",
+        },
+      },
       orderBy: {
         field: 'BillingPostalCode',
         order: 'ASC',
@@ -139,7 +134,6 @@ const testCases: TestCase[] = [
         },
       ],
       subqueries: [],
-      whereClauseGroups: [],
       sObject: 'Contact',
     },
   },
@@ -160,7 +154,6 @@ const testCases: TestCase[] = [
         },
       ],
       subqueries: [],
-      whereClauseGroups: [],
       sObject: 'Lead',
       groupBy: {
         field: 'LeadSource',
@@ -184,7 +177,6 @@ const testCases: TestCase[] = [
         },
       ],
       subqueries: [],
-      whereClauseGroups: [],
       sObject: 'Account',
       groupBy: {
         field: 'Name',
@@ -213,7 +205,6 @@ const testCases: TestCase[] = [
         },
       ],
       subqueries: [],
-      whereClauseGroups: [],
       sObject: 'Merchandise__c',
       orderBy: {
         field: 'Name',
@@ -234,7 +225,6 @@ const testCases: TestCase[] = [
         },
       ],
       subqueries: [],
-      whereClauseGroups: [],
       sObject: 'Merchandise__c',
       orderBy: {
         field: 'Name',
@@ -258,7 +248,6 @@ const testCases: TestCase[] = [
         },
       ],
       subqueries: [],
-      whereClauseGroups: [],
       sObject: 'Contact',
     },
   },
@@ -279,16 +268,14 @@ const testCases: TestCase[] = [
         },
       ],
       subqueries: [],
-      whereClauseGroups: [
-        [
-          {
-            field: 'Account.Industry',
-            operator: '=',
-            value: "'media'",
-          },
-        ],
-      ],
       sObject: 'Contact',
+      whereClause: {
+        left: {
+          field: 'Account.Industry',
+          operator: '=',
+          value: "'media'",
+        },
+      },
     },
   },
   {
@@ -311,11 +298,9 @@ const testCases: TestCase[] = [
             },
           ],
           subqueries: [],
-          whereClauseGroups: [],
           sObject: 'Contacts',
         },
       ],
-      whereClauseGroups: [],
       sObject: 'Account',
     },
   },
@@ -341,11 +326,9 @@ const testCases: TestCase[] = [
             },
           ],
           subqueries: [],
-          whereClauseGroups: [],
           sObject: 'Account.',
         },
       ],
-      whereClauseGroups: [],
       sObject: 'Account',
     },
   },
@@ -370,28 +353,24 @@ const testCases: TestCase[] = [
             },
           ],
           subqueries: [],
-          whereClauseGroups: [
-            [
-              {
-                field: 'CreatedBy.Alias',
-                operator: '=',
-                value: "'x'",
-              },
-            ],
-          ],
           sObject: 'Contacts',
-        },
-      ],
-      whereClauseGroups: [
-        [
-          {
-            field: 'Industry',
-            operator: '=',
-            value: "'media'",
+          whereClause: {
+            left: {
+              field: 'CreatedBy.Alias',
+              operator: '=',
+              value: "'x'",
+            },
           },
-        ],
+        },
       ],
       sObject: 'Account',
+      whereClause: {
+        left: {
+          field: 'Industry',
+          operator: '=',
+          value: "'media'",
+        },
+      },
     },
   },
   {
@@ -412,16 +391,14 @@ const testCases: TestCase[] = [
         },
       ],
       subqueries: [],
-      whereClauseGroups: [
-        [
-          {
-            field: 'Mother_of_Child__r.LastName__c',
-            operator: 'LIKE',
-            value: "'C%'",
-          },
-        ],
-      ],
       sObject: 'Daughter__c',
+      whereClause: {
+        left: {
+          field: 'Mother_of_Child__r.LastName__c',
+          operator: 'LIKE',
+          value: "'C%'",
+        },
+      },
     },
   },
   {
@@ -444,20 +421,17 @@ const testCases: TestCase[] = [
             },
           ],
           subqueries: [],
-          whereClauseGroups: [],
           sObject: 'Line_Items__r',
         },
       ],
-      whereClauseGroups: [
-        [
-          {
-            field: 'Name',
-            operator: 'LIKE',
-            value: "'Acme%'",
-          },
-        ],
-      ],
       sObject: 'Merchandise__c',
+      whereClause: {
+        left: {
+          field: 'Name',
+          operator: 'LIKE',
+          value: "'Acme%'",
+        },
+      },
     },
   },
   {
@@ -474,16 +448,14 @@ const testCases: TestCase[] = [
         },
       ],
       subqueries: [],
-      whereClauseGroups: [
-        [
-          {
-            field: 'Owner.FirstName',
-            operator: 'LIKE',
-            value: "'B%'",
-          },
-        ],
-      ],
       sObject: 'Task',
+      whereClause: {
+        left: {
+          field: 'Owner.FirstName',
+          operator: 'LIKE',
+          value: "'B%'",
+        },
+      },
     },
   },
   {
@@ -504,16 +476,14 @@ const testCases: TestCase[] = [
         },
       ],
       subqueries: [],
-      whereClauseGroups: [
-        [
-          {
-            field: 'Owner.FirstName',
-            operator: 'LIKE',
-            value: "'B%'",
-          },
-        ],
-      ],
       sObject: 'Task',
+      whereClause: {
+        left: {
+          field: 'Owner.FirstName',
+          operator: 'LIKE',
+          value: "'B%'",
+        },
+      },
     },
   },
   {
@@ -530,7 +500,6 @@ const testCases: TestCase[] = [
         },
       ],
       subqueries: [],
-      whereClauseGroups: [],
       sObject: 'Event',
     },
   },
@@ -541,7 +510,6 @@ const testCases: TestCase[] = [
     output: {
       fields: [],
       subqueries: [],
-      whereClauseGroups: [],
       sObject: 'Event',
     },
   },
@@ -566,11 +534,9 @@ const testCases: TestCase[] = [
             },
           ],
           subqueries: [],
-          whereClauseGroups: [],
           sObject: 'Notes',
         },
       ],
-      whereClauseGroups: [],
       sObject: 'Account',
     },
   },
@@ -612,11 +578,9 @@ const testCases: TestCase[] = [
             },
           ],
           subqueries: [],
-          whereClauseGroups: [],
           sObject: 'OpportunityLineItems',
         },
       ],
-      whereClauseGroups: [],
       sObject: 'Opportunity',
     },
   },
@@ -633,7 +597,6 @@ const testCases: TestCase[] = [
         },
       ],
       subqueries: [],
-      whereClauseGroups: [],
       sObject: 'LoginHistory',
     },
   },
@@ -655,21 +618,22 @@ const testCases: TestCase[] = [
         },
       ],
       subqueries: [],
-      whereClauseGroups: [
-        [
-          {
-            field: 'LoginTime',
-            operator: '>',
-            value: '2010-09-20T22:16:30.000Z',
-          },
-          {
+      sObject: 'LoginHistory',
+      whereClause: {
+        left: {
+          field: 'LoginTime',
+          operator: '>',
+          value: '2010-09-20T22:16:30.000Z',
+        },
+        operator: 'AND',
+        right: {
+          left: {
             field: 'LoginTime',
             operator: '<',
             value: '2010-09-21T22:16:30.000Z',
           },
-        ],
-      ],
-      sObject: 'LoginHistory',
+        },
+      },
       groupBy: {
         field: 'UserId',
       },
@@ -700,7 +664,6 @@ const testCases: TestCase[] = [
         },
       ],
       subqueries: [],
-      whereClauseGroups: [],
       sObject: 'RecordType',
     },
   },
@@ -722,7 +685,6 @@ const testCases: TestCase[] = [
         },
       ],
       subqueries: [],
-      whereClauseGroups: [],
       sObject: 'Opportunity',
       groupBy: {
         field: 'CampaignId',
@@ -756,7 +718,6 @@ const testCases: TestCase[] = [
         },
       ],
       subqueries: [],
-      whereClauseGroups: [],
       sObject: 'Lead',
       groupBy: {
         field: 'LeadSource',
@@ -785,7 +746,6 @@ const testCases: TestCase[] = [
         },
       ],
       subqueries: [],
-      whereClauseGroups: [],
       sObject: 'Lead',
       groupBy: {
         field: ['Status', 'LeadSource'],
@@ -831,7 +791,6 @@ const testCases: TestCase[] = [
         },
       ],
       subqueries: [],
-      whereClauseGroups: [],
       sObject: 'Account',
       groupBy: {
         field: ['Type', 'BillingCountry'],
@@ -855,7 +814,7 @@ const testCases: TestCase[] = [
         {
           field: 'Name',
           order: 'DESC',
-          nulls: 'LAST',
+          nulls: 'FIRST',
         },
         {
           field: 'Id',
@@ -881,10 +840,70 @@ const testCases: TestCase[] = [
         },
       ],
       subqueries: [],
-      whereClauseGroups: [],
       sObject: 'Contact',
       sObjectAlias: 'c',
     },
   },
+  {
+    testCase: 32,
+    soql: `SELECT Id FROM Account WHERE (Id IN ('1', '2', '3') OR (NOT Id = '2') OR (Name LIKE '%FOO%' OR (Name LIKE '%ARM%' AND FOO = 'bar')))`,
+    output: {
+      fields: [
+        {
+          text: 'Id',
+        },
+      ],
+      subqueries: [],
+      sObject: 'Account',
+      whereClause: {
+        left: {
+          openParen: true,
+          field: 'Id',
+          operator: 'IN',
+          value: ["'1'", "'2'", "'3'"],
+        },
+        operator: 'OR',
+        right: {
+          left: {
+            openParen: true,
+            logicalPrefix: 'NOT',
+            field: 'Id',
+            operator: '=',
+            value: "'2'",
+            closeParen: true,
+          },
+          operator: 'OR',
+          right: {
+            left: {
+              openParen: true,
+              field: 'Name',
+              operator: 'LIKE',
+              value: "'%FOO%'",
+              closeParen: true,
+            },
+            operator: 'OR',
+            right: {
+              left: {
+                openParen: true,
+                field: 'Name',
+                operator: 'LIKE',
+                value: "'%ARM%'",
+                closeParen: true,
+              },
+              operator: 'AND',
+              right: {
+                left: {
+                  field: 'FOO',
+                  operator: '=',
+                  value: "'bar'",
+                  closeParen: true,
+                },
+              },
+            },
+          },
+        },
+      },
+    },
+  },
 ];
 export default testCases;