using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; namespace InABox.Core { public interface IAutoEntityUnionGenerator : IAutoEntityGenerator { IAutoEntityUnionTable[] Tables { get; } } public interface IAutoEntityUnionConstant { object Value { get; } IColumn Mapping { get; } } public class AutoEntityUnionConstant : IAutoEntityUnionConstant { public object Value { get; private set; } public IColumn Mapping { get; private set; } public AutoEntityUnionConstant(object value, IColumn mapping) { Value = value; Mapping = mapping; } } public interface IAutoEntityUnionTable { Type Entity { get; } IFilter? Filter { get; } AutoEntityUnionConstant[] Constants { get; } } public class AutoEntityUnionTable : IAutoEntityUnionTable { public Type Entity => typeof(TEntity); public IFilter? Filter { get; } private List _constants = new List(); public AutoEntityUnionConstant[] Constants => _constants.ToArray(); public AutoEntityUnionTable(Filter? filter) { Filter = filter; } public AutoEntityUnionTable AddConstant(Expression> mapping, TType constant) { _constants.Add(new AutoEntityUnionConstant(constant, new Column(mapping))); return this; } } public abstract class AutoEntityUnionGenerator : IAutoEntityUnionGenerator { public AutoEntityUnionGenerator() { Configure(); } private List _tables = new List(); public IAutoEntityUnionTable[] Tables => _tables.ToArray(); public AutoEntityUnionTable AddTable(Filter? filter = null) { var table = new AutoEntityUnionTable(filter); _tables.Add(table); return table; } protected abstract void Configure(); public Type Definition => typeof(TInterface); public abstract bool Distinct { get; } public abstract Column[] IDColumns { get; } IColumn[] IAutoEntityGenerator.IDColumns => IDColumns; } }