public void LinkParentTable(TableDataBuilder parent) { if (Parent != null) { throw new InvalidOperationException("A parent table builder is already linked"); } var asKey = Schema.Keys.Any(); Parent = parent; _parentReferences.Clear(); foreach (var pk in Parent.Schema.Keys) { _parentReferences.Add(new Field { FieldType = asKey ? FieldType.Key : FieldType.Dimension, Name = pk.Value.Name, ValueType = pk.Value.ValueType }, pk.Index); } _fieldList.AddRange(_parentReferences.Keys); Schema.Associate(parent.Schema, _parentReferences.Keys, Parent.Schema.Keys.Select(fp => fp.Value), false); UpdateSchema(); }
public override void InitializeRelatedTables(DataProcessor processor, TableDataBuilder table) { if (!InlineFields) { var tables = processor.TableMap.Tables; var current = tables.FirstOrDefault(t => t.Name == TableName) as TableDataBuilder; if (current != null) { if (!current.Schema.FieldsAreEqual(LookupTableBuilder.Schema) || current.GetType() != LookupTableBuilder.GetType()) { throw new InvalidOperationException("Lookup tables with the same name must have the same schema and type to be shared"); } LookupTableBuilder.Schema.ClearRelations(); LookupTableBuilder = current; } else { //Insert dimension tables in the start, since it is referenced by other tables tables.Insert(0, LookupTableBuilder); } table.Schema.Associate(LookupTableBuilder.Schema, table.Schema.Fields.Where(f => Fields.Contains(f)).ToArray(), LookupTableBuilder.Schema.Keys.Select(fp => fp.Value), true); } //Initialize realted tables in field mappers foreach (var fm in FieldMappers) { fm.InitializeRelatedTables(processor, InlineFields ? table : LookupTableBuilder); } base.InitializeRelatedTables(processor, table); }
public void Initialize(DataProcessor processor, TableDataBuilder parentTable) { foreach (var mapper in TableMappers) { mapper.Initialize(processor, parentTable); } }
public override void InitializeRelatedTables(DataProcessor processor, TableDataBuilder table) { foreach (var fm in FieldMappers.SelectMany(fms => fms)) { fm.InitializeRelatedTables(processor, table); } }
public object GetValue(TableDataBuilder builder, Indexed <Field> field, object[] row) { var fields = _scope._uniqueChildFields .GetOrAdd(builder, () => new Dictionary <object[], bool[]>(builder.RowMap.Comparer)) .GetOrAdd(row, () => new bool[row.Length]); var firstTimeInScope = !fields[field.Index]; fields[field.Index] = true; return(firstTimeInScope ? _value : null); }
protected override IEnumerable<Field> CreateFields() { _iterator = new FieldMapperIterator(FieldMappers); if (!InlineFields) { LookupTableBuilder = CreateLookupBuilder(); if (LookupTableBuilder.Schema.Keys.Length == 0) { LookupTableBuilder.AddHashKey(HashKeyFactory); } } return GetFields(InlineFields ? FieldTarget.Inline : FieldTarget.KeyReference).ToArray(); }
public virtual void Initialize(DataProcessor processor, TableDataBuilder parentTable) { Builders = new List<BuilderInfo>(); foreach (var def in TableDefinitions) { var fieldMappers = def.FieldMappers.ToArray(); foreach (var mapper in fieldMappers) { mapper.Initialize(processor); } var builder = fieldMappers.Length == 0 ? null : new TableDataBuilder(def.Name, fieldMappers); var builderInfo = new BuilderInfo(builder); if( builder != null ) { if (parentTable != null) { builder.LinkParentTable(parentTable); } builder.EnsureKey(KeyFactory.Default); processor.TableMap.Tables.Add(builderInfo.Builder); } foreach (var fieldMapper in fieldMappers) { fieldMapper.InitializeRelatedTables(processor, builderInfo.Builder); } if (def.TableMappers != null) { foreach (var childTable in def.TableMappers) { builderInfo.Children.Add(childTable); childTable.Initialize(processor, builder ?? parentTable); } } Builders.Add(builderInfo); } }
public void TestTableDataBuilderFieldOrder() { var fields = new[] { new Field {FieldType = FieldType.Key, ValueType = typeof(int), Name = "0"}, new Field {FieldType = FieldType.Fact, ValueType = typeof(int), Name = "1"}, new Field {FieldType = FieldType.Dimension, ValueType = typeof(int), Name = "2"}, new Field {FieldType = FieldType.Label, ValueType = typeof(int), Name = "3"}, new Field {FieldType = FieldType.Key, ValueType = typeof(int),Name = "4"}, new Field {FieldType = FieldType.Fact, ValueType = typeof(int),Name = "5"}, new Field {FieldType = FieldType.Dimension, ValueType = typeof(int), Name = "6"} }; var builder = new TableDataBuilder("Test", fields.Select(f => new StaticFieldMapper(f, 0))); Assert.IsTrue( builder.Schema.Fields.SequenceEqual(new[] { fields[0], fields[4], fields[2], fields[3], fields[6], fields[1], fields[5] })); }
public void InitializeRelatedTables(DataProcessor processor, TableDataBuilder table) { }
public void TestTableDataBuilderDefaultValues() { var fields = new[] { new Field {FieldType = FieldType.Key, ValueType = typeof(int), Name = "0"}, new Field {FieldType = FieldType.Key, ValueType = typeof(int?), Name = "1"}, new Field {FieldType = FieldType.Key, ValueType = typeof(string), Name = "2"}, new Field {FieldType = FieldType.Key, ValueType = typeof(DateTime), Name = "3"}, new Field {FieldType = FieldType.Key, ValueType = typeof(DateTime?),Name = "4"}, }; var builder = new TableDataBuilder("Test", fields.Select(f => new StaticFieldMapper(f, 0))); var row = builder.CreateEmptyRow(); Assert.IsTrue( row.SequenceEqual(new object[] {0, null, null, default(DateTime), null})); }
public void LinkParentTable(TableDataBuilder parent) { if( Parent != null) throw new InvalidOperationException("A parent table builder is already linked"); var asKey = Schema.Keys.Any(); Parent = parent; _parentReferences.Clear(); foreach (var pk in Parent.Schema.Keys) { _parentReferences.Add(new Field { FieldType = asKey ? FieldType.Key : FieldType.Dimension, Name = pk.Value.Name, ValueType = pk.Value.ValueType }, pk.Index); } _fieldList.AddRange(_parentReferences.Keys); Schema.Associate(parent.Schema, _parentReferences.Keys, Parent.Schema.Keys.Select(fp=>fp.Value), false); UpdateSchema(); }
public BuilderInfo(TableDataBuilder builder) { Builder = builder; Children = new List<ITableMapper>(); }