예제 #1
0
        public void IndexCollectionScan <TT>(string memberName, TT[] values)
        {
            var p = new RowScanPlanItem(_journal, _tx);

            p.AddContainsScan(Metadata.GetColumnByPropertyName(memberName), values);
            _planHead = p;
        }
예제 #2
0
 public UnionPlanItem(IPlanItem left, IPlanItem right)
 {
     _left      = left;
     _right     = right;
     Timestamps = new DateRange(_left.Timestamps);
     Timestamps.Union(_right.Timestamps);
 }
예제 #3
0
 public void Logical(ResultSetBuilder left, ResultSetBuilder right, ExpressionType op)
 {
     if (op == ExpressionType.And)
     {
         _planHead = OptimizeIntersect(left._planHead, right._planHead);
     }
     else if (op == ExpressionType.Or)
     {
         if (left._planHead is TimestampRangePlanItem &&
             right._planHead is TimestampRangePlanItem)
         {
             _planHead = left._planHead;
             _planHead.Timestamps.Union(right._planHead.Timestamps);
             return;
         }
         if (left._planHead is RowScanPlanItem && right._planHead is RowScanPlanItem)
         {
             var rowScan1 = (RowScanPlanItem)left._planHead;
             var rowScan2 = (RowScanPlanItem)right._planHead;
             if (rowScan1.TryUnion(rowScan2))
             {
                 _planHead = left.PlanItem;
                 return;
             }
         }
         _planHead = new UnionPlanItem(left._planHead, right._planHead);
     }
     else
     {
         throw new NotImplementedException();
     }
 }
예제 #4
0
        public void TakeLatestBy(string latestBySymbol)
        {
            var column = Metadata.GetColumnByPropertyName(latestBySymbol);

            if (_planHead == null)
            {
                _planHead = CreateLastestByIdPlanItem(column);
            }
            else if (_planHead is TimestampRangePlanItem)
            {
                var newHead = CreateLastestByIdPlanItem(column);
                newHead.Intersect(_planHead);
                _planHead = newHead;
            }
            else
            {
                if (!AddLatestToColumnScan(_planHead, latestBySymbol))
                {
                    var queryBySym = CreateLastestByIdPlanItem(column);
                    _planHead = new IntersectPlanItem(queryBySym, _planHead);
                }
                else
                {
                    _planHead = RebuildWithLatest(_planHead, column);
                }
            }
        }
예제 #5
0
        public void ColumnLambdaScan <T>(IColumnMetadata column, Func <T, bool> lambda)
        {
            var planItem = new RowScanPlanItem(_journal, _tx);

            planItem.AddLambdaScan(column, lambda);
            _planHead = planItem;
        }
예제 #6
0
        public void ColumnScan <T>(IColumnMetadata column, T literal)
        {
            var planItem = new RowScanPlanItem(_journal, _tx);

            planItem.AddContainsScan(column, literal);
            _planHead = planItem;
        }
예제 #7
0
        public IntersectPlanItem(IPlanItem left, IPlanItem right)
        {
            _left      = left;
            _right     = right;
            Timestamps = new DateRange(left.Timestamps);
            Timestamps.Intersect(right.Timestamps);

            left.Intersect(right);
            right.Intersect(left);
        }
예제 #8
0
        private IPlanItem RebuildWithLatest(IPlanItem planHead, IColumnMetadata latestByColumn)
        {
            var column  = Metadata.GetColumnByPropertyName(latestByColumn.PropertyName);
            var intersc = planHead as IntersectPlanItem;

            if (intersc != null)
            {
                if (AddLatestToColumnScan(intersc.Left, latestByColumn.PropertyName))
                {
                    return
                        (new IntersectPlanItem(
                             RebuildWithLatest(intersc.Left, latestByColumn),
                             intersc.Right));
                }
                if (AddLatestToColumnScan(intersc.Right, latestByColumn.PropertyName))
                {
                    return(new IntersectPlanItem(intersc.Left,
                                                 RebuildWithLatest(intersc.Right, latestByColumn)));
                }
                throw new InvalidOperationException("One of the Intersect path " +
                                                    "supposed to be reduced with" +
                                                    " Latest by symbol plan");
            }

            var union = planHead as UnionPlanItem;

            if (union != null)
            {
                return(new UnionPlanItem(
                           RebuildWithLatest(union.Left, latestByColumn),
                           RebuildWithLatest(union.Right, latestByColumn)));
            }

            var scan = planHead as IColumnScanPlanItemCore;

            if (scan != null)
            {
                if (scan.CanTranformLastestByIdPlanItem(latestByColumn))
                {
                    scan.ApplyLastestByIdPlanItem(latestByColumn);
                    return(planHead);
                }
            }
            var timestmp = planHead as TimestampRangePlanItem;

            if (timestmp != null)
            {
                var newItem = CreateLastestByIdPlanItem(column);
                newItem.Timestamps.Intersect(timestmp.Timestamps);
                return(newItem);
            }

            throw new NotSupportedException("Plan type is not supported " + planHead.GetType());
        }
예제 #9
0
        public QueryRowsResult Build()
        {
            if (_planHead != null)
            {
                _planHead = OptimizePlan(_planHead);
            }
            else
            {
                _planHead = new TimestampRangePlanItem(DateInterval.Any);
            }
            IEnumerable <long> rowIDs = _planHead.Execute(_journal, _tx, GetTimestampOrder());

            return(BindPostResult(rowIDs));
        }
예제 #10
0
        public void ColumnNotNullScan(IColumnMetadata column)
        {
            var planItem = new RowScanPlanItem(_journal, _tx);

            _planHead = planItem;

            if (!Metadata.IsNullColumnID.HasValue || !column.Nullable || column.NullIndex < 0)
            {
                return;
            }

            var isNullColumn = Metadata.GetColumnByID(Metadata.IsNullColumnID.Value);
            Func <ByteArray, bool> lambda = ba => !ba.IsSet(column.NullIndex);

            planItem.AddLambdaScan(isNullColumn, lambda);
        }
예제 #11
0
        public void IndexCollectionScan(string memberName, IEnumerable values, Expression exp)
        {
            var p      = new RowScanPlanItem(_journal, _tx);
            var column = Metadata.GetColumnByPropertyName(memberName);

            switch (column.DataType.ColumnType)
            {
            case EFieldType.Byte:
                p.AddContainsScan(column, ToIList <byte>(values));
                break;

            case EFieldType.Bool:
                p.AddContainsScan(column, ToIList <bool>(values));
                break;

            case EFieldType.Int16:
                p.AddContainsScan(column, ToIList <short>(values));
                break;

            case EFieldType.Int32:
                p.AddContainsScan(column, ToIList <int>(values));
                break;

            case EFieldType.Int64:
                p.AddContainsScan(column, ToIList <long>(values));
                break;

            case EFieldType.Double:
                p.AddContainsScan(column, ToIList <double>(values));
                break;

            case EFieldType.Symbol:
            case EFieldType.String:
                p.AddContainsScan(column, ToIList <string>(values));
                break;

            case EFieldType.DateTime:
            case EFieldType.DateTimeEpochMs:
                p.AddContainsScan(column, ToIList <DateTime>(values));
                break;

            default:
                throw QueryExceptionExtensions.ExpressionNotSupported(
                          string.Format("Column of type {0} cannot be bound to Contains expressions", column.DataType.ColumnType), exp);
            }
            _planHead = p;
        }
예제 #12
0
        private bool AddLatestToColumnScan(IPlanItem planHead, string latestBySymbol)
        {
            var intersc = planHead as IntersectPlanItem;

            if (intersc != null)
            {
                return(AddLatestToColumnScan(intersc.Left, latestBySymbol) ||
                       AddLatestToColumnScan(intersc.Right, latestBySymbol));
            }
            var union = planHead as UnionPlanItem;

            if (union != null)
            {
                return(AddLatestToColumnScan(union.Left, latestBySymbol) &&
                       AddLatestToColumnScan(union.Right, latestBySymbol));
            }
            var scan = planHead as IColumnScanPlanItemCore;

            if (scan != null)
            {
                var col = Metadata.GetColumnByPropertyName(latestBySymbol);
                if (scan.CanTranformLastestByIdPlanItem(col))
                {
                    return(true);
                }
                return(false);
            }

            var timestmp = planHead as TimestampRangePlanItem;

            if (timestmp != null)
            {
                return(true);
            }

            throw new NotSupportedException("Plan type is not supported " + planHead.GetType());
        }
예제 #13
0
        private static IPlanItem OptimizeIntersect(IPlanItem left, IPlanItem right)
        {
            if (right is TimestampRangePlanItem)
            {
                left.Intersect(right);
                return(left);
            }
            if (left is TimestampRangePlanItem)
            {
                right.Intersect(left);
                return(right);
            }

            if (left is RowScanPlanItem && right is RowScanPlanItem)
            {
                var rowScan1 = (RowScanPlanItem)left;
                var rowScan2 = (RowScanPlanItem)right;
                if (rowScan1.TryIntersect(rowScan2))
                {
                    return(left);
                }
            }
            return(new IntersectPlanItem(left, right));
        }
예제 #14
0
 public ResultSetBuilder(IJournalCore journal, IReadTransactionContext tx)
 {
     _journal  = journal;
     _tx       = tx;
     _planHead = new TimestampRangePlanItem(DateInterval.Any);
 }
예제 #15
0
 public void ApplyFilter(ResultSetBuilder filter)
 {
     _planHead = OptimizeIntersect(_planHead, filter._planHead);
 }
예제 #16
0
 private IPlanItem OptimizePlan(IPlanItem planHead)
 {
     return(planHead);
 }
예제 #17
0
 public LastestByPlanItem(IColumnMetadata column, IPlanItem child = null)
 {
     _column    = column;
     _child     = child;
     Timestamps = new DateRange();
 }
예제 #18
0
 public void TimestampInterval(DateInterval filterInterval)
 {
     _planHead = new TimestampRangePlanItem(filterInterval);
 }
예제 #19
0
 public void Intersect(IPlanItem restriction)
 {
     Timestamps.Intersect(restriction.Timestamps);
     _left.Intersect(restriction);
     _right.Intersect(restriction);
 }
예제 #20
0
 public LastestByPlanItem(IColumnMetadata column, T[] literals, IPlanItem child = null)
     : this(column, child)
 {
     _keys = literals;
 }