blob: f38c22482930ebfa88bd278c0234b0b2aa80027c [file] [log] [blame]
using System.Collections.Generic;
using System.Linq;
namespace AppsheetEpplus;
public class CountIf : ExcelFunction {
private readonly NumericExpressionEvaluator _numericExpressionEvaluator;
private readonly WildCardValueMatcher _wildCardValueMatcher;
public CountIf()
: this(new(), new()) {}
public CountIf(NumericExpressionEvaluator evaluator, WildCardValueMatcher wildCardValueMatcher) {
Require.That(evaluator).Named("evaluator").IsNotNull();
Require.That(wildCardValueMatcher).Named("wildCardValueMatcher").IsNotNull();
_numericExpressionEvaluator = evaluator;
_wildCardValueMatcher = wildCardValueMatcher;
}
private bool Evaluate(object obj, string expression) {
double? candidate = default(double?);
if (IsNumeric(obj)) {
candidate = ConvertUtil.GetValueDouble(obj);
}
if (candidate.HasValue) {
return _numericExpressionEvaluator.Evaluate(candidate.Value, expression);
}
if (obj == null) {
return false;
}
return _wildCardValueMatcher.IsMatch(expression, obj.ToString()) == 0;
}
public override CompileResult Execute(
IEnumerable<FunctionArgument> arguments,
ParsingContext context) {
var functionArguments = arguments as FunctionArgument[] ?? arguments.ToArray();
ValidateArguments(functionArguments, 2);
var range = functionArguments.ElementAt(0);
var criteria = ArgToString(functionArguments, 1);
double result = 0d;
if (range.IsExcelRange) {
foreach (var cell in range.ValueAsRangeInfo) {
if (Evaluate(cell.Value, criteria)) {
result++;
}
}
} else if (range.Value is IEnumerable<FunctionArgument> value) {
foreach (var arg in value) {
if (Evaluate(arg.Value, criteria)) {
result++;
}
}
} else {
if (Evaluate(range.Value, criteria)) {
result++;
}
}
return CreateResult(result, DataType.Integer);
}
}