Example #1
0
        protected virtual async Task <IEnumerable <TIn> > JoinBatch(JoinBatch <TIn> batch)
        {
            if (m_rowCache.Count == 0)
            {
                InitializeCache(m_rowCache);
            }

            if (batch.Strategy == CacheLookupStrategy.NoLookup)
            {
                return(batch.Data);
            }

            Func <TIn, object> accessor = m_typeAccessor.GetPropertyAccessor(this.m_joinOnMapping.DestColumnOffset);

            var outputList       = new List <TIn>(batch.Data.Length / 2);
            var remoteLookupList = new List <TIn>(batch.Data.Length / 2);
            int missCount        = 0;

            lock (m_rowCache) //may have race condition with dimtableinserter who will update the global cache
            {
                foreach (var input in batch.Data)
                {
                    IDimRow <TLookupKey> row;
                    if (m_rowCache.TryGetValue((TLookupKey)accessor(input), out row))
                    {
                        this.OnSuccessfulLookup(input, row);
                        outputList.Add(input);
                    }
                    else
                    {
                        missCount++;

                        if (batch.Strategy == CacheLookupStrategy.RemoteLookup)
                        {
                            remoteLookupList.Add(input);
                        }
                        else
                        {
                            //Local lookup failed. record in garbage recorder as the input is discarded.
                            this.GarbageRecorder.Record(input);
                        }
                    }
                }
            }

            foreach (var cacheMiss in remoteLookupList)
            {
                //post to dim inserter to do remote lookup (insert to tmp table and do a MERGE)
                await m_dimInserter.SendAsync(cacheMiss).ConfigureAwait(false);
            }

            m_logger.DebugFormat("{0} {1} cache miss among {2} lookup in this round of JoinBatch()", FullName, missCount, batch.Data.Length);

            return(outputList);
        }
Example #2
0
        /// <summary>
        /// Retrieves the property value of column index i using the delegates stored
        /// </summary>
        /// <param name="i">column index</param>
        /// <returns></returns>
        public dynamic GetValue(int i)
        {
            Func <T, dynamic> func = m_typeAccessor.GetPropertyAccessor(i);

            /*var value = func(Current);
             * var mapping = m_typeAccessor.GetColumnMapping(i);
             *
             * Console.WriteLine("default value: "+mapping.DefaultValue);
             * Console.WriteLine("computed value: "+value);
             * Console.WriteLine("are equal: " + object.ReferenceEquals(value, mapping.DefaultValue));
             * Console.WriteLine("mapping: " + mapping.DestColumnName + ", " + mapping.DestColumnOffset);
             * Console.ReadKey();*/
            return(func(Current));
        }