Generic optimizer
Tasks: - Collect information (hasUnion, hasFilter, hasService) - Collect all statements in a list (for source
selection), do not collect SERVICE expressions - Collect all Join arguments and group them in the NJoin structure for
easier optimization (flatten)