示例#1
0
 public CalculationSeries(TimeSeriesDatabase db,TimeSeriesDatabaseDataSet.SeriesCatalogRow sr)
     : base(db,sr)
 {
     m_parser = db.Parser;
     m_db = db;
     Init();
 }
示例#2
0
        // Get the value of a number or variable.
        void Atom(out ParserResult result)
        {
            double m_double;
            int    m_int;

            switch (tokType)
            {
            case Types.DOUBLE:
                stack.Add("double: " + token);
                if (Double.TryParse(token, out m_double))
                {
                    result = new ParserResult(m_double);
                }
                else
                {
                    result = new ParserResult(0.0);
                    SyntaxErr(Errors.SYNTAX);
                }
                GetToken();
                return;

            case Types.INTEGER:

                stack.Add("integer: " + token);
                if (Int32.TryParse(token, out m_int))
                {
                    result = new ParserResult(m_int);
                }
                else
                {
                    result = new ParserResult(0);
                    SyntaxErr(Errors.SYNTAX);
                }
                GetToken();
                return;

            case Types.STRING:
                stack.Add("string: " + token);
                result = new ParserResult(token);
                GetToken();
                return;

            case Types.VARIABLE:
                string alias      = "";
                int    timeOffset = 0;
                stack.Add("variable: " + token);
                m_VariableParser.ParseVariableToken(token, out alias, out timeOffset);

                if (Regex.IsMatch(alias, "\'.+\'"))
                {    // strip single quotes
                    alias = alias.Substring(1, alias.Length - 2);
                }
                result = VariableResolver.Lookup(alias, defaultTimeInterval);
                if (Debug)
                {
                    Logger.WriteLine("SeriesLookup, Series:'" + alias + "'  Time offset: " + timeOffset + ", IsString:" + result.IsString);
                }
                if (result.IsSeries)
                {
                    Series s = result.Series;
                    s.Clear();
                    if (RecursiveCalculations && s is CalculationSeries && s.Expression.Trim() != "" && s.Expression.IndexOf("this") < 0)
                    {
                        (s as CalculationSeries).Calculate(t1, t2);      // might depend on calculation
                    }
                    else
                    {     // read data
                        s = ReadAndShiftData(-timeOffset, s, t1, t2);

                        if (Debug)
                        {
                            s.WriteToConsole();
                        }

                        Logger.WriteLine("Read " + s.Count + " points.  Missing Count = " + s.CountMissing());
                        Logger.WriteLine(s.ToString());

                        result = new ParserResult(s);
                    }
                }
                GetToken();
                return;

            case Types.FUNCTION:
                ParserFunction function;
                string         subExpression = "";
                ParserUtility.TryGetFunctionCall(token, out subExpression, out function);
                stack.Add("function call: " + subExpression);
                SeriesExpressionParser parser = new SeriesExpressionParser(m_db);
                parser.VariableResolver = this.VariableResolver;
                List <ParserResult> args = new List <ParserResult>();
                bool anySeriesArgs       = false;
                for (int i = 0; i < function.Parameters.Length; i++)
                {
                    var a = parser.Evaluate(function.Parameters[i], this.t1, this.t2, defaultTimeInterval);
                    if (a.IsSeries)
                    {
                        anySeriesArgs = true;
                    }
                    args.Add(a);
                }
                if (Debug)
                {
                    Logger.WriteLine("Evaluating function '" + function.Name + "'");
                }
                result = function.Evaluate(args);
                if (result.IsSeries && !anySeriesArgs)
                {
                    result.Series.Read(this.t1, this.t2);
                }

                if (result.IsSeries && Debug)
                {
                    Logger.WriteLine("Result is a series with:");
                    Logger.WriteLine("Count = " + result.Series.Count);
                    Logger.WriteLine("Missing Count = " + result.Series.CountMissing());
                    Logger.WriteLine("AverageOfSeries = " + Math.AverageOfSeries(result.Series));
                }
                //result = new ParserResult(2);

                GetToken();
                return;

            default:
                result = new ParserResult(0.0);
                SyntaxErr(Errors.SYNTAX);
                break;
            }
        }
示例#3
0
        private void InitWithLookup(BasicDBServer server, LookupOption lookup)
        {
            InitDatabaseSettings(server);

            var look = m_settings.Get("LookupOption", LookupOption.SeriesName.ToString());

            if (look != lookup.ToString())
             {
                m_settings.Set("LookupOption", lookup.ToString());
                m_settings.Save();
             }

            m_parser = new SeriesExpressionParser(this, lookup);
            if (m_settings.ReadBoolean("HydrometVariableResolver", false))
            {
                var svr = Hydromet.HydrometInfoUtility.HydrometServerFromPreferences();
                m_parser.VariableResolver = new HydrometVariableResolver(svr);
            }

            factory = new PiscesFactory(this);

            SetUnixDateTime(UnixDateTime);
        }
示例#4
0
 public CalculationSeries(TimeSeriesDatabase db)
 {
     m_parser = db.Parser;
     m_db = db;
     Init();
 }
示例#5
0
        // Get the value of a number or variable.
        void Atom(out ParserResult result)
        {
            double m_double;
            int m_int;
            switch (tokType)
            {
                case Types.DOUBLE:
                    stack.Add("double: " + token);
                    if (Double.TryParse(token, out m_double))
                    {
                          result = new ParserResult(m_double);
                    }
                    else
                    {
                       result = new ParserResult(0.0);
                       SyntaxErr(Errors.SYNTAX);
                    }
                    GetToken();
                    return;
                case Types.INTEGER:

                    stack.Add("integer: " + token);
                    if (Int32.TryParse(token, out m_int))
                    {
                        result = new ParserResult(m_int);
                    }
                    else
                    {
                        result = new ParserResult(0);
                        SyntaxErr(Errors.SYNTAX);
                    }
                    GetToken();
                    return;
                case Types.STRING:
                    stack.Add("string: " + token);
                     result = new ParserResult(token);
                    GetToken();
                    return;

                case Types.VARIABLE:
                    string alias = "";
                    int timeOffset = 0;
                    stack.Add("variable: " + token);
                    m_VariableParser.ParseVariableToken(token, out alias, out timeOffset);

                    if (Regex.IsMatch(alias, "\'.+\'"))
                    {// strip single quotes
                        alias = alias.Substring(1, alias.Length - 2);
                    }
                    result = VariableResolver.Lookup(alias,defaultTimeInterval);
                    if( Debug)
                    Logger.WriteLine("SeriesLookup, Series:'"+alias +"'  Time offset: "+timeOffset+", IsString:"+result.IsString);
                    if (result.IsSeries)
                    {
                        Series s = result.Series;
                        s.Clear();
                        if ( RecursiveCalculations &&  s is CalculationSeries && s.Expression.Trim() != "" && s.Expression.IndexOf("this") < 0)
                        {
                            (s as CalculationSeries ).Calculate(t1, t2); // might depend on calculation
                        }
                        else
                        { // read data
                            s = ReadAndShiftData(-timeOffset, s,t1,t2);

                            if (Debug)
                                s.WriteToConsole();

                            Logger.WriteLine("Read "+s.Count+" points.  Missing Count = "+s.CountMissing());
                            Logger.WriteLine(s.ToString());

                           result =  new ParserResult(s);
                        }
                    }
                    GetToken();
                    return;
                case Types.FUNCTION:
                    ParserFunction function;
                    string subExpression = "";
                    ParserUtility.TryGetFunctionCall(token, out subExpression, out function);
                    stack.Add("function call: " + subExpression);
                    SeriesExpressionParser parser = new SeriesExpressionParser(m_db);
                    parser.VariableResolver = this.VariableResolver;
                    List<ParserResult> args = new List<ParserResult>();
                    bool anySeriesArgs = false;
                    for (int i = 0; i < function.Parameters.Length; i++)
                    {
                        var  a = parser.Evaluate(function.Parameters[i], this.t1, this.t2,defaultTimeInterval);
                        if (a.IsSeries)
                            anySeriesArgs = true;
                        args.Add(a);
                    }
                    if( Debug)
                       Logger.WriteLine("Evaluating function '" + function.Name + "'");
                    result =  function.Evaluate(args);
                    if (result.IsSeries && !anySeriesArgs)
                        result.Series.Read(this.t1, this.t2);

                    if( result.IsSeries && Debug)
                    {
                        Logger.WriteLine("Result is a series with:");
                        Logger.WriteLine("Count = " + result.Series.Count);
                        Logger.WriteLine("Missing Count = " + result.Series.CountMissing());
                        Logger.WriteLine("AverageOfSeries = "+Math.AverageOfSeries(result.Series));
                      }
                    //result = new ParserResult(2);

                    GetToken();
                    return;
                default:
                    result = new ParserResult(0.0);
                    SyntaxErr(Errors.SYNTAX);
                    break;
            }
        }