internal void AddValueToDictionary(bool yesterdayData, string key, double percentageSharesHeld, double sharesHeld, double value, uint rawDataRowId)
        {
            Dictionary <string, AggValues> sumDictionary;
            AggValues aggTemp;

            if (yesterdayData)
            {
                sumDictionary = yesterdayAggResults;
            }
            else
            {
                sumDictionary = aggResults;
            }

            lock (dictionaryLock)
            {
                if (sumDictionary.TryGetValue(key, out aggTemp))
                {
                    // TODO: make sure reference is the same, and that dictionary updates.
                    aggTemp.AddToValue(value);
                    aggTemp.AddToSharesHeld(sharesHeld);
                    aggTemp.AddToPercentSharesHeld(percentageSharesHeld);
                    aggTemp.AddRowChunkReference(rawDataRowId);
                }
                else
                {
                    aggTemp = new AggValues();
                    aggTemp.AddToValue(value);
                    aggTemp.AddToSharesHeld(sharesHeld);
                    aggTemp.AddToPercentSharesHeld(percentageSharesHeld);
                    aggTemp.AddRowChunkReference(rawDataRowId);
                    sumDictionary.Add(key, aggTemp);
                }
            }
        }
        private void CrossesYesterdayValueComparison(CriteriaSetObj criteriaObj, ThresholdComparison compare)
        {
            int    rawDataChunkIndex;
            int    stockDataIndex;
            double columnValue = 0.0, thresholdCrossed = 0.0;
            ThresholdComparison    comparison = compare;
            CriteriaSetObj         criteria = criteriaObj;
            ThresholdColumn        crossesColumn = criteria.postAggObj.thresholdColumn;
            IReadOnlyList <double> thresholds = criteria.postAggObj.GetRefToThresholdValues();
            IReadOnlyDictionary <string, AggValues> todaysParsedDataDictionary = criteria.GetRefToAggResults();
            IReadOnlyDictionary <string, AggValues> yesterdaysParsedDataDictionary = criteria.GetRefToYesterdayAggResults();
            AggValues todaysAgg;
            AggValues yestedayAgg;
            bool      keyExistsYesterday, todayGreaterYesterday;

            if (crossesColumn == ThresholdColumn.Undefiend)
            {
                // TODO: do something else
                return;
            }

            WriteThresholdHeader(criteria);

            foreach (string key in todaysParsedDataDictionary.Keys)
            {
                todaysParsedDataDictionary.TryGetValue(key, out todaysAgg); // should always find something
                keyExistsYesterday = yesterdaysParsedDataDictionary.TryGetValue(key, out yestedayAgg);
                if (!keyExistsYesterday)
                {
                    yestedayAgg = new AggValues(); // all values are 0 then.
                }

                switch (crossesColumn)
                {
                case ThresholdColumn.PrecentageSharesHeld:
                {
                    columnValue = todaysAgg.percentageSharesHeld;
                    if (columnValue > yestedayAgg.percentageSharesHeld)
                    {
                        todayGreaterYesterday = true;
                    }
                    else
                    {
                        todayGreaterYesterday = false;
                    }
                    thresholdCrossed = PreciseThresholdCrossed(todayGreaterYesterday, columnValue, thresholds);
                    break;
                }

                case ThresholdColumn.SharesHeld:
                {
                    columnValue = todaysAgg.sharesHeld;
                    if (columnValue > yestedayAgg.sharesHeld)
                    {
                        todayGreaterYesterday = true;
                    }
                    else
                    {
                        todayGreaterYesterday = false;
                    }
                    thresholdCrossed = PreciseThresholdCrossed(todayGreaterYesterday, columnValue, thresholds);
                    break;
                }

                case ThresholdColumn.Value:
                {
                    columnValue = todaysAgg.value;
                    if (columnValue > yestedayAgg.value)
                    {
                        todayGreaterYesterday = true;
                    }
                    else
                    {
                        todayGreaterYesterday = false;
                    }
                    thresholdCrossed = PreciseThresholdCrossed(todayGreaterYesterday, columnValue, thresholds);
                    break;
                }

                default:
                {
                    break;
                }
                }

                // TODO: write to files
                criteriaFilterWriter.WriteLine(GetAggValuesCommaSeparatedString(key, todaysAgg));

                IReadOnlyList <uint> unaggregatedDictEntry = todaysAgg.GetRefToRowsInChunk();
                for (int i = 0; i < unaggregatedDictEntry.Count; i++)
                {
                    rawDataChunkIndex = (int)unaggregatedDictEntry[i] >> 16;
                    stockDataIndex    = (int)unaggregatedDictEntry[i] & 0xffff;
                    StockDataEntry sde = Global.parsedRawData[rawDataChunkIndex].chunkDataParsed[stockDataIndex];
                    criteriaFilterDetailsWriter.WriteLine(GetCommaSeparatedStockDataEntryWithKey(sde, key));
                }

                criteriaThresholdWriter.WriteLine(GetCommaSeparatedThresholdEntry(key, columnValue, thresholdCrossed));
            }

            criteriaFilterWriter.Dispose();
            criteriaFilterDetailsWriter.Dispose();
            criteriaThresholdWriter.Dispose();
        }
 private string GetAggValuesCommaSeparatedString(string key, AggValues agg)
 {
     return(key + "," + Convert.ToString(agg.percentageSharesHeld) + "," + Convert.ToString(agg.sharesHeld) + "," + Convert.ToString(agg.value));
 }
 internal void AddToOutputEntry(string key, AggValues values)
 {
     thresholdRelevantEntries.Add(key, values);
 }