private string BuildAnalyticsQuery(string queryString, SearchAnalyticsQueryType type) { switch (type) { case SearchAnalyticsQueryType.QueryString: var query = BuildQuery(queryString, null, SearchQueryParserType.BestGuess, true); return(query.GetOrderedNormalizedTermString() ?? ""); case SearchAnalyticsQueryType.Term: return(queryString); } return(null); }
public XDoc GetAggregatedQueriesXml(string queryString, SearchAnalyticsQueryType type, bool lowQuality, DateTime since, DateTime before, uint limit, uint offset) { ThrowOnInvalidLicense(); var queries = _session.SearchAnalytics_GetTrackedQueries(BuildAnalyticsQuery(queryString, type), type, since, before, null, null); if (lowQuality) { queries = FilterForLowQuality(queries); } // aggregate the queries by their sorted terms string and apply the limit and offset on the aggregated set var aggregate = (from entity in queries group entity by entity.SortedTerms into sortedTerms orderby sortedTerms.Count() descending select new { SortedTerms = sortedTerms.Key, Queries = sortedTerms.ToArray() }) .Skip(offset.ToInt()) .Take(limit.ToInt()); // aggregate and collapse results and build Xml document var doc = new XDoc("queries"); var count = 0; foreach (var agg in aggregate) { // find most recent query var last = agg.Queries.Max(x => x.Created); doc.Start("query") .Attr("count", agg.Queries.Length) .Attr("href", BuildLogHref(agg.SortedTerms, since, before)) .Elem("sorted-terms", agg.SortedTerms) .Elem("date.searched", last); GetSelectedResultXml(doc, agg.Queries, 5); doc.End(); count++; } doc.Attr("count", count); return(doc); }
public XDoc GetQueriesXml(string queryString, SearchAnalyticsQueryType type, bool lowQuality, DateTime since, DateTime before, uint limit, uint offset) { ThrowOnInvalidLicense(); var queryDoc = new XDoc("queries"); var queries = _session.SearchAnalytics_GetTrackedQueries(BuildAnalyticsQuery(queryString, type), type, since, before, limit, offset); if (lowQuality) { queries = FilterForLowQuality(queries); } var count = 0; foreach (var query in queries) { queryDoc.Start("query"); BuildQueryXml(queryDoc, query); queryDoc.End(); count++; } queryDoc.Attr("count", count); return(queryDoc); }
public XDoc GetAggregatedQueriesXml(string queryString, SearchAnalyticsQueryType type, bool lowQuality, DateTime since, DateTime before, uint limit, uint offset) { return _instance.GetAggregatedQueriesXml(queryString, type, lowQuality, since, before, limit, offset); }
public XDoc GetAggregatedQueriesXml(string queryString, SearchAnalyticsQueryType type, bool lowQuality, DateTime since, DateTime before, uint limit, uint offset) { return(_instance.GetAggregatedQueriesXml(queryString, type, lowQuality, since, before, limit, offset)); }
public IEnumerable<LoggedSearchBE> SearchAnalytics_GetTrackedQueries(string querystring, SearchAnalyticsQueryType type, DateTime since, DateTime before, uint? limit, uint? offset) { var whereClause = new StringBuilder(); SearchAnalytics_BuildDateRangeClause(whereClause); string joinClause = null; switch(type) { case SearchAnalyticsQueryType.Term: if(string.IsNullOrEmpty(querystring)) { return new LoggedSearchBE[0]; } joinClause = @"INNER JOIN query_term_map qtm ON ql.query_id = qtm.query_id INNER JOIN query_terms qt ON qtm.query_term_id = qt.query_term_id"; whereClause.Append(" AND qt.query_term = ?KEY"); break; case SearchAnalyticsQueryType.QueryString: if(querystring == null) { return new LoggedSearchBE[0]; } whereClause.Append(" AND ql.sorted_terms = ?KEY"); break; } whereClause.Append(" ORDER BY ql.created DESC"); SearchAnalytics_BuildLimitOffsetClause(whereClause, limit, offset); var queries = new Dictionary<ulong, LoggedSearchBE>(); Catalog.NewQuery(string.Format(@"/* SearchAnalytics_GetTrackedQueries */ SELECT * FROM query_log ql {0} {1}", joinClause, whereClause)) .With("SINCE", since) .With("BEFORE", before) .With("LIMIT", limit) .With("OFFSET", offset) .With("KEY", querystring) .Execute(r => { while(r.Read()) { var entity = SearchAnalytics_PopulateTrackQueryBE(r); queries.Add(entity.Id, entity); } }); if(queries.Any()) { var idClause = queries.Keys.ToCommaDelimitedString(); // populate terms && results Catalog.NewQuery(string.Format(@"/* SearchAnalytics_GetTrackedQueries */ SELECT qtm.query_id, qt.query_term FROM query_term_map qtm INNER JOIN query_terms qt ON qtm.query_term_id = qt.query_term_id WHERE qtm.query_id IN ({0}); SELECT * FROM query_result_log qrl WHERE qrl.query_id IN ({0});", idClause)) .Execute(r => { while(r.Read()) { var id = r.Read<ulong>("query_id"); LoggedSearchBE entity = queries[id]; entity.Terms.Add(r.Read<string>("query_term")); } r.NextResult(); while(r.Read()) { var id = r.Read<ulong>("query_id"); LoggedSearchBE entity = queries[id]; entity.SelectedResults.Add(SearchAnalytics_PopulateSearchResultBE(r)); } }); } return queries.Values; }
public IEnumerable<LoggedSearchBE> SearchAnalytics_GetTrackedQueries(string querystring, SearchAnalyticsQueryType type, DateTime since, DateTime before, uint? limit, uint? offset) { var whereClause = new StringBuilder(); SearchAnalytics_BuildDateRangeClause(whereClause); string joinClause = null; switch(type) { case SearchAnalyticsQueryType.Term: if(string.IsNullOrEmpty(querystring)) { return new LoggedSearchBE[0]; } joinClause = @"INNER JOIN query_term_map qtm ON ql.query_id = qtm.query_id INNER JOIN query_terms qt ON qtm.query_term_id = qt.query_term_id"; whereClause.Append(" AND qt.query_term = ?KEY"); break; case SearchAnalyticsQueryType.QueryString: if(querystring == null) { return new LoggedSearchBE[0]; } whereClause.Append(" AND ql.sorted_terms = ?KEY"); break; } whereClause.Append(" ORDER BY ql.created DESC"); SearchAnalytics_BuildLimitOffsetClause(whereClause, limit, offset); var queries = new Dictionary<ulong, LoggedSearchBE>(); Catalog.NewQuery(string.Format(@"/* SearchAnalytics_GetTrackedQueries */ SELECT * FROM query_log ql {0} {1}", joinClause, whereClause)) .With("SINCE", since) .With("BEFORE", before) .With("LIMIT", limit) .With("OFFSET", offset) .With("KEY", querystring) .Execute(r => { while(r.Read()) { var entity = SearchAnalytics_PopulateTrackQueryBE(r); queries.Add(entity.Id, entity); } }); if(queries.Any()) { var idClause = SearchAnalytics_BuildIdInClause(queries.Keys); // populate terms && results Catalog.NewQuery(string.Format(@"/* SearchAnalytics_GetTrackedQueries */ SELECT qtm.query_id, qt.query_term FROM query_term_map qtm INNER JOIN query_terms qt ON qtm.query_term_id = qt.query_term_id WHERE qtm.query_id IN {0}; SELECT * FROM query_result_log qrl WHERE qrl.query_id IN {0};", idClause)) .Execute(r => { while(r.Read()) { var id = r.Read<ulong>("query_id"); LoggedSearchBE entity = queries[id]; entity.Terms.Add(r.Read<string>("query_term")); } r.NextResult(); while(r.Read()) { var id = r.Read<ulong>("query_id"); LoggedSearchBE entity = queries[id]; entity.SelectedResults.Add(SearchAnalytics_PopulateSearchResultBE(r)); } }); } return queries.Values; }
public IEnumerable<LoggedSearchBE> SearchAnalytics_GetTrackedQueries(string querystring, SearchAnalyticsQueryType type, DateTime since, DateTime before, uint? limit, uint? offset) { return _next.SearchAnalytics_GetTrackedQueries(querystring, type, since, before, limit, offset); }