/// <summary> /// /// </summary> /// <param name="token"></param> /// <param name="q"></param> public void Token( string token, QueryTranslator q ) { string lcToken = token.ToLower( System.Globalization.CultureInfo.InvariantCulture ); //Cope with [,] if( token.Equals( "[" ) && !expectingPathContinuation ) { expectingPathContinuation = false; if( expectingIndex == 0 ) { throw new QueryException( "unexpected [" ); } return; } else if( token.Equals( "]" ) ) { expectingIndex--; expectingPathContinuation = true; return; } //Cope with a continued path expression (ie. ].baz) if( expectingPathContinuation ) { if ( ContinuePathExpression( token, q ) ) return; } //Cope with a subselect if( !inSubselect && ( lcToken.Equals( "select" ) || lcToken.Equals( "from" ) ) ) { inSubselect = true; subselect = new StringBuilder( 20 ); } if( inSubselect && token.Equals( StringHelper.ClosedParen ) ) { bracketsSinceSelect--; if( bracketsSinceSelect == -1 ) { QueryTranslator subq = new QueryTranslator( subselect.ToString() ); try { subq.Compile( q ); } catch( MappingException me ) { throw new QueryException( "MappingException occurred compiling subquery", me ); } AppendToken( q, subq.SqlString ); inSubselect = false; bracketsSinceSelect = 0; } } if( inSubselect ) { if( token.Equals( StringHelper.OpenParen ) ) { bracketsSinceSelect++; } subselect.Append( token ).Append( ' ' ); return; } //Cope with special cases of AND, NOT, () SpecialCasesBefore( lcToken ); //Close extra brackets we opened if( !betweenSpecialCase && expressionTerminators.Contains( lcToken ) ) { CloseExpression( q, lcToken ); } //take note when this is a boolean expression if( booleanOperators.Contains( lcToken ) ) { booleanTests.RemoveAt( booleanTests.Count - 1 ); booleanTests.Add( true ); } if( lcToken.Equals( "not" ) ) { nots[ nots.Count - 1 ] = !( ( bool ) nots[ nots.Count - 1 ] ); negated = !negated; return; //NOTE: early return } //process a token, mapping OO path expressions to SQL expressions DoToken( token, q ); //Open any extra brackets we might need. if( !betweenSpecialCase && expressionOpeners.Contains( lcToken ) ) { OpenExpression( q, lcToken ); } //Cope with special cases of AND, NOT, ) SpecialCasesAfter( lcToken ); }