using System; using System.Collections.Generic; using System.Linq.Expressions; namespace InABox.Core { public interface IAutoEntityCartesianMapping { IColumn Column { get;} IColumn Mapping { get; } } public struct AutoEntityCartesianMapping : IAutoEntityCartesianMapping { public IColumn Column { get; private set; } public IColumn Mapping { get; private set; } public AutoEntityCartesianMapping(IColumn column, IColumn mapping) { Column = column; Mapping = mapping; } } public interface IAutoEntityCartesianConstant { object Constant { get;} IColumn Mapping { get; } } public struct AutoEntityCartesianConstant: IAutoEntityCartesianConstant { public object Constant { get; private set; } public IColumn Mapping { get; private set; } public AutoEntityCartesianConstant(object constant, IColumn mapping) { Constant = constant; Mapping = mapping; } } public interface IAutoEntityCartesianTable { Type Type { get; } IFilter? Filter { get; } IColumns? Columns { get; } IAutoEntityCartesianMapping[] Mappings { get; } } public class AutoEntityCartesianTable : IAutoEntityCartesianTable { public Type Type => typeof(T); public IFilter? Filter { get; private set; } private List _mappings = new List(); public IAutoEntityCartesianMapping[] Mappings => _mappings.ToArray(); public AutoEntityCartesianTable(Filter filter) { Filter = filter; } public IColumns Columns { get { var columns = new Columns(); foreach (var mapping in _mappings) { columns.Add((mapping.Column as IColumn).Property); } return columns; } } public AutoEntityCartesianTable AddMapping(Expression> source, Expression> mapping) { _mappings.Add(new AutoEntityCartesianMapping(new Column(source), new Column(mapping))); return this; } } public interface IAutoEntityCartesianGenerator : IAutoEntityGenerator { IAutoEntityCartesianTable[] Tables { get; } IAutoEntityCartesianConstant[] Constants { get; } void Configure(); } public abstract class AutoEntityCartesianGenerator: IAutoEntityCartesianGenerator { public AutoEntityCartesianGenerator() { Configure(); } private List _tables = new List(); public IAutoEntityCartesianTable[] Tables => _tables.ToArray(); private List _constants = new List(); public IAutoEntityCartesianConstant[] Constants => _constants.ToArray(); public abstract void Configure(); protected AutoEntityCartesianTable AddTable(Filter filter) { var table = new AutoEntityCartesianTable(filter); _tables.Add(table); return table; } public void AddConstant(TType constant, Expression> mapping) { _constants.Add(new AutoEntityCartesianConstant(constant, new Column(mapping))); } public Type Definition => typeof(TInterface); public abstract bool Distinct { get; } } }