public virtual CommandDefinition ToCountStatement(CountStatement statement, CommandFlags flags)
        {
            var sql = new StringBuilder("SELECT COUNT(");

            if (statement.IsDistinct)
            {
                sql.Append(" DISTINCT ");
            }

            sql.Append(statement.Columns.Count == 1 ? statement.Columns[0] : "*");
            sql.Append(")\n FROM ");
            sql.Append(statement.TableName);

            if (statement.WhereExpression.Length > 0)
            {
                sql.Append("\n WHERE ");
                sql.Append(statement.WhereExpression);
            }

            if (statement.GroupByExpression.Length > 0)
            {
                sql.Append("\n GROUP BY ");
                sql.Append(statement.GroupByExpression);
            }

            if (statement.HavingExpression.Length > 0)
            {
                sql.Append("\n HAVING ");
                sql.Append(statement.HavingExpression);
            }

            return(new CommandDefinition(sql.ToString(), statement.Parameters, flags: flags));
        }
        private void AddResultOperator(ResultOperatorBase resultOperator, IFieldMapping fields)
        {
            switch (resultOperator)
            {
            case ISelectableOperator selectable:
                CurrentStatement = selectable.ModifyStatement(CurrentStatement, _session);
                break;

            case TakeResultOperator take:
                CurrentStatement.Limit = (int)take.Count.Value();
                break;

            case SkipResultOperator skip:
                CurrentStatement.Offset = (int)skip.Count.Value();
                break;

            case AnyResultOperator _:
                CurrentStatement.ToAny();
                break;

            case CountResultOperator _:
                if (CurrentStatement.IsDistinct)
                {
                    CurrentStatement.ConvertToCommonTableExpression(_session);
                    CurrentStatement = new CountStatement <int>(CurrentStatement);
                }
                else
                {
                    CurrentStatement.ToCount <int>();
                }
                break;

            case LongCountResultOperator _:
                if (CurrentStatement.IsDistinct)
                {
                    CurrentStatement.ConvertToCommonTableExpression(_session);
                    CurrentStatement = new CountStatement <long>(CurrentStatement);
                }
                else
                {
                    CurrentStatement.ToCount <long>();
                }
                break;

            case FirstResultOperator first:
                CurrentStatement.Limit                  = 1;
                CurrentStatement.SingleValue            = true;
                CurrentStatement.ReturnDefaultWhenEmpty = first.ReturnDefaultWhenEmpty;
                CurrentStatement.CanBeMultiples         = true;
                break;

            case SingleResultOperator single:
                CurrentStatement.Limit                  = 2;
                CurrentStatement.SingleValue            = true;
                CurrentStatement.ReturnDefaultWhenEmpty = single.ReturnDefaultWhenEmpty;
                CurrentStatement.CanBeMultiples         = false;
                break;

            case DistinctResultOperator _:
                CurrentStatement.IsDistinct = true;
                CurrentStatement.ApplySqlOperator("distinct");
                break;

            case AverageResultOperator _:
                CurrentStatement.ApplyAggregateOperator("AVG");
                break;

            case SumResultOperator _:
                CurrentStatement.ApplyAggregateOperator("SUM");
                break;

            case MinResultOperator _:
                CurrentStatement.ApplyAggregateOperator("MIN");
                break;

            case MaxResultOperator _:
                CurrentStatement.ApplyAggregateOperator("MAX");
                break;

            case ToJsonArrayResultOperator _:
                CurrentStatement.ToJsonSelector();
                break;

            case LastResultOperator _:
                throw new InvalidOperationException("Marten does not support Last() or LastOrDefault() queries. Please reverse the ordering and use First()/FirstOrDefault() instead");

            case IncludeResultOperator includeOp:
                var include = includeOp.BuildInclude(_session, fields);
                _provider.AllIncludes.Add(include);
                break;

            default:
                throw new NotSupportedException("Don't yet know how to deal with " + resultOperator);
            }
        }