public int Compare(T x, T y) { for (int i = 0; i < getters.Length; i++) { var getter = getters[i]; var xVal = getter(x); var yVal = getter(y); var cmp = CompareTypeUtils.CompareTo(xVal, yVal); if (cmp != 0) { return(orderAsc[i] ? cmp : cmp * -1); } } return(0); }
public virtual int CompareTo(object a, object b) { return(CompareTypeUtils.CompareTo(a, b)); }
public virtual object SelectAggregate(IDataQuery q, string name, IEnumerable <string> args) { name = name?.ToUpper() ?? throw new ArgumentNullException(nameof(name)); if (name != "COUNT" && name != "MIN" && name != "MAX" && name != "AVG" && name != "SUM" && name != "FIRST" && name != "LAST") { return(null); } var query = (DataQuery <T>)q; var argsArray = args.ToArray(); var firstArg = argsArray.FirstOrDefault(); string modifier = null; if (firstArg != null && firstArg.StartsWithIgnoreCase("DISTINCT ")) { modifier = "DISTINCT"; firstArg = firstArg.Substring(modifier.Length + 1); } if (name == "COUNT" && (firstArg == null || firstArg == "*")) { return(Count(q)); } var firstGetter = TypeProperties <T> .Instance.GetPublicGetter(firstArg); if (firstGetter == null) { return(null); } var data = ApplyConditions(GetDataSource(q), query.Conditions); if (name == "FIRST" || name == "LAST") { data = ApplySorting(data, q.OrderBy); } var source = data.ToArray(); switch (name) { case "COUNT": if (modifier == "DISTINCT") { var results = new HashSet <object>(); foreach (var item in source) { results.Add(firstGetter(item)); } return(results.Count); } return(CompareTypeUtils.Aggregate(source, (acc, next) => CompareTypeUtils.Add(acc, firstGetter(next)), 0)); case "MIN": return(CompareTypeUtils.Aggregate(source, (acc, next) => CompareTypeUtils.Min(acc, firstGetter(next)))); case "MAX": return(CompareTypeUtils.Aggregate(source, (acc, next) => CompareTypeUtils.Max(acc, firstGetter(next)))); case "SUM": return(CompareTypeUtils.Sum(source.Map(x => firstGetter(x)))); case "AVG": object sum = CompareTypeUtils.Sum(source.Map(x => firstGetter(x))); var sumDouble = (double)Convert.ChangeType(sum, typeof(double)); return(sumDouble / source.Length); case "FIRST": return(source.Length > 0 ? firstGetter(source[0]) : null); case "LAST": return(source.Length > 0 ? firstGetter(source[source.Length - 1]) : null); } return(null); }