public string Simplify(QueryParts query)
{
var co = query.ResultOperators[0];
var prefix = "SELECT COUNT(*)";
query.Selects.Clear();
query.CurrentSelectIndex = 0;
if (co is LongCountResultOperator)
{
query.AddSelectPart(query.MainFrom, "COUNT(*)", "count", typeof(long), (_, __, dr) => dr.GetInt64(0));
}
else
{
query.AddSelectPart(query.MainFrom, "COUNT(*)::int", "count", typeof(int), (_, __, dr) => dr.GetInt32(0));
prefix += "::int";
}
prefix += " FROM ";
var type = query.MainFrom.FromExpression.Type.GetGenericArguments()[0];
var isRoot = typeof(IAggregateRoot).IsAssignableFrom(type);
if (isRoot)
return prefix + @"""{0}"".""{1}""".With(type.Namespace, type.Name);
var isEvent = typeof(IDomainEvent).IsAssignableFrom(type);
if (isEvent)
return type.IsNested
? prefix + @"""{0}"".""{1}.{2}""".With(type.Namespace, type.DeclaringType.Name, type.Name)
: prefix + @"""{0}"".""{1}""".With(type.Namespace, type.Name);
var ent =
(from i in type.GetInterfaces()
where i.IsGenericType
&& i.GetGenericTypeDefinition() == typeof(ISnowflake<>)
select i.GetGenericArguments()[0])
.FirstOrDefault() ?? type;
return prefix + @"""{0}"".""{1}""".With(ent.Namespace, ent.Name);
}