Пример #1
0
        private void insertInBlock(TimeSeriesBlock block, TimeSeriesTick tick)
#endif
        {
            long t = tick.Time;
            int  i, n = block.used;

            int l = 0, r = n;

            while (l < r)
            {
                i = (l + r) >> 1;
                if (t >= block[i].Time)
                {
                    l = i + 1;
                }
                else
                {
                    r = i;
                }
            }
            Debug.Assert(l == r && (l == n || block[l].Time >= t));
            if (r == 0)
            {
                if (block[n - 1].Time - t > maxBlockTimeInterval || n == block.Ticks.Length)
                {
                    addNewBlock(tick);
                    return;
                }
                if (block.timestamp != t)
                {
                    index.Remove(new Key(block.timestamp), block);
                    block.timestamp = t;
                    index.Put(new Key(block.timestamp), block);
                }
            }
            else if (r == n)
            {
                if (t - block[0].Time > maxBlockTimeInterval || n == block.Ticks.Length)
                {
                    addNewBlock(tick);
                    return;
                }
            }
            if (n == block.Ticks.Length)
            {
                addNewBlock(block[n - 1]);
                Array.Copy(block.Ticks, r, block.Ticks, r + 1, n - r - 1);
            }
            else
            {
                if (n != r)
                {
                    Array.Copy(block.Ticks, r, block.Ticks, r + 1, n - r);
                }
                block.used += 1;
            }
            block[r] = tick;
            block.Modify();
        }
Пример #2
0
 public virtual void Add(TimeSeriesTick tick)
 {
     long time = tick.Time;
     IPersistent[] blocks = index.Get(new Key(time - maxBlockTimeInterval), new Key(time));
     if (blocks.Length != 0)
         InsertInBlock((TimeSeriesBlock) blocks[blocks.Length - 1], tick);
     else
         AddNewBlock(tick);
 }
Пример #3
0
        public void Add(TimeSeriesTick tick)
        {
            long time = tick.Time;

            foreach (TimeSeriesBlock block in index.Range(time - maxBlockTimeInterval, time, IterationOrder.DescentOrder))
            {
                insertInBlock(block, tick);
                return;
            }
            addNewBlock(tick);
        }
Пример #4
0
        private void addNewBlock(TimeSeriesTick t)
        {
            TimeSeriesBlock block = (TimeSeriesBlock)blockConstructor.Invoke(ClassDescriptor.noArgs);

            if (block == null)
            {
                throw new StorageError(StorageError.ErrorCode.CONSTRUCTOR_FAILURE);
            }
            block.timestamp = t.Time;
            block.used      = 1;
            block[0]        = t;
            index.Put(block.timestamp, block);
        }
Пример #5
0
 private void AddNewBlock(TimeSeriesTick t)
 {
     TimeSeriesBlock block;
     try
     {
         block = (TimeSeriesBlock) System.Activator.CreateInstance(blockClass);
     }
     catch (System.Exception x)
     {
         throw new StorageError(StorageError.CONSTRUCTOR_FAILURE, blockClass, x);
     }
     block.timestamp = t.Time;
     block.used = 1;
     block.Ticks[0] = t;
     index.Put(new Key(block.timestamp), block);
 }
Пример #6
0
        internal virtual void InsertInBlock(TimeSeriesBlock block, TimeSeriesTick tick)
        {
            long t = tick.Time;
            int i, n = block.used;

            TimeSeriesTick[] e = block.Ticks;
            int l = 0, r = n;
            while (l < r)
            {
                i = (l + r) >> 1;
                if (t > e[i].Time)
                {
                    l = i + 1;
                }
                else
                {
                    r = i;
                }
            }
            Assert.That(l == r && (l == n || e[l].Time >= t));
            if (r == 0)
            {
                if (e[n - 1].Time - t > maxBlockTimeInterval || n == e.Length)
                {
                    AddNewBlock(tick);
                    return;
                }
                block.timestamp = t;
            }
            else if (r == n)
            {
                if (t - e[0].Time > maxBlockTimeInterval || n == e.Length)
                {
                    AddNewBlock(tick);
                    return;
                }
            }

            if (n == e.Length)
            {
                AddNewBlock(e[n - 1]);
                for (i = n; --i > r; )
                {
                    e[i] = e[i - 1];
                }
            }
            else
            {
                for (i = n; i > r; i--)
                {
                    e[i] = e[i - 1];
                }
                block.used += 1;
            }

            e[r] = tick;
            block.Modify();
        }