@startuml

package "(model)\ndbschema" {
	interface DBParameters {
		quotedIDFactory: QuotedIDFactory
		DBTypeFactory: DBTypeFactory
		driverName: String
		driverVersion: String
		dbmsProductName: String
		dbmsVersion: String
	}
}

package "(rdb)\ngeneration.normalization" {
	interface DialectExtraNormalizer {
		transform(IQTree, VariableGenerator): IQTree
	}
}

package "(reformulation-core)\nanswering.reformulation\n.generation" {
	
	interface NativeQueryGenerator {
		generateSourceQuery(IQ): IQ
	}
	
	interface PostProcessingProjectionSplitter <<DIP>> {
		split(IQ): PostProcessingSplit
	}
}

package "" as settings <<Rectangle>>
{
	package "(reformulation-sql)\nanswering.reformulation\n.generation.impl" #FFFFEE
	{
		class SQLGeneratorImpl {
			ctor(DBParameters,\n  IntermediateQueryFactory,\n  UnionFlattener,\n  OptimizerFactory,\n  PostProcessingProjectionSplitter,\n  TermTypeTermLifter,\n  PostProcessableFunctionLifter,\n  IQTree2NativeNodeGenerator,\n  DialectExtraNormalizer,\n  BooleanExpressionPushDownTransformer)
		}
		NativeQueryGenerator <|.. SQLGeneratorImpl
		SQLGeneratorImpl ..> DBParameters
		SQLGeneratorImpl .> DialectExtraNormalizer
		PostProcessingProjectionSplitter <.. SQLGeneratorImpl
	}
}

package "(reformulation-core)\ninjection"
{
	interface TranslationFactory <<DIF>> {
		create(DBParameters): NativeQueryGenerator\n...
	}
	TranslationFactory ..> NativeQueryGenerator: <<creates>>
}


@enduml