/Xtensive.Storage/Xtensive.Storage.Rse/Providers/Compilable/ConcatProvider.cs

https://code.google.com/p/dataobjectsdotnet/ · C# · 82 lines · 57 code · 8 blank · 17 comment · 5 complexity · 6afbe0c78205e93e53df6be155d59a2c MD5 · raw file

  1. // Copyright (C) 2003-2010 Xtensive LLC.
  2. // All rights reserved.
  3. // For conditions of distribution and use, see license.
  4. // Created by: Elena Vakhtina
  5. // Created: 2009.04.01
  6. using System;
  7. using System.Collections.Generic;
  8. using Xtensive.Core.Collections;
  9. using Xtensive.Core.Internals.DocTemplates;
  10. using Xtensive.Storage.Rse.Resources;
  11. using System.Linq;
  12. namespace Xtensive.Storage.Rse.Providers.Compilable
  13. {
  14. /// <summary>
  15. /// Produces concatenation between <see cref="BinaryProvider.Left"/> and
  16. /// <see cref="BinaryProvider.Right"/> sources.
  17. /// </summary>
  18. [Serializable]
  19. public class ConcatProvider : BinaryProvider
  20. {
  21. protected override RecordSetHeader BuildHeader()
  22. {
  23. EnsureConcatIsPossible();
  24. var mappedColumnIndexes = new List<int>();
  25. var columns = new List<Column>();
  26. for (int i = 0; i < Left.Header.Columns.Count; i++) {
  27. var leftColumn = Left.Header.Columns[i];
  28. var rightColumn = Right.Header.Columns[i];
  29. if (leftColumn is MappedColumn && rightColumn is MappedColumn) {
  30. var leftMappedColumn = (MappedColumn) leftColumn;
  31. var rightMappedColumn = (MappedColumn) rightColumn;
  32. if (leftMappedColumn.ColumnInfoRef.Equals(rightMappedColumn.ColumnInfoRef)) {
  33. columns.Add(leftMappedColumn);
  34. mappedColumnIndexes.Add(i);
  35. }
  36. else
  37. columns.Add(new SystemColumn(leftColumn.Name, leftColumn.Index, leftColumn.Type));
  38. }
  39. else
  40. columns.Add(new SystemColumn(leftColumn.Name, leftColumn.Index, leftColumn.Type));
  41. }
  42. var columnGroups = Left.Header.ColumnGroups.Where(cg => cg.Keys.All(mappedColumnIndexes.Contains)).ToList();
  43. return new RecordSetHeader(
  44. Left.Header.TupleDescriptor,
  45. columns,
  46. columnGroups,
  47. null,
  48. null);
  49. }
  50. /// <exception cref="InvalidOperationException">Something went wrong.</exception>
  51. private void EnsureConcatIsPossible()
  52. {
  53. var left = Left.Header.TupleDescriptor;
  54. var right = Right.Header.TupleDescriptor;
  55. if (!left.Equals(right))
  56. throw new InvalidOperationException(String.Format(Strings.ExXCantBeExecuted, "Concatenation"));
  57. }
  58. /// <inheritdoc/>
  59. protected override DirectionCollection<int> CreateExpectedColumnsOrdering()
  60. {
  61. return EmptyOrder;
  62. }
  63. // Constructors
  64. /// <summary>
  65. /// <see cref="ClassDocTemplate.Ctor" copy="true"/>
  66. /// </summary>
  67. /// <param name="left">The left provider to intersect.</param>
  68. /// <param name="right">The right provider to intersect.</param>
  69. public ConcatProvider(CompilableProvider left, CompilableProvider right)
  70. : base(ProviderType.Concat, left, right)
  71. {
  72. }
  73. }
  74. }