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(); }
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); }
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); }
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); }
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); }
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(); }