<commit_before>﻿using System;
using System.Collections.Generic;
using System.Globalization;
using System.Text;

namespace Serenity.Data
{
    public static partial class Sql
    {
        /// <summary>
        ///   Verilen alanı SUM(..) içerisine alır.</summary>
        /// <param name="field">
        ///   SUM(...) içerisine yazılacak alan adı (zorunlu).</param>
        /// <returns>
        ///   "SUM(field)"</returns>
        public static string Sum(string field)
        {
            if (field == null || field.Length == 0)
                throw new ArgumentNullException("field");

            return "SUM(" + field + ")";
        }


        /// <summary>
        ///   Verilen alanı COUNT(..) içerisine alır.</summary>
        /// <param name="field">
        ///   COUNT(...) içerisine alınacak alan adı (zorunlu).</param>
        /// <returns>
        ///   "COUNT(field)".</returns>
        public static string Count(string field)
        {
            if (field == null || field.Length == 0)
                throw new ArgumentNullException("field");
            return "COUNT(" + field + ")";
        }

        /// <summary>
        ///   Verilen alanı başına join indeksini getirerek COUNT(..) içerisine alır.</summary>
        /// <param name="joinNumber">
        ///   Alanın bağlı olduğu join indeksi.</param>
        /// <param name="field">
        ///   COUNT(...) içerisine alınacak alan adı.</param>
        /// <returns>
        ///   "COUNT(T5.field)".</returns>
        public static string Count(int joinNumber, string field)
        {
            if (field == null || field.Length == 0)
                throw new ArgumentNullException("field");

            return String.Format("COUNT(T{0}.{1})", joinNumber.ToString(CultureInfo.InvariantCulture), field);
        }

        /// <summary>
        ///   SQL'de sıkça kullanılan COUNT(*) sabitini verir.</summary>
        /// <returns>
        ///   "COUNT(*)"</returns>
        public static string Count()
        {
            return "COUNT(*)";
        }

        /// <summary>
        ///   Verilen alanı COALESCE(..) içerisine alır.</summary>
        /// <param name="fields">
        ///   COALESCE(...) içerisine alınacak alan adları (zorunlu).</param>
        /// <returns>
        ///   "COALESCE(field)".</returns>
        public static string Coalesce(params string[] fields)
        {
            if (fields == null || fields.Length == 0)
                throw new ArgumentNullException("fields");

            StringBuilder sb = new StringBuilder("COALESCE(");
            sb.Append(fields[0]);
            for (int i = 1; i < fields.Length; i++)
            {
                sb.Append(", ");
                sb.Append(fields[i]);
            }
            sb.Append(')');
            return sb.ToString();
        }

        /// <summary>
        ///   Verilen alanı MIN(..) içerisine alır.</summary>
        /// <param name="field">
        ///   MIN(...) içerisine yazılacak alan adı (zorunlu).</param><commit_msg>add an overload to coalesce that supports criteria, field, and queries<commit_after>﻿using System;
using System.Collections.Generic;
using System.Globalization;
using System.Text;

namespace Serenity.Data
{
    public static partial class Sql
    {
        /// <summary>
        ///   Verilen alanı SUM(..) içerisine alır.</summary>
        /// <param name="field">
        ///   SUM(...) içerisine yazılacak alan adı (zorunlu).</param>
        /// <returns>
        ///   "SUM(field)"</returns>
        public static string Sum(string field)
        {
            if (field == null || field.Length == 0)
                throw new ArgumentNullException("field");

            return "SUM(" + field + ")";
        }


        /// <summary>
        ///   Verilen alanı COUNT(..) içerisine alır.</summary>
        /// <param name="field">
        ///   COUNT(...) içerisine alınacak alan adı (zorunlu).</param>
        /// <returns>
        ///   "COUNT(field)".</returns>
        public static string Count(string field)
        {
            if (field == null || field.Length == 0)
                throw new ArgumentNullException("field");
            return "COUNT(" + field + ")";
        }

        /// <summary>
        ///   Verilen alanı başına join indeksini getirerek COUNT(..) içerisine alır.</summary>
        /// <param name="joinNumber">
        ///   Alanın bağlı olduğu join indeksi.</param>
        /// <param name="field">
        ///   COUNT(...) içerisine alınacak alan adı.</param>
        /// <returns>
        ///   "COUNT(T5.field)".</returns>
        public static string Count(int joinNumber, string field)
        {
            if (field == null || field.Length == 0)
                throw new ArgumentNullException("field");

            return String.Format("COUNT(T{0}.{1})", joinNumber.ToString(CultureInfo.InvariantCulture), field);
        }

        /// <summary>
        ///   SQL'de sıkça kullanılan COUNT(*) sabitini verir.</summary>
        /// <returns>
        ///   "COUNT(*)"</returns>
        public static string Count()
        {
            return "COUNT(*)";
        }

        /// <summary>
        ///   Verilen alanı COALESCE(..) içerisine alır.</summary>
        /// <param name="statements">
        ///   COALESCE(...) içerisine alınacak alan adları (zorunlu).</param>
        /// <returns>
        ///   "COALESCE(field)".</returns>
        public static string Coalesce(params string[] statements)
        {
            if (statements == null || statements.Length == 0)
                throw new ArgumentNullException("fields");

            StringBuilder sb = new StringBuilder("COALESCE(");
            sb.Append(statements[0]);
            for (int i = 1; i < statements.Length; i++)
            {
                sb.Append(", ");
                sb.Append(statements[i]);
            }
            sb.Append(')');
            return sb.ToString();
        }

        public static string Coalesce(this IQueryWithParams query, params object[] values)
        {
            if (values == null || values.Length == 0)
                throw new ArgumentNullException("values");

            StringBuilder sb = new StringBuilder("COALESCE(");

            for (var i = 0; i < values.Length; i++)
            {
                if (i > 0)
                    sb.Append(", ");

                var value = values[i];
                if (value is ICriteria)
                    ((ICriteria)value).ToString(sb, query);
                else if (value is IQueryWithParams)
                    sb.Append(((IQueryWithParams) value).ToString());
                else if (value is IField)
                {
                    sb.Append(((IField)value).Expression);
                }
                else
                {
                    var param = query.AutoParam();
                    query.AddParam(param.Name, value);
                    sb.Append(param.Name);
                }
            }

            sb.Append(")");

            return sb.ToString();
        }

        /// <summary>
        ///   Verilen alanı MIN(..) içerisine alır.</summary>
        /// <param name="field">
        ///   MIN(...) içerisine yazılacak alan adı (zorunlu).</param>
{'fraction_non_alphanumeric': 0.15078925505400168, 'fraction_numerical': 0.0029077817779008587, 'mean_word_length': 1.5132219902574808, 'pattern_counts': {'":': 0, '<': 74, '<?xml version=': 0, '>': 72, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '7565063', 'n_tokens_mistral': 2125, 'n_tokens_neox': 1992, 'n_words': 473}