From: <fab...@us...> - 2011-06-18 19:58:07
|
Revision: 5957 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5957&view=rev Author: fabiomaulo Date: 2011-06-18 19:58:00 +0000 (Sat, 18 Jun 2011) Log Message: ----------- BuildParameterMetadata refactoring with parameter specifications fix Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Hql/Ast/ANTLR/QueryTranslatorImpl.cs trunk/nhibernate/src/NHibernate/Hql/Classic/QueryTranslator.cs trunk/nhibernate/src/NHibernate/Param/DynamicFilterParameterSpecification.cs trunk/nhibernate/src/NHibernate/Param/NamedParameterSpecification.cs trunk/nhibernate/src/NHibernate/Param/PositionalParameterSpecification.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/Parameters/ trunk/nhibernate/src/NHibernate.Test/Parameters/NamedParameterSpecificationTest.cs Modified: trunk/nhibernate/src/NHibernate/Hql/Ast/ANTLR/QueryTranslatorImpl.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Hql/Ast/ANTLR/QueryTranslatorImpl.cs 2011-06-18 18:52:29 UTC (rev 5956) +++ trunk/nhibernate/src/NHibernate/Hql/Ast/ANTLR/QueryTranslatorImpl.cs 2011-06-18 19:58:00 UTC (rev 5957) @@ -1,6 +1,7 @@ using System; using System.Collections; using System.Collections.Generic; +using System.Linq; using Antlr.Runtime; using Antlr.Runtime.Tree; using Iesi.Collections.Generic; @@ -17,6 +18,7 @@ using NHibernate.SqlCommand; using NHibernate.Type; using NHibernate.Util; +using IQueryable = NHibernate.Persister.Entity.IQueryable; namespace NHibernate.Hql.Ast.ANTLR { @@ -183,28 +185,14 @@ public ParameterMetadata BuildParameterMetadata() { - var parameterTranslations = GetParameterTranslations(); - - var ordinalDescriptors = new OrdinalParameterDescriptor[parameterTranslations.OrdinalParameterCount]; - - for (var i = 1; i <= ordinalDescriptors.Length; i++) - { - ordinalDescriptors[i - 1] = - new OrdinalParameterDescriptor(i, - parameterTranslations.SupportsOrdinalParameterMetadata - ? parameterTranslations.GetOrdinalParameterExpectedType(i) - : null); - } - - var namedDescriptorMap = new Dictionary<string, NamedParameterDescriptor>(); - foreach (var name in parameterTranslations.GetNamedParameterNames()) - { - namedDescriptorMap[name] = - new NamedParameterDescriptor(name, parameterTranslations.GetNamedParameterExpectedType(name), false);// description.JpaStyle); - - } - - return new ParameterMetadata(ordinalDescriptors, namedDescriptorMap); + IList<IParameterSpecification> specifications = _sqlAst.Walker.Parameters; + IEnumerable<OrdinalParameterDescriptor> ordinals = + specifications.OfType<PositionalParameterSpecification>().Select(op => new OrdinalParameterDescriptor(op.HqlPosition, op.ExpectedType)); + Dictionary<string, NamedParameterDescriptor> nameds = specifications.OfType<NamedParameterSpecification>() + .Distinct() + .Select(np => new {np.Name, Descriptor = new NamedParameterDescriptor(np.Name, np.ExpectedType, false)}) + .ToDictionary(ep => ep.Name, ep => ep.Descriptor); + return new ParameterMetadata(ordinals, nameds); } public string[][] GetColumnNames() Modified: trunk/nhibernate/src/NHibernate/Hql/Classic/QueryTranslator.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Hql/Classic/QueryTranslator.cs 2011-06-18 18:52:29 UTC (rev 5956) +++ trunk/nhibernate/src/NHibernate/Hql/Classic/QueryTranslator.cs 2011-06-18 19:58:00 UTC (rev 5957) @@ -410,51 +410,19 @@ get { return actualReturnTypes; } } - public ParameterMetadata BuildParameterMetadata() - { - return BuildParameterMetadata(GetParameterTranslations(), queryString); - } + public ParameterMetadata BuildParameterMetadata() + { + IEnumerable<IParameterSpecification> specifications = CollectedParameterSpecifications; + IEnumerable<OrdinalParameterDescriptor> ordinals = + specifications.OfType<PositionalParameterSpecification>().Select(op => new OrdinalParameterDescriptor(op.HqlPosition, op.ExpectedType)); + Dictionary<string, NamedParameterDescriptor> nameds = specifications.OfType<NamedParameterSpecification>() + .Distinct() + .Select(np => new { np.Name, Descriptor = new NamedParameterDescriptor(np.Name, np.ExpectedType, false) }) + .ToDictionary(ep => ep.Name, ep => ep.Descriptor); + return new ParameterMetadata(ordinals, nameds); + } - private static ParameterMetadata BuildParameterMetadata(IParameterTranslations parameterTranslations, string hql) - { - long start = DateTime.Now.Ticks; - ParamLocationRecognizer recognizer = ParamLocationRecognizer.ParseLocations(hql); - long end = DateTime.Now.Ticks; - if (log.IsDebugEnabled) - { - log.Debug("HQL param location recognition took " + (end - start) + " mills (" + hql + ")"); - } - - int ordinalParamCount = parameterTranslations.OrdinalParameterCount; - int[] locations = recognizer.OrdinalParameterLocationList.ToArray(); - if (parameterTranslations.SupportsOrdinalParameterMetadata && locations.Length != ordinalParamCount) - { - throw new HibernateException("ordinal parameter mismatch"); - } - ordinalParamCount = locations.Length; - OrdinalParameterDescriptor[] ordinalParamDescriptors = new OrdinalParameterDescriptor[ordinalParamCount]; - for (int i = 1; i <= ordinalParamCount; i++) - { - ordinalParamDescriptors[i - 1] = - new OrdinalParameterDescriptor(i, - parameterTranslations.SupportsOrdinalParameterMetadata - ? parameterTranslations.GetOrdinalParameterExpectedType(i) - : null); - } - - Dictionary<string, NamedParameterDescriptor> namedParamDescriptorMap = new Dictionary<string, NamedParameterDescriptor>(); - foreach (KeyValuePair<string, ParamLocationRecognizer.NamedParameterDescription> entry in recognizer.NamedParameterDescriptionMap) - { - string name = entry.Key; - ParamLocationRecognizer.NamedParameterDescription description = entry.Value; - namedParamDescriptorMap[name] = - new NamedParameterDescriptor(name, parameterTranslations.GetNamedParameterExpectedType(name), description.JpaStyle); - - } - return new ParameterMetadata(ordinalParamDescriptors, namedParamDescriptorMap); - } - - public virtual string[][] ScalarColumnNames + public virtual string[][] ScalarColumnNames { get { return scalarColumnNames; } } Modified: trunk/nhibernate/src/NHibernate/Param/DynamicFilterParameterSpecification.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Param/DynamicFilterParameterSpecification.cs 2011-06-18 18:52:29 UTC (rev 5956) +++ trunk/nhibernate/src/NHibernate/Param/DynamicFilterParameterSpecification.cs 2011-06-18 19:58:00 UTC (rev 5957) @@ -90,7 +90,7 @@ public override bool Equals(object obj) { - return base.Equals(obj); + return Equals(obj as DynamicFilterParameterSpecification); } [Serializable] Modified: trunk/nhibernate/src/NHibernate/Param/NamedParameterSpecification.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Param/NamedParameterSpecification.cs 2011-06-18 18:52:29 UTC (rev 5956) +++ trunk/nhibernate/src/NHibernate/Param/NamedParameterSpecification.cs 2011-06-18 19:58:00 UTC (rev 5957) @@ -72,7 +72,7 @@ public override bool Equals(object obj) { - return base.Equals(obj as NamedParameterSpecification); + return Equals(obj as NamedParameterSpecification); } public bool Equals(NamedParameterSpecification other) Modified: trunk/nhibernate/src/NHibernate/Param/PositionalParameterSpecification.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Param/PositionalParameterSpecification.cs 2011-06-18 18:52:29 UTC (rev 5956) +++ trunk/nhibernate/src/NHibernate/Param/PositionalParameterSpecification.cs 2011-06-18 19:58:00 UTC (rev 5957) @@ -75,7 +75,7 @@ public override bool Equals(object obj) { - return base.Equals(obj as PositionalParameterSpecification); + return Equals(obj as PositionalParameterSpecification); } public bool Equals(PositionalParameterSpecification other) Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-06-18 18:52:29 UTC (rev 5956) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2011-06-18 19:58:00 UTC (rev 5957) @@ -883,6 +883,7 @@ <Compile Include="NHSpecificTest\SqlConverterAndMultiQuery\Fixture.cs" /> <Compile Include="NHSpecificTest\SqlConverterAndMultiQuery\Model.cs" /> <Compile Include="NHSpecificTest\SqlConverterAndMultiQuery\SqlConverter.cs" /> + <Compile Include="Parameters\NamedParameterSpecificationTest.cs" /> <Compile Include="PolymorphicGetAndLoad\Domain.cs" /> <Compile Include="PolymorphicGetAndLoad\PolymorphicGetAndLoadTest.cs" /> <Compile Include="PropertyTest\FieldCamelCaseMUnderscoreFixture.cs" /> Added: trunk/nhibernate/src/NHibernate.Test/Parameters/NamedParameterSpecificationTest.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Parameters/NamedParameterSpecificationTest.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/Parameters/NamedParameterSpecificationTest.cs 2011-06-18 19:58:00 UTC (rev 5957) @@ -0,0 +1,37 @@ +using NHibernate.Param; +using NUnit.Framework; +using SharpTestsEx; + +namespace NHibernate.Test.Parameters +{ + public class NamedParameterSpecificationTest + { + [Test] + public void WhenHasSameNameThenSameHashCode() + { + var expected = (new NamedParameterSpecification(1, 0, "nhlist")).GetHashCode(); + (new NamedParameterSpecification(1, 0, "nhlist")).GetHashCode().Should().Be.EqualTo(expected); + } + + [Test] + public void WhenHasNoSameNameThenNoSameHashCode() + { + var expected = (new NamedParameterSpecification(1, 0, "nHlist")).GetHashCode(); + (new NamedParameterSpecification(1, 0, "nhlist")).GetHashCode().Should().Not.Be.EqualTo(expected); + } + + [Test] + public void WhenHasSameNameThenAreEquals() + { + var expected = (new NamedParameterSpecification(1, 0, "nhlist")); + (new NamedParameterSpecification(1, 0, "nhlist")).Should().Be.EqualTo(expected); + } + + [Test] + public void WhenHasNoSameNameThenAreNotEquals() + { + var expected = (new NamedParameterSpecification(1, 0, "nHlist")); + (new NamedParameterSpecification(1, 0, "nhlist")).Should().Not.Be.EqualTo(expected); + } + } +} \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |