Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
        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);
        }
Ejemplo n.º 4
0
 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);
 }
Ejemplo n.º 5
0
 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));
 }
Ejemplo n.º 6
0
        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;
        }
Ejemplo n.º 8
0
 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);
 }