Beispiel #1
0
        public void TestMultipleMIALikeFilter()
        {
            MultipleTestMIA mia1 = TestBackendUtils.CreateMultipleMIA("Meta1", Cardinality.Inline, true, true);

            IFilter filter = new LikeFilter(mia1.ATTR_STRING, "%", null);

            ICollection <MediaItemAspectMetadata> requiredMIATypes = new List <MediaItemAspectMetadata>();

            requiredMIATypes.Add(mia1.Metadata);
            IList <object>  parts    = new List <object>();
            IList <BindVar> bindVars = new List <BindVar>();

            MockCompiledFilter compiledFilter = new MockCompiledFilter();

            compiledFilter.test(MockCore.Management, filter, null, requiredMIATypes, "test", null, parts, bindVars);

            //Console.WriteLine("Parts [{0}]", string.Join(",", parts));
            //Console.WriteLine("Part 7 " + parts[7].GetType());
            //Console.WriteLine("Bind vars [{0}]", string.Join(",", bindVars));

            Assert.AreEqual(new List <object> {
                "test", " IN(",
                "SELECT ", "MEDIA_ITEM_ID", " FROM ", "M_META1", " WHERE ", "ATTR_STRING", " LIKE ", "@V0", ")"
            }, parts, "Parts");
            Assert.AreEqual(new List <BindVar> {
                new BindVar("V0", "%", typeof(string))
            }, bindVars, "Bind vars");
        }
Beispiel #2
0
        public void TestToString()
        {
            var propertyName = "S";
            var filter       = new LikeFilter <LinqFilterTestClass>(propertyName, "hello");

            Assert.IsNotNull(filter.ToString());
        }
Beispiel #3
0
        public int GetSeriesCount()
        {
            Guid[]  types  = new Guid[] { SeriesAspect.ASPECT_ID };
            IFilter filter = new LikeFilter(SeriesAspect.ATTR_SERIES_NAME, "%", null, false);

            return(GetContentDirectory().CountMediaItemsAsync(types, filter, true, true).Result);
        }
Beispiel #4
0
        public int GetVideoCount()
        {
            Guid[]  types  = new Guid[] { VideoStreamAspect.ASPECT_ID };
            IFilter filter = new LikeFilter(MediaAspect.ATTR_TITLE, "%", null, false);

            return(GetContentDirectory().CountMediaItemsAsync(types, filter, true, true).Result);
        }
Beispiel #5
0
        public void TestSingleMIALikeFilter()
        {
            SingleTestMIA mia1 = TestCommonUtils.CreateSingleMIA("Meta1", Cardinality.Inline, true, true);

            IFilter filter = new LikeFilter(mia1.ATTR_STRING, "%", null);

            ICollection <MediaItemAspectMetadata> requiredMIATypes = new List <MediaItemAspectMetadata>();

            requiredMIATypes.Add(mia1.Metadata);
            IList <object>  parts    = new List <object>();
            IList <BindVar> bindVars = new List <BindVar>();

            MockCompiledFilter compiledFilter = new MockCompiledFilter();

            compiledFilter.test(MockCore.Management, filter, null, requiredMIATypes, "test", null, parts, bindVars);

            //Console.WriteLine("Parts [{0}]", string.Join(",", parts));
            //Console.WriteLine("Bind vars [{0}]", string.Join(",", bindVars));

            Assert.AreEqual(new List <object> {
                new QueryAttribute(mia1.ATTR_STRING), " LIKE ", "@V0"
            }, parts, "Parts");
            Assert.AreEqual(new List <BindVar> {
                new BindVar("V0", "%", typeof(string))
            }, bindVars, "Bind vars");
        }
Beispiel #6
0
        public void TestUPnPSongArtistContains()
        {
            string       text   = "(upnp:class derivedfrom \"object.item.audioItem\" and (dc:creator contains \"four\" or upnp:artist contains \"five \\\" six\"))";
            SearchExp    exp    = SearchParser.Parse(text);
            IList <Guid> types  = new List <Guid>();
            IFilter      filter = SearchParser.Convert(exp, types);

            Console.WriteLine(text + " -> filter=" + filter + " types=[" + string.Join(",", types) + "]");

            Assert.Contains(AudioAspect.ASPECT_ID, (ICollection)types, "Types");

            Assert.IsTrue(filter is BooleanCombinationFilter, "Top level");
            BooleanCombinationFilter topFilter = filter as BooleanCombinationFilter;

            Assert.AreEqual(BooleanOperator.Or, topFilter.Operator, "Top level operator");

            Assert.IsTrue(topFilter.Operands is IList <IFilter>, "Top level");
            IList <IFilter> operands = (IList <IFilter>)topFilter.Operands;

            Assert.IsTrue(operands[0] is LikeFilter, "First operand");
            LikeFilter filter1 = (LikeFilter)operands[0];

            Assert.AreEqual(AudioAspect.ATTR_ARTISTS, filter1.AttributeType, "Attribute");
            Assert.AreEqual("%four%", filter1.Expression, "Expression");

            Assert.IsTrue(operands[0] is LikeFilter, "Second operand");
            LikeFilter filter2 = (LikeFilter)operands[1];

            Assert.AreEqual(AudioAspect.ATTR_ARTISTS, filter2.AttributeType, "Attribute");
            Assert.AreEqual("%five \" six%", filter2.Expression, "Expression");
        }
Beispiel #7
0
        public void Constructor_WithValues_PropertiesAreSet()
        {
            var filter = new LikeFilter("test_dimension", "foo*");

            Assert.That(filter.Dimension, Is.EqualTo("test_dimension"));
            Assert.That(filter.Pattern, Is.EqualTo("foo*"));
            Assert.That(filter.Escape, Is.Null);
        }
Beispiel #8
0
        internal static async Task <MediaItem> GetMediaItemByFileNameAsync(Guid?userId, string path)
        {
            string            fileName     = Path.GetFileName(path);
            IFilter           searchFilter = new LikeFilter(ProviderResourceAspect.ATTR_RESOURCE_ACCESSOR_PATH, "%" + SqlUtils.LikeEscape(fileName, '\\'), '\\', false);
            IList <MediaItem> items        = await GetMediaItemsAsync(userId, searchFilter, 1);

            return(items.FirstOrDefault());
        }
Beispiel #9
0
        /// <summary>
        /// Generates the text for a LikeFilter builder.
        /// </summary>
        /// <param name="item">The LikeFilter builder to generate the text for.</param>
        protected internal override void VisitLikeFilter(LikeFilter item)
        {
            StringBuilder operationBuilder = new StringBuilder();

            if (item.Not)
            {
                operationBuilder.Append("NOT ");
            }
            operationBuilder.Append("LIKE");
            visitOrderedFilter(item, operationBuilder.ToString());
        }
Beispiel #10
0
        public IList <MediaItem> SearchSeries(string text)
        {
            Guid[]  types           = new Guid[] { MediaAspect.ASPECT_ID, VideoStreamAspect.ASPECT_ID };
            IFilter titleFilter     = new LikeFilter(MediaAspect.ATTR_TITLE, string.Format("%{0}%", text), null, false);
            IFilter actorsFilter    = new LikeFilter(VideoAspect.ATTR_ACTORS, string.Format("%{0}%", text), null, false);
            IFilter directorsFilter = new LikeFilter(VideoAspect.ATTR_DIRECTORS, string.Format("%{0}%", text), null, false);
            IFilter writersFilter   = new LikeFilter(VideoAspect.ATTR_WRITERS, string.Format("%{0}%", text), null, false);
            IFilter episodeFilter   = new LikeFilter(EpisodeAspect.ATTR_EPISODE_NAME, string.Format("%{0}%", text), null, false);
            IFilter seriesFilter    = new LikeFilter(EpisodeAspect.ATTR_SERIES_NAME, string.Format("%{0}%", text), null, false);
            IFilter filter          = new BooleanCombinationFilter(BooleanOperator.Or, new IFilter[] { titleFilter, actorsFilter, directorsFilter, writersFilter, episodeFilter, seriesFilter });

            return(GetContentDirectory().SearchAsync(new MediaItemQuery(types, new Guid[] { SeriesAspect.ASPECT_ID }, filter), true, null, true).Result);
        }
Beispiel #11
0
        public void TestConfigPofContextException()
        {
            LikeFilter filter = new LikeFilter("field", "goran", '\\', false);

            SimplePofContext    ctx        = new SimplePofContext();
            BinaryPofSerializer serializer = new BinaryPofSerializer(1);

            ctx.RegisterUserType(1, filter.GetType(), serializer);

            Stream stream = new MemoryStream();

            ctx.Serialize(new DataWriter(stream), filter);
        }
        public void TestRemove()
        {
            IConfigurableCacheFactory ccf = CacheFactory.ConfigurableCacheFactory;

            IXmlDocument config = XmlHelper.LoadXml("assembly://Coherence.Tests/Tangosol.Resources/s4hc-local-cache-config.xml");

            ccf.Config = config;

            INamedCache cache = CacheFactory.GetCache("local-default");

            cache.Clear();

            Hashtable ht = new Hashtable();

            ht.Add("conditionalPutAllKey1", 435);
            ht.Add("conditionalPutAllKey2", 253);
            ht.Add("conditionalPutAllKey3", 200);
            ht.Add("conditionalPutAllKey4", 333);
            cache.InsertAll(ht);

            IFilter greaterThen300 = new GreaterFilter(IdentityExtractor.Instance, 300);
            IFilter lessThen300    = new LessFilter(IdentityExtractor.Instance, 300);
            IFilter key3           = new LikeFilter(new KeyExtractor(IdentityExtractor.Instance), "%Key3", '\\', false);

            Assert.IsTrue(cache.Count == 4);

            // remove key1 with greaterThen300 filter applied
            ConditionalRemove processor = new ConditionalRemove(greaterThen300, false);

            cache.Invoke("conditionalPutAllKey1", processor);
            Assert.IsTrue(cache.Count == 3);

            // remove all entries that satisfy filter criteria
            processor = new ConditionalRemove(greaterThen300, false);
            cache.InvokeAll(ht.Keys, processor);
            Assert.IsTrue(cache.Count == 2);
            Assert.IsNotNull(cache["conditionalPutAllKey2"]);
            Assert.IsNotNull(cache["conditionalPutAllKey3"]);

            processor = new ConditionalRemove(lessThen300, false);
            cache.InvokeAll(new GreaterFilter(IdentityExtractor.Instance, 200), processor);
            Assert.IsTrue(cache.Count == 1);
            Assert.IsNotNull(cache["conditionalPutAllKey3"]);

            processor = new ConditionalRemove(key3, false);
            cache.InvokeAll(new GreaterFilter(IdentityExtractor.Instance, 100), processor);
            Assert.IsTrue(cache.Count == 0);

            CacheFactory.Shutdown();
        }
Beispiel #13
0
        public void TestUPnPTitle()
        {
            string       text   = "(dc:title contains \"two\")";
            SearchExp    exp    = SearchParser.Parse(text);
            IList <Guid> types  = new List <Guid>();
            IFilter      filter = SearchParser.Convert(exp, types);

            Console.WriteLine(text + " -> filter=" + filter + " types=[" + string.Join(",", types) + "]");

            Assert.IsTrue(filter is LikeFilter, "Filter");
            LikeFilter filter1 = filter as LikeFilter;

            Assert.AreEqual(MediaAspect.ATTR_TITLE, filter1.AttributeType, "Attribute");
            Assert.AreEqual("%two%", filter1.Expression, "Expression");
        }
Beispiel #14
0
        internal static Task <IList <MediaItem> > GetTracksByTrackSearchAsync(Guid?userId, string trackSearch, uint?limit = null, uint?offset = null)
        {
            IFilter searchFilter = null;

            if (!string.IsNullOrEmpty(trackSearch))
            {
                searchFilter = new LikeFilter(AudioAspect.ATTR_TRACKNAME, SqlUtils.LikeEscape(trackSearch, '\\') + "%", '\\', false);
            }

            List <ISortInformation> sort = new List <ISortInformation>();

            sort.Add(new AttributeSortInformation(AudioAspect.ATTR_TRACKNAME, SortDirection.Ascending));

            return(GetAlbumsAsync(userId, searchFilter, limit, offset, sort));
        }
Beispiel #15
0
        internal static Task <IList <MediaItem> > GetImagesByImageSearchAsync(Guid?userId, string imageSearch, uint?limit = null, uint?offset = null)
        {
            IFilter searchFilter = null;

            if (!string.IsNullOrEmpty(imageSearch))
            {
                searchFilter = new LikeFilter(MediaAspect.ATTR_TITLE, SqlUtils.LikeEscape(imageSearch, '\\') + "%", '\\', false);
            }

            List <ISortInformation> sort = new List <ISortInformation>();

            sort.Add(new AttributeSortInformation(MediaAspect.ATTR_TITLE, SortDirection.Ascending));

            return(GetImagesAsync(userId, searchFilter, limit, offset, sort));
        }
Beispiel #16
0
        public void TestToWhereExpression_PropertyHasValue_SearchTermIsDifferent()
        {
            var list     = new List <LikeFilterTestClass>();
            var instance = new LikeFilterTestClass();

            instance.S = "abc";
            list.Add(instance);

            var filter          = new LikeFilter <LikeFilterTestClass>("S", "Hello");
            var whereExpression = filter.ToWhereExpression();
            var whereFunc       = whereExpression.Compile();

            var results = list.Where(whereFunc).ToList();

            Assert.AreEqual(0, results.Count);
        }
Beispiel #17
0
        public void TestWhereExtension_IEnumerable_SingleLinqFilter()
        {
            var list = new List <LinqFilterTestClass>();

            list.Add(new LinqFilterTestClass
            {
                Id         = 1,
                NullableId = 1,
                S          = "hello"
            });

            var filter  = new LikeFilter <LinqFilterTestClass>("S", "hello");
            var results = list.Where(filter).ToList();

            Assert.AreEqual(1, results.Count);
        }
Beispiel #18
0
        public void TestUPnPAlbumContains()
        {
            string       text   = "(upnp:class = \"object.container.album.musicAlbum\" and dc:title contains \"three\")";
            SearchExp    exp    = SearchParser.Parse(text);
            IList <Guid> types  = new List <Guid>();
            IFilter      filter = SearchParser.Convert(exp, types);

            Console.WriteLine(text + " -> filter=" + filter + " types=[" + string.Join(",", types) + "]");

            Assert.Contains(AudioAspect.ASPECT_ID, (ICollection)types, "Types");

            Assert.IsTrue(filter is LikeFilter, "Filter");
            LikeFilter filter1 = filter as LikeFilter;

            Assert.AreEqual(AudioAspect.ATTR_ALBUM, filter1.AttributeType, "Attribute");
            Assert.AreEqual("%three%", filter1.Expression, "Expression");
        }
Beispiel #19
0
        public void TestUPnPTrackContains()
        {
            string       text   = "(upnp:class derivedfrom \"object.item.audioItem\" and dc:title contains \"nine\")";
            SearchExp    exp    = SearchParser.Parse(text);
            IList <Guid> types  = new List <Guid>();
            IFilter      filter = SearchParser.Convert(exp, types);

            Console.WriteLine(text + " -> filter=" + filter + " types=[" + string.Join(",", types) + "]");

            Assert.Contains(AudioAspect.ASPECT_ID, (ICollection)types, "Types");

            Assert.IsTrue(filter is LikeFilter, "Filter");
            LikeFilter filter1 = filter as LikeFilter;

            Assert.AreEqual(MediaAspect.ATTR_TITLE, filter1.AttributeType, "Attribute");
            Assert.AreEqual("%nine%", filter1.Expression, "Expression");
        }
Beispiel #20
0
        public void TestToWhereExpression_PropertyHasValue_CaseInsentive()
        {
            var list     = new List <LikeFilterTestClass>();
            var instance = new LikeFilterTestClass();

            instance.S = "hello".ToUpper();
            list.Add(instance);

            var filter          = new LikeFilter <LikeFilterTestClass>("S", instance.S.ToLower());
            var whereExpression = filter.ToWhereExpression();
            var whereFunc       = whereExpression.Compile();

            var results = list.Where(whereFunc).ToList();

            Assert.AreEqual(1, results.Count);
            Assert.AreEqual(instance.S, results.First().S);
        }
Beispiel #21
0
        public void GetGroup(object elementValue,
                             out object groupKey, out IFilter additionalFilter)
        {
            string elementName = elementValue == null ? string.Empty : elementValue.ToString().Trim();
            char   firstChar;

            if (elementName != string.Empty && IsLetterOrDigit(firstChar = elementName[0]))
            {
                string fcs = firstChar.ToString().ToUpperInvariant();
                groupKey         = fcs + "*";
                additionalFilter = new LikeFilter(_attributeType, fcs + "%", null, false);
            }
            else
            {
                groupKey         = _emptyOrMiscCharacterGroupName;
                additionalFilter = GetEmptyOrMiscGroupFilter();
            }
        }
Beispiel #22
0
        public void TestWhereExtension_IEnumerable_MultipleLinqFilters()
        {
            var list = new List <LinqFilterTestClass>();

            list.Add(new LinqFilterTestClass
            {
                Id         = 1,
                NullableId = 1,
                S          = "hello"
            });

            var filter1 = new LikeFilter <LinqFilterTestClass>("S", "h");
            var filter2 = new LikeFilter <LinqFilterTestClass>("S", "o");
            var results = list.Where(new List <LinqFilter <LinqFilterTestClass> > {
                filter1, filter2
            }).ToList();

            Assert.AreEqual(1, results.Count);
        }
Beispiel #23
0
        protected virtual Command Filter(LikeFilter filter)
        {
            //Validating if there are filters defined
            if (filter == null)
            {
                return(null);
            }

            Command          command = new Command();
            CommandParameter param   = new CommandParameter(filter.Pattern, null, filter.Column.DbType);

            command.Parameters.Add(param);

            command.Script =
                EqualityComparison(
                    ColumnFullName(filter),
                    param.Name,
                    CompareOperator.Like);

            return(command);
        }
Beispiel #24
0
        public void TestSingleAndMultipleMIAQueryBuilder()
        {
            SingleTestMIA   mia1 = TestBackendUtils.CreateSingleMIA("single1", Cardinality.Inline, true, false);
            MultipleTestMIA mia2 = TestBackendUtils.CreateMultipleMIA("multi1", Cardinality.Inline, true, false);

            IFilter filter1 = new LikeFilter(mia1.ATTR_STRING, "%", null);
            IFilter filter2 = new LikeFilter(mia2.ATTR_STRING, "%", null);
            IFilter filter  = new BooleanCombinationFilter(BooleanOperator.And, new[] { filter1, filter2 });

            ICollection <MediaItemAspectMetadata> requiredMIATypes = new List <MediaItemAspectMetadata>();

            requiredMIATypes.Add(mia1.Metadata);
            requiredMIATypes.Add(mia2.Metadata);

            MIAQueryBuilder builder = new MIAQueryBuilder(MockCore.Management, new List <QueryAttribute>(), null, requiredMIATypes, new List <MediaItemAspectMetadata>(), filter, null, null);

            string mediaItemIdAlias = null;
            IDictionary <MediaItemAspectMetadata, string> miamAliases      = null;
            IDictionary <QueryAttribute, string>          attributeAliases = null;
            string          statementStr = null;
            IList <BindVar> bindVars     = null;

            builder.GenerateSqlStatement(out mediaItemIdAlias, out miamAliases, out attributeAliases, out statementStr, out bindVars);
            Console.WriteLine("mediaItemIdAlias: {0}", mediaItemIdAlias);
            Console.WriteLine("miamAliases: [{0}]", string.Join(",", miamAliases));
            Console.WriteLine("attributeAliases: [{0}]", string.Join(",", attributeAliases));
            Console.WriteLine("statementStr: {0}", statementStr);
            Console.WriteLine("bindVars: [{0}]", string.Join(",", bindVars));

            Assert.AreEqual("A0", mediaItemIdAlias, "Media item ID alias");
            Assert.AreEqual(CreateMIAMAliases(mia1.Metadata, "A1", mia2.Metadata, "A2"), miamAliases, "MIAM aliases");
            Assert.AreEqual(new Dictionary <QueryAttribute, string>(), attributeAliases, "Attribute aliases");
            Assert.AreEqual("SELECT T0.MEDIA_ITEM_ID A0, T0.MEDIA_ITEM_ID A1, T1.MEDIA_ITEM_ID A2 FROM M_SINGLE1 T0 INNER JOIN M_MULTI1 T1 ON T1.MEDIA_ITEM_ID = T0.MEDIA_ITEM_ID  " +
                            "WHERE T0.MEDIA_ITEM_ID IN(SELECT MEDIA_ITEM_ID FROM M_MULTI1 WHERE ATTR_STRING LIKE @V0) AND T0.ATTR_STRING LIKE @V1", statementStr, "Statement");
            Assert.AreEqual(new List <BindVar>
            {
                new BindVar("V0", "%", typeof(string)),
                new BindVar("V1", "%", typeof(string))
            }, bindVars, "Bind vars");
        }
Beispiel #25
0
        public void TestMediaItemLoader_SingleMIAs_LikeFilter()
        {
            MockDBUtils.Reset();
            SingleTestMIA mia1 = TestBackendUtils.CreateSingleMIA("SINGLE1", Cardinality.Inline, true, false);
            SingleTestMIA mia2 = TestBackendUtils.CreateSingleMIA("SINGLE2", Cardinality.Inline, false, true);
            SingleTestMIA mia3 = TestBackendUtils.CreateSingleMIA("SINGLE3", Cardinality.Inline, true, true);

            Guid itemId = new Guid("aaaaaaaa-1111-1111-1111-aaaaaaaaaaaa");

            IFilter filter = new LikeFilter(mia1.ATTR_STRING, "%", null);

            MockReader reader = MockDBUtils.AddReader(
                "SELECT T0.MEDIA_ITEM_ID A4, T0.MEDIA_ITEM_ID A5, T1.MEDIA_ITEM_ID A6, T2.MEDIA_ITEM_ID A7, T0.ATTR_STRING A0, T1.ATTR_INTEGER A1, T2.ATTR_STRING A2, T2.ATTR_INTEGER A3 " +
                "FROM M_SINGLE1 T0 INNER JOIN M_SINGLE2 T1 ON T1.MEDIA_ITEM_ID = T0.MEDIA_ITEM_ID LEFT OUTER JOIN M_SINGLE3 T2 ON T2.MEDIA_ITEM_ID = T0.MEDIA_ITEM_ID " +
                " WHERE T0.ATTR_STRING LIKE @V0", "A4", "A5", "A6", "A7", "A0", "A1", "A2", "A3");

            reader.AddResult(itemId, itemId, itemId, itemId, "zerozero", 11, "twotwo", 33);

            Guid[]                 requiredAspects = new Guid[] { mia1.ASPECT_ID, mia2.ASPECT_ID };
            Guid[]                 optionalAspects = new Guid[] { mia3.ASPECT_ID };
            MediaItemQuery         query           = new MediaItemQuery(requiredAspects, optionalAspects, filter);
            CompiledMediaItemQuery compiledQuery   = CompiledMediaItemQuery.Compile(MockCore.Management, query);
            MediaItem              result          = compiledQuery.QueryMediaItem();

            //Console.WriteLine("Query result " + result.MediaItemId + ": " + string.Join(",", result.Aspects) + ": " + result);

            Assert.AreEqual(itemId, result.MediaItemId, "MediaItem ID");
            SingleMediaItemAspect value = null;

            Assert.IsTrue(MediaItemAspect.TryGetAspect(result.Aspects, mia1.Metadata, out value), "MIA1");
            Assert.AreEqual("zerozero", value.GetAttributeValue(mia1.ATTR_STRING), "MIA1 string attibute");
            Assert.IsTrue(MediaItemAspect.TryGetAspect(result.Aspects, mia2.Metadata, out value), "MIA2");
            Assert.AreEqual(11, value.GetAttributeValue(mia2.ATTR_INTEGER), "MIA2 integer attibute");
            Assert.IsTrue(MediaItemAspect.TryGetAspect(result.Aspects, mia3.Metadata, out value), "MIA3");
            Assert.AreEqual("twotwo", value.GetAttributeValue(mia3.ATTR_STRING), "MIA3 string attibute");
            Assert.AreEqual(33, value.GetAttributeValue(mia3.ATTR_INTEGER), "MIA3 integer attibute");
        }
Beispiel #26
0
 public void TestConstructor_ValueNotAString()
 {
     var filer = new LikeFilter <LikeFilterTestClass>("S", 1);
 }
        protected virtual IFilter BuildTextSearchFilter()
        {
            var filter = new LikeFilter(MediaAspect.ATTR_TITLE, GetSearchTerm(), null);

            return(filter);
        }
Beispiel #28
0
        public void Constructor_TypeIsCorrect()
        {
            var filter = new LikeFilter("test_dimension", "foo*");

            Assert.That(filter.Type, Is.EqualTo("like"));
        }
Beispiel #29
0
        public void Constructor_WithSpecificEscapeCharacter_EscapeIsSet()
        {
            var filter = new LikeFilter("test_dimension", "foo*", "o");

            Assert.That(filter.Escape, Is.EqualTo("o"));
        }
Beispiel #30
0
        /// <summary>
        /// Builds the actual filter SQL expression <c>[Attribute-Operand] [Operator] [Comparison-Value]</c> for the given
        /// attribute <paramref name="filter"/>.
        /// </summary>
        /// <param name="filter">Attribute filter instance to create the SQL expression for.</param>
        /// <param name="attributeOperand">Comparison attribute to be used. Depending on the cardinality of the
        /// to-be-filtered attribute, this will be the inline attribute alias or the attribute alias of the collection
        /// attribute table.</param>
        /// <param name="bvNamespace">Namespace used to build bind var names.</param>
        /// <param name="resultParts">Statement parts for the attribute filter.</param>
        /// <param name="resultBindVars">Bind variables for the attribute filter.</param>
        public static void BuildAttributeFilterExpression(IAttributeFilter filter, object attributeOperand, BindVarNamespace bvNamespace,
                                                          IList <object> resultParts, IList <BindVar> resultBindVars)
        {
            Type             attributeType    = filter.AttributeType.AttributeType;
            RelationalFilter relationalFilter = filter as RelationalFilter;

            if (relationalFilter != null)
            {
                resultParts.Add(attributeOperand);
                switch (relationalFilter.Operator)
                {
                case RelationalOperator.EQ:
                    resultParts.Add(" = ");
                    break;

                case RelationalOperator.NEQ:
                    resultParts.Add(" <> ");
                    break;

                case RelationalOperator.LT:
                    resultParts.Add(" < ");
                    break;

                case RelationalOperator.LE:
                    resultParts.Add(" <= ");
                    break;

                case RelationalOperator.GT:
                    resultParts.Add(" > ");
                    break;

                case RelationalOperator.GE:
                    resultParts.Add(" >= ");
                    break;

                default:
                    throw new NotImplementedException(string.Format(
                                                          "Relational filter operator '{0}' isn't supported by the media library", relationalFilter.Operator));
                }
                BindVar bindVar = new BindVar(bvNamespace.CreateNewBindVarName("V"), relationalFilter.FilterValue, attributeType);
                resultParts.Add("@" + bindVar.Name);
                resultBindVars.Add(bindVar);
                return;
            }

            LikeFilter likeFilter = filter as LikeFilter;

            if (likeFilter != null)
            {
                if (!likeFilter.CaseSensitive)
                {
                    resultParts.Add("UPPER(");
                }

                resultParts.Add(attributeOperand);

                if (!likeFilter.CaseSensitive)
                {
                    resultParts.Add(")");
                }

                resultParts.Add(" LIKE ");

                BindVar bindVar = new BindVar(bvNamespace.CreateNewBindVarName("V"), likeFilter.Expression, attributeType);
                if (likeFilter.CaseSensitive)
                {
                    resultParts.Add("@" + bindVar.Name);
                }
                else
                {
                    resultParts.Add("UPPER(@" + bindVar.Name + ")");
                }
                resultBindVars.Add(bindVar);
                if (likeFilter.EscapeChar.HasValue)
                {
                    bindVar = new BindVar(bvNamespace.CreateNewBindVarName("E"), likeFilter.EscapeChar.ToString(), typeof(Char));
                    resultParts.Add(" ESCAPE @" + bindVar.Name);
                    resultBindVars.Add(bindVar);
                }
                return;
            }

            BetweenFilter betweenFilter = filter as BetweenFilter;

            if (betweenFilter != null)
            {
                resultParts.Add(attributeOperand);
                resultParts.Add(" BETWEEN ");
                BindVar bindVar = new BindVar(bvNamespace.CreateNewBindVarName("V"), betweenFilter.Value1, attributeType);
                resultParts.Add("@" + bindVar.Name);
                resultBindVars.Add(bindVar);
                resultParts.Add(" AND ");
                bindVar = new BindVar(bvNamespace.CreateNewBindVarName("V"), betweenFilter.Value2, attributeType);
                resultParts.Add("@" + bindVar.Name);
                resultBindVars.Add(bindVar);
                return;
            }

            InFilter inFilter = filter as InFilter;

            if (inFilter != null)
            {
                if (inFilter.Values.Count == 0)
                {
                    resultParts.Add("1 = 2"); // No comparison values means filter is always false
                    return;
                }
                int clusterCount = 0;
                foreach (IList <object> valuesCluster in CollectionUtils.Cluster(inFilter.Values, MAX_IN_VALUES_SIZE))
                {
                    if (clusterCount > 0)
                    {
                        resultParts.Add(" OR ");
                    }
                    resultParts.Add(attributeOperand);
                    IList <string> bindVarRefs = new List <string>(MAX_IN_VALUES_SIZE);
                    foreach (object value in valuesCluster)
                    {
                        BindVar bindVar = new BindVar(bvNamespace.CreateNewBindVarName("V"), value, attributeType);
                        bindVarRefs.Add("@" + bindVar.Name);
                        resultBindVars.Add(bindVar);
                    }
                    resultParts.Add(" IN (" + StringUtils.Join(", ", bindVarRefs) + ")");
                    clusterCount++;
                }
                return;
            }
            throw new InvalidDataException("Filter type '{0}' isn't supported by the media library", filter.GetType().Name);
        }