[hyena] QueryField: check for NULL before LIKE



commit d08e633077aa1e99feafa8b7ae4e86d2e793ec22
Author: Andres G. Aragoneses <knocte gmail com>
Date:   Sun Dec 11 13:27:31 2011 +0000

    QueryField: check for NULL before LIKE
    
    When getting the SQL result of crossing a QueryField
    with a QueryValue, the check for NULL was being printed
    after the rest of the query.
    
    In theory, the check for NULL should be done before so
    you really gain the performance of only running one part
    of the query in case the first part is already TRUE (OR
    operator) or FALSE (AND operator). Maybe SQLite was
    already smart enough to optimize this regardless, but
    the query is anyway clearer now.
    
    It is now also more in line with the .NET API:
    String.IsNullOrEmpty()

 Hyena/Hyena.Query/QueryField.cs       |    4 ++--
 Hyena/Hyena.Query/Tests/QueryTests.cs |   10 +++++-----
 2 files changed, 7 insertions(+), 7 deletions(-)
---
diff --git a/Hyena/Hyena.Query/QueryField.cs b/Hyena/Hyena.Query/QueryField.cs
index e6021c4..dcc6a1f 100644
--- a/Hyena/Hyena.Query/QueryField.cs
+++ b/Hyena/Hyena.Query/QueryField.cs
@@ -157,9 +157,9 @@ namespace Hyena.Query
                 sb.AppendFormat ("{0} {1}", column_with_key, String.Format (op.SqlFormat, value));
 
                 if (op.IsNot) {
-                    return String.Format ("({0} OR {1} IS NULL)", sb.ToString (), Column);
+                    return String.Format ("({0} IS NULL OR {1})", Column, sb.ToString ());
                 } else {
-                    return String.Format ("({0} AND {1} IS NOT NULL)", sb.ToString (), Column);
+                    return String.Format ("({0} IS NOT NULL AND {1})", Column, sb.ToString ());
                 }
             } else {
                 sb.AppendFormat (
diff --git a/Hyena/Hyena.Query/Tests/QueryTests.cs b/Hyena/Hyena.Query/Tests/QueryTests.cs
index 4fde91b..ff0a470 100644
--- a/Hyena/Hyena.Query/Tests/QueryTests.cs
+++ b/Hyena/Hyena.Query/Tests/QueryTests.cs
@@ -167,7 +167,7 @@ namespace Hyena.Query.Tests
             val.ParseUserQuery ("Kelli O'Hara");
 
             Assert.AreEqual (
-                "(CoreArtists.NameLowered LIKE '%kelli ohara%' ESCAPE '\\' AND CoreArtists.NameLowered IS NOT NULL)",
+                "(CoreArtists.NameLowered IS NOT NULL AND CoreArtists.NameLowered LIKE '%kelli ohara%' ESCAPE '\\')",
                 ArtistField.ToSql (StringQueryValue.Contains, val)
             );
         }
@@ -179,7 +179,7 @@ namespace Hyena.Query.Tests
             val.ParseUserQuery ("100% Techno");
 
             Assert.AreEqual (
-                "(CoreAlbums.TitleLowered LIKE '%100 techno%' ESCAPE '\\' AND CoreAlbums.TitleLowered IS NOT NULL)",
+                "(CoreAlbums.TitleLowered IS NOT NULL AND CoreAlbums.TitleLowered LIKE '%100 techno%' ESCAPE '\\')",
                 AlbumField.ToSql (StringQueryValue.Contains, val)
             );
         }
@@ -191,7 +191,7 @@ namespace Hyena.Query.Tests
             val.ParseUserQuery ("-_-");
 
             Assert.AreEqual (
-                "(CoreAlbums.TitleLowered LIKE '%-\\_-%' ESCAPE '\\' AND CoreAlbums.TitleLowered IS NOT NULL)",
+                "(CoreAlbums.TitleLowered IS NOT NULL AND CoreAlbums.TitleLowered LIKE '%-\\_-%' ESCAPE '\\')",
                 AlbumField.ToSql (StringQueryValue.Contains, val)
             );
         }
@@ -203,7 +203,7 @@ namespace Hyena.Query.Tests
             val.ParseUserQuery ("Metallic/\\");
 
             Assert.AreEqual (
-                "(CoreAlbums.TitleLowered LIKE '%metallic%' ESCAPE '\\' AND CoreAlbums.TitleLowered IS NOT NULL)",
+                "(CoreAlbums.TitleLowered IS NOT NULL AND CoreAlbums.TitleLowered LIKE '%metallic%' ESCAPE '\\')",
                 AlbumField.ToSql (StringQueryValue.Contains, val)
             );
         }
@@ -227,7 +227,7 @@ namespace Hyena.Query.Tests
             val.ParseUserQuery ("space 3quotes`'\"underscore_percentage%slash/backslash\\");
 
             Assert.AreEqual (
-                @"(CoreTracks.Uri LIKE '%space\%203quotes\%60''\%22underscore\_percentage\%25slash/backslash\%5C%' ESCAPE '\' AND CoreTracks.Uri IS NOT NULL)",
+                @"(CoreTracks.Uri IS NOT NULL AND CoreTracks.Uri LIKE '%space\%203quotes\%60''\%22underscore\_percentage\%25slash/backslash\%5C%' ESCAPE '\')",
                 UriField.ToSql (StringQueryValue.Contains, val)
             );
         }



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]