//--- Methods ---
        public ulong SearchAnalytics_LogQuery(SearchQuery query, string parsedQuery, uint userId, uint resultCount, ulong? previousQueryId) {
            var sorted = query.GetOrderedNormalizedTermString();
            var hash = query.GetOrderedTermsHash();
            var queryId = Catalog.NewQuery(@"/* SearchAnalytics_LogQuery */
INSERT INTO query_log (raw, sorted_terms, sorted_terms_hash, parsed, created, user_id, ref_query_id, result_count)
  VALUES (?QUERY, ?SORTED, ?HASH, ?PARSED, ?CREATED, ?USERID, ?REFID, ?RESULTCOUNT);
SELECT LAST_INSERT_ID();")
                .With("QUERY", query.Raw)
                .With("SORTED", sorted)
                .With("HASH", hash)
                .With("PARSED", parsedQuery)
                .With("USERID", userId)
                .With("CREATED", DateTime.UtcNow)
                .With("REFID", previousQueryId)
                .With("RESULTCOUNT", resultCount)
                .ReadAsULong().Value;
            var terms = query.GetNormalizedTerms();
            if(terms.Any()) {
                var quotedTerms = terms.Select(x => "'" + DataCommand.MakeSqlSafe(x) + "'").ToArray();
                Catalog.NewQuery(string.Format(@"/* SearchAnalytics_LogQuery */
INSERT IGNORE INTO query_terms (query_term) values
{0};", DbUtils.ConvertArrayToDelimittedString(',', quotedTerms.Select(x => "(" + x + ")")))).Execute();
                var termIds = new List<uint>();
                Catalog.NewQuery(string.Format(@"/* SearchAnalytics_LogQuery */
SELECT query_term_id from query_terms where query_term IN({0})",
                    DbUtils.ConvertArrayToDelimittedString(',', quotedTerms))).Execute(r => {
                        while(r.Read()) {
                            termIds.Add(r.Read<uint>(0));
                        }
                    });
                Catalog.NewQuery(string.Format(@"/* SearchAnalytics_LogQuery */
INSERT IGNORE INTO query_term_map (query_term_id,query_id) values
{0};", DbUtils.ConvertArrayToDelimittedString(',', termIds.Select(x => "(" + x + "," + queryId + ")")))).Execute();
            }
            return queryId;
        }