public long Query(string queryData, bool addQueryToDictionary = false) { long queryId = -1; if (!string.IsNullOrWhiteSpace(queryData)) { QueryTransaction newQueryTransaction = m_QueryBuilder.BuildQueryTransaction(queryData); bool queryExists = false; for (int queryIndex = 0; queryIndex < m_Queries.Count; ++queryIndex) { if (m_Queries[queryIndex].WordIds.SequenceEqual(newQueryTransaction.WordIds)) { queryExists = true; queryId = queryIndex; break; } } if (addQueryToDictionary && !queryExists) { queryId = m_Queries.Count; m_Queries.Add(newQueryTransaction); m_IsDictionaryDirty = true; } } return(queryId); }
private List <RankedTransaction> FindInternal(string searchQuery) { List <RankedTransaction> rankedQueryTransactions = new List <RankedTransaction>(); if (!string.IsNullOrEmpty(searchQuery)) { QueryTransaction searchQueryTransaction = m_QueryBuilder.BuildQueryTransaction(searchQuery); foreach (var searchWordId in searchQueryTransaction.WordIds) { // Get partial search matches for the searchWordId List <long> partialSearchMatches = m_WordDictionary.FindPartialMatches(searchWordId); // Full and partial match strategy for (int queryIndex = 0; queryIndex < m_Queries.Count; ++queryIndex) { var query = m_Queries[queryIndex]; // Full match if (query.WordIds.Contains(searchWordId)) { var rankedQuery = rankedQueryTransactions.Find(x => x.QueryTranscationRef == query); if (rankedQuery == null) { rankedQuery = new RankedTransaction(query, queryIndex); rankedQuery.NumberOfMatchedWords++; rankedQueryTransactions.Add(rankedQuery); } else { rankedQuery.NumberOfMatchedWords++; } } // Partial match else { foreach (var queryWordId in query.WordIds) { if (partialSearchMatches.Contains(queryWordId)) { var rankedQuery = rankedQueryTransactions.Find(x => x.QueryTranscationRef == query); if (rankedQuery == null) { rankedQuery = new RankedTransaction(query, queryIndex); rankedQuery.NumberOfMatchedPartialCharacters++; rankedQueryTransactions.Add(rankedQuery); } else { rankedQuery.NumberOfMatchedPartialCharacters++; } break; } } } } } rankedQueryTransactions.Sort(delegate(RankedTransaction x, RankedTransaction y) { // Lower the number the x is pushed up the sort. 0 means no change if (x.NumberOfMatchedWords == y.NumberOfMatchedWords) { if (x.NumberOfMatchedPartialCharacters > y.NumberOfMatchedPartialCharacters) { return(0); } else if (x.NumberOfMatchedPartialCharacters < y.NumberOfMatchedPartialCharacters) { return(1); } } else if (x.NumberOfMatchedWords > y.NumberOfMatchedWords) { return(0); } else if (x.NumberOfMatchedWords < y.NumberOfMatchedWords) { return(1); } return(0); }); } return(rankedQueryTransactions); }
public RankedTransaction(QueryTransaction queryTransaction, long queryId) { QueryTranscationRef = queryTransaction; QueryId = queryId; }