Esempio n. 1
0
 public MListExpression(Type type, PrimaryKeyExpression backID, IntervalExpression?externalPeriod, TableMList tr)
     : base(DbExpressionType.MList, type)
 {
     this.BackID         = backID;
     this.ExternalPeriod = externalPeriod;
     this.TableMList     = tr;
 }
Esempio n. 2
0
        public EntityExpression(Type type, PrimaryKeyExpression externalId,
                                IntervalExpression?externalPeriod,
                                Alias?tableAlias,
                                IEnumerable <FieldBinding>?bindings,
                                IEnumerable <MixinEntityExpression>?mixins,
                                IntervalExpression?tablePeriod, bool avoidExpandOnRetrieving)
            : base(DbExpressionType.Entity, type)
        {
            if (type == null)
            {
                throw new ArgumentNullException(nameof(type));
            }

            if (!type.IsEntity())
            {
                throw new ArgumentException("type");
            }
            this.Table      = Schema.Current.Table(type);
            this.ExternalId = externalId ?? throw new ArgumentNullException(nameof(externalId));

            this.TableAlias = tableAlias;
            this.Bindings   = bindings.ToReadOnly();
            this.Mixins     = mixins.ToReadOnly();

            this.ExternalPeriod = externalPeriod;
            this.TablePeriod    = tablePeriod;

            this.AvoidExpandOnRetrieving = avoidExpandOnRetrieving;
        }
Esempio n. 3
0
 public AdditionalFieldExpression(Type type, PrimaryKeyExpression backID, IntervalExpression?externalPeriod, PropertyRoute route)
     : base(DbExpressionType.AdditionalField, type)
 {
     this.BackID         = backID;
     this.Route          = route;
     this.ExternalPeriod = externalPeriod;
 }
Esempio n. 4
0
 public MListElementExpression(PrimaryKeyExpression rowId, EntityExpression parent, Expression?order, Expression element, IntervalExpression?systemPeriod, TableMList table, Alias alias)
     : base(DbExpressionType.MListElement, typeof(MListElement <,>).MakeGenericType(parent.Type, element.Type))
 {
     this.RowId       = rowId;
     this.Parent      = parent;
     this.Order       = order;
     this.Element     = element;
     this.TablePeriod = systemPeriod;
     this.Table       = table;
     this.Alias       = alias;
 }
Esempio n. 5
0
        internal static Expression?Overlaps(this IntervalExpression?interval1, IntervalExpression?interval2)
        {
            if (interval1 == null)
            {
                return(null);
            }

            if (interval2 == null)
            {
                return(null);
            }

            if (interval1.PostgresRange != null)
            {
                return(new SqlFunctionExpression(typeof(bool), null, "&&", new Expression[] { interval1.PostgresRange !, interval2.PostgresRange ! }));
Esempio n. 6
0
        public ImplementedByAllExpression(Type type, Expression id, TypeImplementedByAllExpression typeId, IntervalExpression?externalPeriod)
            : base(DbExpressionType.ImplementedByAll, type)
        {
            if (id == null)
            {
                throw new ArgumentNullException(nameof(id));
            }

            if (id.Type != typeof(string))
            {
                throw new ArgumentException("string");
            }
            this.Id             = id;
            this.TypeId         = typeId ?? throw new ArgumentNullException(nameof(typeId));
            this.ExternalPeriod = externalPeriod;
        }
Esempio n. 7
0
        internal Expression GetProjectorExpression(Alias tableAlias, QueryBinder binder)
        {
            Schema.Current.AssertAllowed(this.BackReference.ReferenceTable.Type, inUserInterface: false);

            Type elementType = typeof(MListElement <,>).MakeGenericType(BackReference.FieldType, Field.FieldType);

            var rowId = RowIdExpression(tableAlias);
            IntervalExpression?period = GenerateSystemPeriod(tableAlias, binder);

            return(new MListElementExpression(
                       rowId,
                       (EntityExpression)this.BackReference.GetExpression(tableAlias, binder, null !, period),
                       this.Order == null ? null : OrderExpression(tableAlias),
                       this.Field.GetExpression(tableAlias, binder, rowId, period),
                       period,
                       this,
                       tableAlias));
        }
Esempio n. 8
0
        internal Expression FieldExpression(Alias tableAlias, QueryBinder binder, IntervalExpression?externalPeriod, bool withRowId)
        {
            var rowId = RowIdExpression(tableAlias);

            var exp = Field.GetExpression(tableAlias, binder, rowId, externalPeriod);

            if (!withRowId)
            {
                return(exp);
            }

            var type = this.Field.FieldType;

            var ci = typeof(MList <> .RowIdElement).MakeGenericType(type).GetConstructor(new[] { type, typeof(PrimaryKey), typeof(int?) });

            var order = Order == null ? (Expression)Expression.Constant(null, typeof(int?)) : OrderExpression(tableAlias).Nullify();

            return(Expression.New(ci, exp, rowId.UnNullify(), order));
        }
Esempio n. 9
0
        internal override Expression GetExpression(Alias tableAlias, QueryBinder binder, Expression id, IntervalExpression?period, EntityContextInfo?entityContext)
        {
            var implementations = ImplementationColumns.SelectDictionary(t => t, (t, ic) =>
                                                                         new EntityExpression(t, new PrimaryKeyExpression(new ColumnExpression(ic.Type.Nullify(), tableAlias, ic.Name)), period, null, null, null, null, AvoidExpandOnRetrieving));

            var result = new ImplementedByExpression(IsLite ? Lite.Extract(FieldType) ! : FieldType, SplitStrategy, implementations);

            if (this.IsLite)
            {
                return(binder.MakeLite(result, null));
            }
            else
            {
                return(result);
            }
        }
Esempio n. 10
0
        internal override Expression GetExpression(Alias tableAlias, QueryBinder binder, Expression id, IntervalExpression?period, EntityContextInfo?entityContext)
        {
            var bindings = (from kvp in Fields
                            let fi = kvp.Value.FieldInfo
                                     select new FieldBinding(fi, kvp.Value.Field.GetExpression(tableAlias, binder, id, period, entityContext)))
                           .Concat(entityContext == null ? Enumerable.Empty <FieldBinding>() : Schema.Current.GetAdditionalQueryBindings(this.Route, entityContext, period))
                           .ToReadOnly();

            return(new MixinEntityExpression(this.FieldType, bindings, tableAlias, this, entityContext));
        }
Esempio n. 11
0
        internal override Expression GetExpression(Alias tableAlias, QueryBinder binder, Expression id, IntervalExpression?period, EntityContextInfo?entityContext)
        {
            var bindings = (from kvp in EmbeddedFields
                            let fi = kvp.Value.FieldInfo
                                     select new FieldBinding(fi, kvp.Value.Field.GetExpression(tableAlias, binder, id, period, entityContext)))
                           .Concat(entityContext == null ? Enumerable.Empty <FieldBinding>() : Schema.Current.GetAdditionalQueryBindings(this.Route, entityContext, period))
                           .ToReadOnly();

            var mixins = this.Mixins?.Values.Select(m => (MixinEntityExpression)m.GetExpression(tableAlias, binder, id, period, entityContext)).ToReadOnly();

            Expression hasValue = HasValue == null?SmartEqualizer.NotEqualNullable(id,
                                                                                   id is PrimaryKeyExpression?QueryBinder.NullId(((PrimaryKeyExpression)id).ValueType) : (Expression)Expression.Constant(null, id.Type.Nullify())) :
                                      new ColumnExpression(((IColumn)HasValue).Type, tableAlias, HasValue.Name);

            return(new EmbeddedEntityExpression(this.FieldType, hasValue, bindings, mixins, this, null, entityContext));
        }
Esempio n. 12
0
 internal override Expression GetExpression(Alias tableAlias, QueryBinder binder, Expression id, IntervalExpression?period, EntityContextInfo?entityContext)
 {
     return(new MListExpression(FieldType, (PrimaryKeyExpression)id, period, TableMList)); // keep back id empty for some seconds
 }
Esempio n. 13
0
 internal override Expression GetExpression(Alias tableAlias, QueryBinder binder, Expression id, IntervalExpression?period, EntityContextInfo?entityContext)
 {
     return(Expression.Convert(new ColumnExpression(this.Type, tableAlias, Name), FieldType));
 }
Esempio n. 14
0
        internal ReadOnlyCollection <MixinEntityExpression>?GenerateMixins(Alias tableAlias, QueryBinder binder, Expression id, IntervalExpression?period, EntityContextInfo?context)
        {
            if (this.Mixins == null)
            {
                return(null);
            }

            return(this.Mixins.Values.Select(m => (MixinEntityExpression)m.GetExpression(tableAlias, binder, id, period, context)).ToReadOnly());
        }
Esempio n. 15
0
 internal override Expression GetExpression(Alias tableAlias, QueryBinder binder, Expression id, IntervalExpression?period, EntityContextInfo?entityContext)
 {
     return(new PrimaryKeyExpression(new ColumnExpression(this.Type.Nullify(), tableAlias, this.Name).Nullify()));
 }
Esempio n. 16
0
 internal abstract Expression GetExpression(Alias tableAlias, QueryBinder binder, Expression id, IntervalExpression?period, EntityContextInfo?entityContext);
Esempio n. 17
0
        internal IEnumerable <FieldBinding> GetAdditionalQueryBindings(PropertyRoute parent, EntityContextInfo entityContext, IntervalExpression?period)
        {
            //AssertAllowed(parent.RootType, inUserInterface: false);

            var ee = entityEvents.TryGetC(parent.RootType);

            if (ee == null || ee.AdditionalBindings == null)
            {
                return(Enumerable.Empty <FieldBinding>());
            }

            return(ee.AdditionalBindings
                   .Where(kvp => kvp.Key.Parent !.Equals(parent))
                   .Select(kvp => new FieldBinding(kvp.Key.FieldInfo !, new AdditionalFieldExpression(kvp.Key.FieldInfo !.FieldType, entityContext.EntityId, entityContext.MListRowId, period, kvp.Key)))
                   .ToList());
        }
Esempio n. 18
0
        internal override Expression GetExpression(Alias tableAlias, QueryBinder binder, Expression id, IntervalExpression?period)
        {
            var bindings = (from kvp in Fields
                            let fi = kvp.Value.FieldInfo
                                     select new FieldBinding(fi, kvp.Value.Field.GetExpression(tableAlias, binder, id, period)))
                           .Concat(Schema.Current.GetAdditionalQueryBindings(this.Route, (PrimaryKeyExpression)id, period))
                           .ToReadOnly();

            return(new MixinEntityExpression(this.FieldType, bindings, tableAlias, this));
        }
Esempio n. 19
0
 internal abstract Expression GetExpression(Alias tableAlias, QueryBinder binder, Expression id, IntervalExpression?period);
Esempio n. 20
0
        internal override Expression GetExpression(Alias tableAlias, QueryBinder binder, Expression id, IntervalExpression?period, EntityContextInfo?entityContext)
        {
            Expression result = new ImplementedByAllExpression(
                IsLite ? Lite.Extract(FieldType) ! : FieldType,
                new ColumnExpression(Column.Type, tableAlias, Column.Name),
                new TypeImplementedByAllExpression(new PrimaryKeyExpression(new ColumnExpression(ColumnType.Type.Nullify(), tableAlias, ColumnType.Name))),
                period);

            if (this.IsLite)
            {
                return(binder.MakeLite(result, null));
            }
            else
            {
                return(result);
            }
        }
Esempio n. 21
0
        internal ReadOnlyCollection <FieldBinding> GenerateBindings(Alias tableAlias, QueryBinder binder, Expression id, IntervalExpression?period, EntityContextInfo?entityContext)
        {
            List <FieldBinding> result = new List <FieldBinding>
            {
                new FieldBinding(Table.fiId, id)
            };

            foreach (var ef in this.Fields.Values)
            {
                var fi = ef.FieldInfo;

                if (!ReflectionTools.FieldEquals(fi, fiId))
                {
                    result.Add(new FieldBinding(fi, ef.Field.GetExpression(tableAlias, binder, id, period, entityContext)));
                }
            }

            if (this.Type.IsEntity() && entityContext != null)
            {
                result.AddRange(Schema.Current.GetAdditionalQueryBindings(PropertyRoute.Root(this.Type), entityContext, period));
            }

            return(result.ToReadOnly());
        }
Esempio n. 22
0
        internal override Expression GetExpression(Alias tableAlias, QueryBinder binder, Expression id, IntervalExpression?period, EntityContextInfo?entityContext)
        {
            if (this.Type == this.FieldType)
            {
                return(new ColumnExpression(this.Type, tableAlias, this.Name));
            }

            if (this.Type == typeof(DateTime))
            {
                return(Expression.Property(new ColumnExpression(this.Type, tableAlias, this.Name), piDateTimeTicks));
            }

            throw new NotImplementedException("FieldTicks of type {0} not supported".FormatWith(this.Type));
        }
Esempio n. 23
0
        internal override Expression GetExpression(Alias tableAlias, QueryBinder binder, Expression id, IntervalExpression?period, EntityContextInfo?entityContext)
        {
            var column = new ColumnExpression(this.Type, tableAlias, this.Name);

            if (this.Type == this.FieldType)
            {
                return(column);
            }

            return(Expression.Convert(column, this.FieldType));
        }
Esempio n. 24
0
        internal override Expression GetExpression(Alias tableAlias, QueryBinder binder, Expression id, IntervalExpression?period, EntityContextInfo?entityContext)
        {
            Type cleanType = IsLite ? Lite.Extract(FieldType) ! : FieldType;

            var result = new EntityExpression(cleanType, new PrimaryKeyExpression(new ColumnExpression(this.Type.Nullify(), tableAlias, Name)), period, null, null, null, null, AvoidExpandOnRetrieving);

            if (this.IsLite)
            {
                return(binder.MakeLite(result, null));
            }
            else
            {
                return(result);
            }
        }