User: mzywitza
Date: 2010/02/18 11:13 AM

Added:
 /ActiveRecord/trunk/src/Castle.ActiveRecord.Framework.Internal.Tests/Model/
  DiscriminatorFormula.cs

Modified:
 /ActiveRecord/trunk/src/
  Changes.txt
 /ActiveRecord/trunk/src/Castle.ActiveRecord.Framework.Internal.Tests/
  Castle.ActiveRecord.Framework.Internal.Tests-vs2008.csproj, 
XmlGenerationTestCase.cs
 /ActiveRecord/trunk/src/Castle.ActiveRecord/Attributes/
  ActiveRecordAttribute.cs
 /ActiveRecord/trunk/src/Castle.ActiveRecord/Framework/Internal/
  ActiveRecordModelBuilder.cs
 /ActiveRecord/trunk/src/Castle.ActiveRecord/Framework/Internal/Visitors/
  XmlGenerationVisitor.cs

Log:
 Applied Patch by Vladimir Okhotnikov for AR-ISSUE-166

Directory Changes:

Directory: /ActiveRecord/trunk/src/
===================================

Property changes on: ActiveRecord/trunk/src
___________________________________________________________________
Directory: /svn:ignore/
=======================

   - _ReSharper.Castle.ActiveRecord-vs2008
bin

   + _ReSharper.Castle.ActiveRecord-vs2008
bin
Castle.ActiveRecord-vs2008.4.5.resharper.user
*.suo


--- 
ActiveRecord/trunk/src/Castle.ActiveRecord/Attributes/ActiveRecordAttribute.cs  
    2010-02-17 23:27:59 UTC (rev 6742)
+++ 
ActiveRecord/trunk/src/Castle.ActiveRecord/Attributes/ActiveRecordAttribute.cs  
    2010-02-18 18:13:23 UTC (rev 6743)
@@ -44,6 +44,7 @@
                private String discriminatorValue;
                private String discriminatorColumn;
                private String discriminatorLength;
+               private String discriminatorFormula;
                private String where;
                private Type proxy;
                private Type persister;
@@ -60,7 +61,7 @@
                private OptimisticLocking locking = OptimisticLocking.Version;
                private bool lazySpecified;
 
-               /// <summary>
+           /// <summary>
                /// Uses the class name as table name
                /// </summary>
                public ActiveRecordAttribute() {}
@@ -151,6 +152,16 @@
                }
 
                /// <summary>
+               /// Gets or sets discriminator formula: &quot;an arbitrary SQL 
expression that is executed when a type has to be evaluated.
+               /// Allows content-based discrimination&quot; as NH 
documentation puts it
+               /// </summary>
+               public string DiscriminatorFormula
+               {
+                       get { return discriminatorFormula; }
+                       set { discriminatorFormula = value; }
+               }
+
+               /// <summary>
                /// SQL condition to retrieve objects
                /// </summary>

File Changes:

Directory: /ActiveRecord/trunk/src/Castle.ActiveRecord/Attributes/
==================================================================

File [modified]: ActiveRecordAttribute.cs
Delta lines: +2 -2
===================================================================

--- 
ActiveRecord/trunk/src/Castle.ActiveRecord/Framework/Internal/ActiveRecordModelBuilder.cs
   2010-02-17 23:27:59 UTC (rev 6742)
+++ 
ActiveRecord/trunk/src/Castle.ActiveRecord/Framework/Internal/ActiveRecordModelBuilder.cs
   2010-02-18 18:13:23 UTC (rev 6743)
@@ -150,7 +150,7 @@
                {
                        model.ActiveRecordAtt = attribute;
 
-                       if (attribute.DiscriminatorColumn != null)
+                       if (attribute.DiscriminatorColumn != null || 
attribute.DiscriminatorFormula != null)
                        {
                                model.IsDiscriminatorBase = true;
 
@@ -560,7 +560,7 @@
                                        if (attrs.Length != 0)
                                        {
                                                ActiveRecordAttribute 
arAttribute = attrs[0] as ActiveRecordAttribute;
-                                               if 
(arAttribute.DiscriminatorColumn != null)
+                                               if 
(arAttribute.DiscriminatorColumn != null || arAttribute.DiscriminatorFormula != 
null)
                                                        return false;
                                        }

Directory: /ActiveRecord/trunk/src/Castle.ActiveRecord.Framework.Internal.Tests/
================================================================================

File [modified]: Castle.ActiveRecord.Framework.Internal.Tests-vs2008.csproj
Delta lines: +33 -0
===================================================================

--- 
ActiveRecord/trunk/src/Castle.ActiveRecord.Framework.Internal.Tests/Model/DiscriminatorFormula.cs
                           (rev 0)
+++ 
ActiveRecord/trunk/src/Castle.ActiveRecord.Framework.Internal.Tests/Model/DiscriminatorFormula.cs
   2010-02-18 18:13:23 UTC (rev 6743)
@@ -0,0 +1,34 @@
+namespace Castle.ActiveRecord.Framework.Internal.Tests.Model {
+       [ActiveRecord(DiscriminatorFormula = "CASE WHEN Tag IS NULL THEN 0 ELSE 
1 END", DiscriminatorType = "Int32", DiscriminatorValue = "0")]
+       internal class DiscriminatorFormula {
+               private int id;
+               private int version;
+
+               [PrimaryKey]
+               public int Id 
+               {
+                       get { return id; } 
+                       set { id = value; }
+               }
+
+               [Version]
+               public int Version 
+               {
+                       get { return version; } 
+                       set { version = value; }
+               }
+       }
+
+       [ActiveRecord(DiscriminatorValue = "1")]
+       internal class DiscriminatorFormulaWithTag : DiscriminatorFormula
+       {
+               private string tag;
+
+               [Property]
+               public string Tag 
+               {
+                       get { return tag; } 
+                       set { tag = value; }
+               }
+       }

File [modified]: XmlGenerationTestCase.cs
Delta lines: +2 -0
===================================================================

--- ActiveRecord/trunk/src/Changes.txt  2010-02-17 23:27:59 UTC (rev 6742)
+++ ActiveRecord/trunk/src/Changes.txt  2010-02-18 18:13:23 UTC (rev 6743)
@@ -17,9 +17,11 @@
 - Added basic support for CpBT (see IConversation interface and tests for 
usage)
 - Added support for lazy="extra" by setting Lazy=true and ExtraLazy=true
   (Patch by Eddie Cianci, AR-ISSUE-279)
+- Added support for discriminator formulae (Patch by Vladimir Okhotnikov, 
AR-ISSUE-166)
 
 - Bugs fixed:
   AR-ISSUE-157
+  AR-ISSUE-166
   AR-ISSUE-180
   AR-ISSUE-192

Directory: /ActiveRecord/trunk/src/Castle.ActiveRecord/Framework/Internal/
==========================================================================

File [modified]: ActiveRecordModelBuilder.cs
Delta lines: +4 -3
===================================================================

--- 
ActiveRecord/trunk/src/Castle.ActiveRecord/Framework/Internal/Visitors/XmlGenerationVisitor.cs
      2010-02-17 23:27:59 UTC (rev 6742)
+++ 
ActiveRecord/trunk/src/Castle.ActiveRecord/Framework/Internal/Visitors/XmlGenerationVisitor.cs
      2010-02-18 18:13:23 UTC (rev 6743)
@@ -1280,10 +1280,11 @@
                {
                        if (model.IsDiscriminatorBase)
                        {
-                               AppendF("<discriminator{0}{1}{2} />",
-                                               MakeAtt("column", 
model.ActiveRecordAtt.DiscriminatorColumn),
+                               AppendF("<discriminator{0}{1}{2}{3} />",
+                                               WriteIfNonNull("column", 
model.ActiveRecordAtt.DiscriminatorColumn),
                                                WriteIfNonNull("type", 
model.ActiveRecordAtt.DiscriminatorType),
-                                               WriteIfNonNull("length", 
model.ActiveRecordAtt.DiscriminatorLength)
+                                               WriteIfNonNull("length", 
model.ActiveRecordAtt.DiscriminatorLength),
+                                               WriteIfNonNull("formula", 
model.ActiveRecordAtt.DiscriminatorFormula)
                                                );
                        }

Directory: 
/ActiveRecord/trunk/src/Castle.ActiveRecord.Framework.Internal.Tests/Model/
======================================================================================

File [added]: DiscriminatorFormula.cs
Delta lines: +30 -0
===================================================================

--- 
ActiveRecord/trunk/src/Castle.ActiveRecord.Framework.Internal.Tests/XmlGenerationTestCase.cs
        2010-02-17 23:27:59 UTC (rev 6742)
+++ 
ActiveRecord/trunk/src/Castle.ActiveRecord.Framework.Internal.Tests/XmlGenerationTestCase.cs
        2010-02-18 18:13:23 UTC (rev 6743)
@@ -1595,5 +1595,35 @@
 
             Assert.AreEqual(expected, xml);
         }
+        
+               [Test]
+               public void DiscriminatorFormula()
+               {
+                       ActiveRecordModelBuilder builder = new 
ActiveRecordModelBuilder();
+                       builder.Create(typeof(DiscriminatorFormulaWithTag));
+                       ActiveRecordModel model = 
builder.Create(typeof(DiscriminatorFormula));
+                       Assert.IsNotNull(model);
+
+                       String xml = Process(builder, model);
+
+                       const string expected = "<?xml version=\"1.0\" 
encoding=\"utf-16\"?>\r\n" +
+                                                                       
"<hibernate-mapping  auto-import=\"true\" default-lazy=\"false\" 
xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"; 
xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"; 
xmlns=\"urn:nhibernate-mapping-2.2\">\r\n" +
+                                                                       "  
<class 
name=\"Castle.ActiveRecord.Framework.Internal.Tests.Model.DiscriminatorFormula, 
Castle.ActiveRecord.Framework.Internal.Tests\" table=\"DiscriminatorFormula\" 
discriminator-value=\"0\">\r\n" +
+                                                                       "    
<id name=\"Id\" access=\"property\" column=\"Id\" type=\"Int32\" 
unsaved-value=\"0\">\r\n" +
+                                                                       "      
<generator class=\"native\">\r\n" +
+                                                                       "      
</generator>\r\n" +
+                                                                       "    
</id>\r\n" +
+                                                                       "    
<discriminator type=\"Int32\" formula=\"CASE WHEN Tag IS NULL THEN 0 ELSE 1 
END\" />\r\n" +
+                                    "    <version name=\"Version\" 
access=\"property\" column=\"Version\" type=\"Int32\" />\r\n" +
+                                                                       "    
<subclass 
name=\"Castle.ActiveRecord.Framework.Internal.Tests.Model.DiscriminatorFormulaWithTag,
 Castle.ActiveRecord.Framework.Internal.Tests\" discriminator-value=\"1\">\r\n" 
+
+                                                                       "      
<property name=\"Tag\" access=\"property\" type=\"String\">\r\n" +
+                                                                       "       
 <column name=\"Tag\"/>\r\n" +
+                                                                       "      
</property>\r\n" +
+                                                                       "    
</subclass>\r\n" +
+                                                                       "  
</class>\r\n" +
+                                                                       
"</hibernate-mapping>\r\n";
+
+                       Assert.AreEqual(expected, xml);
+               }
        }

Directory: 
/ActiveRecord/trunk/src/Castle.ActiveRecord/Framework/Internal/Visitors/
===================================================================================

File [modified]: XmlGenerationVisitor.cs
Delta lines: +1 -0
===================================================================

--- 
ActiveRecord/trunk/src/Castle.ActiveRecord.Framework.Internal.Tests/Castle.ActiveRecord.Framework.Internal.Tests-vs2008.csproj
      2010-02-17 23:27:59 UTC (rev 6742)
+++ 
ActiveRecord/trunk/src/Castle.ActiveRecord.Framework.Internal.Tests/Castle.ActiveRecord.Framework.Internal.Tests-vs2008.csproj
      2010-02-18 18:13:23 UTC (rev 6743)
@@ -186,6 +186,7 @@
     <Compile Include="Model\CompositeKeyForClassWithCompositeKey.cs" />
     <Compile Include="Model\ClassADynamicInsertUpdate.cs" />
     <Compile Include="Model\ClassWithExtraLazyOnHasMany.cs" />
+    <Compile Include="Model\DiscriminatorFormula.cs" />
     <Compile Include="Model\HasManyToAnyWithBadList.cs" />
     <Compile Include="Model\HasAndBelongsToManyWithBadList.cs" />

Directory: /ActiveRecord/trunk/src/
===================================

File [modified]: Changes.txt
Delta lines: +0 -0
===================================================================

-- 
You received this message because you are subscribed to the Google Groups 
"Castle Project Commits" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/castle-project-commits?hl=en.

Reply via email to