Example #1
0
        public static DaxLineState ParseLine(string line, int offset, int startOfLineOffset )
        {
            StringBuilder sbTableName = new StringBuilder();
            //LineState daxState.LineState = LineState.Other;
            DaxLineState daxState = new DaxLineState(LineState.NotSet, offset, 0, 0, startOfLineOffset);
            for (var i = 0; i < line.Length; i++)
            {
                switch (line[i])
                {
                    case '\"':
                        if (daxState.LineState == LineState.String)
                            daxState.SetState(LineState.Other,i);
                        else
                            daxState.SetState(LineState.String, i);
                        break;
                    case '[':
                        if (daxState.LineState != LineState.String)
                        {
                            if (daxState.LineState == LineState.LetterOrDigit
                                || daxState.LineState == LineState.TableDelimiter)
                            {
                                daxState.SetState(LineState.Column, i);
                                if (i > 1 && line[i-1] != '\'')
                                {
                                    sbTableName.Clear();
                                    sbTableName.Append(GetPreceedingTableName(line.Substring(0, i)));
                                }
                            }
                            else daxState.SetState(LineState.Measure, i);
                        }
                        break;
                    case ']':
                        if (daxState.LineState != LineState.String)
                            daxState.SetState(LineState.Other,i);
                        break;
                    case '\'':
                        if (daxState.LineState != LineState.String && daxState.LineState != LineState.Table)
                        {
                            daxState.SetState(LineState.Table,i+1);
                            sbTableName.Clear();
                            break;
                        }
                        if (daxState.LineState == LineState.Table)
                            daxState.SetState( LineState.TableDelimiter,i);
                        break;
                    case '(':
                    case '=':
                    case '-':
                    case '\\':
                    case '*':
                    case '>':
                    case '<':
                    case '^':
                    case '%':
                    case '&':
                    case '|':
                    case ',':
                    case ';':
                    case ' ':
                        if (daxState.LineState != LineState.String
                            && daxState.LineState != LineState.Table
                            && daxState.LineState != LineState.TableDelimiter
                            && daxState.LineState != LineState.Column )

                        //if (daxState.LineState == LineState.Dmv)
                        {
                            daxState.SetState(char.IsLetterOrDigit(line[i]) ? LineState.LetterOrDigit : LineState.Other, i);
                        }
                        if (daxState.LineState == LineState.Table) sbTableName.Append(line[i]);
                        break;
                    case '.':
                        if (GetPreceedingWord(line.Substring(0,i)).ToUpper() == "$SYSTEM") {
                            if (daxState.LineState != LineState.String && daxState.LineState != LineState.Table)
                            {
                                daxState.SetState(LineState.Dmv, i+1);
                            }
                        }
                        break;
                    default:
                        if (daxState.LineState != LineState.String
                            && daxState.LineState != LineState.Table
                            && daxState.LineState != LineState.TableDelimiter
                            && daxState.LineState != LineState.Column
                            && daxState.LineState != LineState.Dmv)
                        {
                            daxState.SetState( char.IsLetterOrDigit(line[i])?LineState.LetterOrDigit:LineState.Other ,i);
                        }
                        if (daxState.LineState == LineState.Table) sbTableName.Append(line[i]);
                        break;
                }

            }

            daxState.TableName = sbTableName.ToString();
            return daxState;
        }
Example #2
0
        public static DaxLineState ParseLine(string line, int offset, int startOfLineOffset)
        {
            //System.Diagnostics.Debug.WriteLine(">>> ParseLine");

            // todo - can we get away with 1 string builder instance?
            StringBuilder sbTableName   = new StringBuilder();
            StringBuilder sbColumnName  = new StringBuilder();
            StringBuilder sbMeasureName = new StringBuilder();

            //LineState daxState.LineState = LineState.Other;
            DaxLineState daxState = new DaxLineState(LineState.NotSet, offset, 0, 0, startOfLineOffset);

            if (offset == 0)
            {
                return(daxState);
            }

            for (var i = 0; i < line.Length; i++)
            {
                switch (line[i])
                {
                case '\"':
                    if (daxState.LineState == LineState.String)
                    {
                        daxState.SetState(LineState.Other, i);
                    }
                    else
                    {
                        daxState.SetState(LineState.String, i);
                    }
                    break;

                case '[':
                    if (daxState.LineState != LineState.String)
                    {
                        if (daxState.LineState == LineState.LetterOrDigit ||
                            daxState.LineState == LineState.Table ||
                            daxState.LineState == LineState.TableClosed)
                        {
                            daxState.SetState(LineState.Column, i);
                            sbColumnName.Clear();
                            if (i > 1 && line[i - 1] != '\'')
                            {
                                sbTableName.Clear();
                                sbTableName.Append(GetPreceedingTableName(line.Substring(0, i)));
                            }
                        }
                        else
                        {
                            daxState.SetState(LineState.Measure, i);
                        }
                    }
                    break;

                case ']':
                    switch (daxState.LineState)
                    {
                    case LineState.Column:
                        daxState.SetState(LineState.ColumnClosed, i);
                        break;

                    case LineState.Measure:
                        daxState.SetState(LineState.MeasureClosed, i);
                        break;

                    case LineState.String:
                        // do nothing, stay in string state
                        break;

                    default:
                        daxState.SetState(LineState.Other, i);
                        break;
                    }

                    break;

                case '\'':
                    if (daxState.LineState != LineState.String && daxState.LineState != LineState.Table)
                    {
                        //daxState.SetState(LineState.Table,i+1);
                        daxState.SetState(LineState.Table, i);
                        sbTableName.Clear();
                        break;
                    }
                    if (daxState.LineState == LineState.Table)
                    {
                        daxState.SetState(LineState.TableClosed, i);
                    }
                    break;

                case '(':
                case '=':
                case '-':
                case '\\':
                case '*':
                case '>':
                case '<':
                case '^':
                case '%':
                case '&':
                case '|':
                case ',':
                case ';':
                case ' ':
                case '\t':
                    if (daxState.LineState != LineState.String &&
                        daxState.LineState != LineState.Table &&
                        daxState.LineState != LineState.Column &&
                        daxState.LineState != LineState.Measure
                        )
                    {
                        daxState.SetState(line[i].IsDaxLetterOrDigit() ? LineState.LetterOrDigit : LineState.Other, i);
                    }
                    if (daxState.LineState == LineState.Table)
                    {
                        sbTableName.Append(line[i]);
                    }
                    if (daxState.LineState == LineState.Column)
                    {
                        sbColumnName.Append(line[i]);
                    }
                    if (daxState.LineState == LineState.Measure)
                    {
                        sbMeasureName.Append(line[i]);
                    }
                    break;

                case '.':
                    if (GetPreceedingWord(line.Substring(0, i)).ToUpper() == "$SYSTEM")
                    {
                        if (daxState.LineState != LineState.String && daxState.LineState != LineState.Table)
                        {
                            daxState.SetState(LineState.Dmv, i + 1);
                        }
                    }
                    // TODO can tables have . in them??
                    break;

                default:
                    if (daxState.LineState != LineState.String &&
                        daxState.LineState != LineState.Table
                        //&& daxState.LineState != LineState.TableDelimiter
                        && daxState.LineState != LineState.Column &&
                        daxState.LineState != LineState.Dmv &&
                        daxState.LineState != LineState.Measure)
                    {
                        daxState.SetState(line[i].IsDaxLetterOrDigit() || line[i] == '$'?LineState.LetterOrDigit:LineState.Other, i);
                    }
                    if (daxState.LineState == LineState.Table)
                    {
                        sbTableName.Append(line[i]);
                    }
                    if (daxState.LineState == LineState.Column)
                    {
                        sbColumnName.Append(line[i]);
                    }
                    if (daxState.LineState == LineState.Measure)
                    {
                        sbMeasureName.Append(line[i]);
                    }
                    break;
                }
            }

            if (daxState.LineState != LineState.String &&
                daxState.LineState != LineState.Table &&
                daxState.LineState != LineState.Column &&
                daxState.LineState != LineState.Measure
                )
            {
                daxState.SetState(LineState.Other, line.Length);
            }

            daxState.TableName  = sbTableName.ToString();
            daxState.ColumnName = sbColumnName.ToString();
            return(daxState);
        }