diff Source/Mapping/MapResultSet.cs @ 0:f990fcb411a9

Копия текущей версии из github
author cin
date Thu, 27 Mar 2014 21:46:09 +0400
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Mapping/MapResultSet.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,146 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+
+namespace BLToolkit.Mapping
+{
+	public class MapResultSet
+	{
+		public MapResultSet(Type objectType)
+		{
+			_objectType = objectType;
+		}
+
+		public MapResultSet(Type objectType, IList list)
+		{
+			_objectType = objectType;
+			_list       = list;
+		}
+
+		public MapResultSet(Type objectType, object[] parameters)
+		{
+			_objectType = objectType;
+			_parameters = parameters;
+		}
+
+		public MapResultSet(Type objectType, IList list, object[] parameters)
+		{
+			_objectType = objectType;
+			_parameters = parameters;
+			_list       = list;
+		}
+
+		internal MapResultSet(MapResultSet resultSet)
+		{
+			_objectType = resultSet._objectType;
+			_parameters = resultSet._parameters;
+
+			if (resultSet._relationList != null)
+			{
+				_relationList = new List<MapRelation>(resultSet._relationList.Count);
+				_relationList.AddRange(resultSet._relationList);
+			}
+		}
+
+		private readonly Type _objectType;
+		internal         Type  ObjectType
+		{
+			get { return _objectType; }
+		}
+
+		private object[] _parameters;
+		public  object[]  Parameters
+		{
+			get { return _parameters;  }
+			set { _parameters = value; }
+		}
+
+		private IList _list;
+		public  IList  List
+		{
+			get { return _list ?? (_list = new List<object>()); }
+			set { _list = value; }
+		}
+
+		private  MapRelation[] _relations;
+		internal MapRelation[]  Relations
+		{
+			get 
+			{
+				if (_relationList != null && (_relations == null || _relations.Length != _relationList.Count))
+					_relations = _relationList.ToArray();
+
+				return _relations;
+			}
+
+			set { _relations = value; }
+		}
+
+		private List<MapRelation> _relationList;
+
+		public void AddRelation(
+			MapResultSet slaveResultSet,
+			MapIndex     slaveIndex,
+			MapIndex     masterIndex,
+			string       containerName)
+		{
+			if (_relationList == null)
+				_relationList = new List<MapRelation>();
+
+			_relationList.Add(new MapRelation(slaveResultSet, slaveIndex, masterIndex, containerName));
+		}
+
+		public void AddRelation(
+			MapResultSet slaveResultSet,
+			string       slaveIndex,
+			string       masterIndex,
+			string       containerName)
+		{
+			AddRelation( slaveResultSet, new MapIndex(slaveIndex), new MapIndex(masterIndex),containerName);
+		}
+
+		public void AddRelation(MapResultSet slaveResultSet, MapRelationBase relation)
+		{
+			AddRelation(slaveResultSet, relation.SlaveIndex, relation.MasterIndex, relation.ContainerName);
+		}
+
+		readonly Dictionary<string,IDictionary<object,IList>> _indexies = new Dictionary<string,IDictionary<object,IList>>();
+
+		public  IDictionary<object,IList> GetIndex(MappingSchema ms, MapIndex masterIndex)
+		{
+			var indexId = masterIndex.ID;
+
+			IDictionary<object,IList> indexHash;
+
+			if (_indexies.TryGetValue(indexId, out indexHash))
+				return indexHash;
+
+			var masterMapper = ms.GetObjectMapper(ObjectType);
+
+			indexHash = new Dictionary<object, IList>();
+
+			foreach (var o in List)
+			{
+				var key = masterIndex.GetValueOrIndex(masterMapper, o);
+
+				if (ms.IsNull(key))
+					continue;
+
+				IList matches;
+
+				if (!indexHash.TryGetValue(key, out matches))
+					indexHash.Add(key, matches = new List<object>());
+
+				matches.Add(o);
+			}
+
+			return indexHash;
+		}
+
+		public IDictionary<object,IList> GetIndex(MappingSchema ms, MapRelation relation)
+		{
+			return GetIndex(ms, relation.MasterIndex);
+		}
+	}
+}
+