public CalculationSeries(TimeSeriesDatabase db,TimeSeriesDatabaseDataSet.SeriesCatalogRow sr) : base(db,sr) { m_parser = db.Parser; m_db = db; Init(); }
// 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; } }
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); }
public CalculationSeries(TimeSeriesDatabase db) { m_parser = db.Parser; m_db = db; Init(); }
// 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; } }