public void StringKeywordSuggestion_SetRelevanceMoreThan100_ExpectException()
 {
     var sut = new StringKeywordSuggestion("some_word", Guid.NewGuid());
     sut.Relevance = 100;
     Assert.That(sut.Relevance, Is.EqualTo(100));
     sut.Relevance = 100.01;
 }
        public void StringKeywordSuggestion_loadFromSource_ValidSourceName()
        {
            var guidValue = Guid.NewGuid();
            var sourceName = "TestSourceName";

            var sut = new StringKeywordSuggestion("someKWValue", guidValue, sourceName);
            var sut1 = new StringKeywordSuggestion("someKWValue", guidValue);
            Assert.That(sut.SourceGuid, Is.EqualTo(guidValue));
            Assert.That(sut.SourceName, Is.EqualTo(sourceName));

            Assert.That(sut1.SourceGuid, Is.EqualTo(guidValue));
            Assert.That(sut1.SourceName, Is.EqualTo(guidValue.ToString()));
        }
        /// <summary>
        /// Returns suggestions implementing
        /// </summary>
        /// <param name="keys">Keyword value </param>
        /// <returns>LIst of suggestions of  <see cref="ISuggestionSource"/> type</returns>
        public ISuggestionInstance[] GetSuggestions(params ISemanticObject[] keys)
        {
            Dictionary<string, StringKeywordSuggestion> WrappedSuggestions = new Dictionary<string, StringKeywordSuggestion>();
            foreach (var nextKey in keys)
            {
                foreach (var nextSynonym in this.storage.GetSynonyms(nextKey.GetLiteralValue()))
                {
                    if (WrappedSuggestions.ContainsKey(nextSynonym.Keyword))
                    {
                        var oldValue = WrappedSuggestions[nextSynonym.Keyword];
                        oldValue.Rank = oldValue.Rank + nextSynonym.Rating;
                    }
                    else
                    {
                        var newSynonym = new StringKeywordSuggestion(nextSynonym.Keyword, this.id, this.name);
                        newSynonym.Rank = nextSynonym.Rating;
                        WrappedSuggestions.Add(nextSynonym.Keyword, newSynonym);
                    }
                }
            }

            var readyArray = WrappedSuggestions.Values.ToArray<ISuggestionInstance>().CalculateRelevanceBasedOnRank();
            return readyArray.ToArray();
        }
        /// <summary>
        /// Return suggestions based on one string value keyword
        /// </summary>
        /// <param name="keys">Keyword(s) to find recommendations to</param>
        /// <returns>
        /// Array of found suggestions based on one keyword
        /// </returns>
        /// <exception cref="System.NotImplementedException"></exception>
        public ISuggestionInstance[] GetSuggestions(params ISemanticObject[] keys)
        {
            var keyValues = keys.Select(k => k.GetLiteralValue());
            ISuggestionInstance[] Suggestions;
            try
            {
                this.ctx.Database.Connection.Open();

                // Had to go to RAW since Compact sql does not offer stored procedures
                // AND can't throws not supported operation on count and grouping works way to slow.
                // With normal (not compact) sql versions should be possible to go with normal queries like
                // var contentThatHasOurKeywords = this.ctx.ContentData.Where(c => keyValues.Intersect(c.Keywords.Select(k => k.Name)).Count() > 0).Take(this.datasetLimit);
                // var AllKeywordsFromContent = contentThatHasOurKeywords.SelectMany(c => c.Keywords).GroupBy(c => c.Name);
                // var AllKeywordsWithRaitings = AllKeywordsFromContent.Select(k => new
                // {
                //    Keyword = k.Name,
                //    Rating = AllKeywordsFromContent.Where(kk => kk.Name.Equals(k.Name)).Count()
                // }).OrderByDescending(r => r.Raiting);
                //
                // Original Sql query:
                // select top 150   kw.name, count(kw.ID) as relevance
                // from dbo.Keywords as kw
                // join dbo.[ContentDataKeywords] as t on kw.ID = t.[KeywordsID]
                //    where (t.[ContentDataID] in (
                //    select top 5000 tIN.ContentDataID
                //    from dbo.Keywords as kwIN
                //    join dbo.[ContentDataKeywords] as tIN on kwIN.ID=tIN.[KeywordsID]
                //    where kwIN.name='girl' or  kwIN.name='park'
                // ) and kw.name != 'girl' and kw.name != 'park')
                // group by kw.name
                // order by count(kw.ID) DESC
                var manualQuery = string.Format(@"select top {1} kw.name, count(kw.ID) as Relevance
                 from Keywords as kw
                 join [ContentDataKeywords] as t on kw.ID = t.[KeywordsID]
                    where (t.[ContentDataID] in (
                    select top {0} tIN.ContentDataID
                    from Keywords as kwIN
                    join[ContentDataKeywords] as tIN on kwIN.ID = tIN.[KeywordsID]
                 where kwIN.name = {2}
                 ) and kw.name != {3})
                 group by kw.name
                 order by relevance DESC", this.datasetLimit, KeywordsCount,
                 string.Join(" or  kwIN.name= ", keys.Select(k => string.Format("'{0}'", k.GetLiteralValue()))),
                 string.Join(" and kw.name != ", keys.Select(k => string.Format("'{0}'", k.GetLiteralValue())))
                 );

                var solutions = this.ctx.Database.SqlQuery<DbResultKwNameWithRelevance>(manualQuery).ToList();

                Suggestions = new ISuggestionInstance[solutions.Count];
                for (var i = 0; i < solutions.Count; i++)
                {
                    Suggestions[i] = new StringKeywordSuggestion(solutions[i].Name.ToString(), this.Guid, this.name);
                    Suggestions[i].Rank = solutions[i].Relevance;
                }
            }
            catch (Exception ex)
            {
                throw new Exception("Database error", ex);
            }
            finally
            {
                if (this.ctx != null && this.ctx.Database != null & this.ctx.Database.Connection != null)
                {
                    this.ctx.Database.Connection.Close();
                }
            }

            return Suggestions;
        }
 public void StringKeywordSuggestion_trytosetrelevanceTooBig_expectExceptions()
 {
     var sut = new StringKeywordSuggestion("some value", Guid.NewGuid());
     sut.Relevance = 100.00001;
 }
 public void StringKeywordSuggestion_SetRaitingLessThanZero_ExpectException()
 {
     var sut = new StringKeywordSuggestion("some_word", Guid.NewGuid());
     sut.Rank = -0.01;
 }
 public void StringKeywordSuggestion_SetNoName_ValidateThatNameTakenFromGuid()
 {
     var sut = new StringKeywordSuggestion("some_word", Guid.NewGuid());
     Assert.That(sut.SourceGuid.ToString(), Is.EqualTo(sut.SourceName));
 }
 public void StringKeywordSuggestion_SetName_CheckThatNameTakenIsNameAndDiffirent()
 {
     var sut = new StringKeywordSuggestion("some_word", Guid.NewGuid(), "sourcename");
     Assert.That(sut.SourceName.ToString(), Is.EqualTo("sourcename"));
     Assert.That(sut.SourceGuid.ToString(), Is.Not.EqualTo(sut.SourceName));
 }
 public void StringKeywordSuggestion_ConstructorWithEmptyStringValue_ExpectException()
 {
     var sut = new StringKeywordSuggestion(string.Empty, Guid.NewGuid());
 }