sqlcustomquery.cs

来自「NHibernate NET开发者所需的」· CS 代码 · 共 110 行

CS
110
字号
using System.Collections;
using Iesi.Collections;
using log4net;
using NHibernate.Engine;
using NHibernate.Engine.Query.Sql;
using NHibernate.Persister.Collection;
using NHibernate.Persister.Entity;
using NHibernate.SqlCommand;
using NHibernate.Util;
using System.Collections.Generic;
using Iesi.Collections.Generic;

namespace NHibernate.Loader.Custom.Sql
{
	public class SQLCustomQuery : ICustomQuery
	{
		private static readonly ILog log = LogManager.GetLogger(typeof(SQLCustomQuery));

		private readonly SqlString sql;
		private readonly ISet<string> querySpaces = new HashedSet<string>();
		private readonly IDictionary namedParameterBindPoints = new Hashtable();
		private readonly IList customQueryReturns = new ArrayList();

		public SqlString SQL
		{
			get { return sql; }
		}

		public IDictionary NamedParameterBindPoints
		{
			get { return namedParameterBindPoints; }
		}

		public ISet<string> QuerySpaces
		{
			get { return querySpaces; }
		}

		public IList CustomQueryReturns
		{
			get { return customQueryReturns; }
		}

		public SQLCustomQuery(
			INativeSQLQueryReturn[] queryReturns,
			string sqlQuery,
			ICollection<string> additionalQuerySpaces,
			ISessionFactoryImplementor factory)
		{
			log.Debug("starting processing of sql query [" + sqlQuery + "]");
			SQLQueryReturnProcessor processor = new SQLQueryReturnProcessor(queryReturns, factory);
			SQLQueryReturnProcessor.ResultAliasContext aliasContext = processor.Process();

			SQLQueryParser parser = new SQLQueryParser(sqlQuery, new ParserContext(aliasContext));
			sql = parser.Process();
			ArrayHelper.AddAll(this.namedParameterBindPoints, parser.NamedParameters);
			ArrayHelper.AddAll(customQueryReturns, processor.GenerateCustomReturns(parser.QueryHasAliases));

			if (additionalQuerySpaces != null)
			{
				querySpaces.AddAll(additionalQuerySpaces);
			}
		}

		private class ParserContext : SQLQueryParser.IParserContext
		{
			private readonly SQLQueryReturnProcessor.ResultAliasContext aliasContext;

			public ParserContext(SQLQueryReturnProcessor.ResultAliasContext aliasContext)
			{
				this.aliasContext = aliasContext;
			}

			public bool IsEntityAlias(string alias)
			{
				return GetEntityPersisterByAlias(alias) != null;
			}

			public ISqlLoadable GetEntityPersisterByAlias(string alias)
			{
				return aliasContext.GetEntityPersister(alias);
			}

			public string GetEntitySuffixByAlias(string alias)
			{
				return aliasContext.GetEntitySuffix(alias);
			}

			public bool IsCollectionAlias(string alias)
			{
				return GetCollectionPersisterByAlias(alias) != null;
			}

			public ISqlLoadableCollection GetCollectionPersisterByAlias(string alias)
			{
				return aliasContext.GetCollectionPersister(alias);
			}

			public string GetCollectionSuffixByAlias(string alias)
			{
				return aliasContext.GetCollectionSuffix(alias);
			}

			public IDictionary GetPropertyResultsMapByAlias(string alias)
			{
				return aliasContext.GetPropertyResultsMap(alias);
			}
		}
	}
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?