==== VARIATION: inclusion project ====
-- INPUTS:
pipeline: [{$project: {a1: 1, a2: 1, a3: 1, a4: 1, a5: 1, a6: 1}}]
metadata: 
	number of partitions: 1
	scan definitions: 
		collection: 
			options: 
			distribution and paths: 
				distribution type: Centralized
				distribution paths: 
			indexes: 
			collection exists: 1
			CE type: (empty)

-- OUTPUT:
Root [{combinedProjection_0}]
Evaluation [{combinedProjection_0}]
|   EvalPath []
|   |   Variable [scan_0]
|   PathKeep [_id, a1, a2, a3, a4, a5, a6]
Scan [collection, {scan_0}]


==== VARIATION: inclusion project dotted paths ====
-- INPUTS:
pipeline: [{$project: {'a.b':1, 'a.c':1, 'b':1}}]
metadata: 
	number of partitions: 1
	scan definitions: 
		collection: 
			options: 
			distribution and paths: 
				distribution type: Centralized
				distribution paths: 
			indexes: 
			collection exists: 1
			CE type: (empty)

-- OUTPUT:
Root [{combinedProjection_0}]
Evaluation [{combinedProjection_0}]
|   EvalPath []
|   |   Variable [scan_0]
|   PathComposeM []
|   |   PathField [a]
|   |   PathTraverse [inf]
|   |   PathComposeM []
|   |   |   PathKeep [b, c]
|   |   PathObj []
|   PathKeep [_id, a, b]
Scan [collection, {scan_0}]


==== VARIATION: exclusion project ====
-- INPUTS:
pipeline: [{$project: {a: 0, b: 0}}]
metadata: 
	number of partitions: 1
	scan definitions: 
		collection: 
			options: 
			distribution and paths: 
				distribution type: Centralized
				distribution paths: 
			indexes: 
			collection exists: 1
			CE type: (empty)

-- OUTPUT:
Root [{combinedProjection_0}]
Evaluation [{combinedProjection_0}]
|   EvalPath []
|   |   Variable [scan_0]
|   PathDrop [a, b]
Scan [collection, {scan_0}]


==== VARIATION: $project with deeply nested path ====
-- INPUTS:
pipeline: [{$project: {'a1.b.c':1, 'a.b.c.d.e':'str'}}]
metadata: 
	number of partitions: 1
	scan definitions: 
		collection: 
			options: 
			distribution and paths: 
				distribution type: Centralized
				distribution paths: 
			indexes: 
			collection exists: 1
			CE type: (empty)

-- OUTPUT:
Root [{combinedProjection_0}]
Evaluation [{combinedProjection_0}]
|   EvalPath []
|   |   Variable [scan_0]
|   PathComposeM []
|   |   PathField [a1]
|   |   PathTraverse [inf]
|   |   PathComposeM []
|   |   |   PathField [b]
|   |   |   PathTraverse [inf]
|   |   |   PathComposeM []
|   |   |   |   PathKeep [c]
|   |   |   PathObj []
|   |   PathComposeM []
|   |   |   PathKeep [b]
|   |   PathObj []
|   PathComposeM []
|   |   PathField [a]
|   |   PathTraverse [inf]
|   |   PathComposeM []
|   |   |   PathField [b]
|   |   |   PathTraverse [inf]
|   |   |   PathComposeM []
|   |   |   |   PathField [c]
|   |   |   |   PathTraverse [inf]
|   |   |   |   PathComposeM []
|   |   |   |   |   PathField [d]
|   |   |   |   |   PathTraverse [inf]
|   |   |   |   |   PathComposeM []
|   |   |   |   |   |   PathDefault []
|   |   |   |   |   |   Const [{}]
|   |   |   |   |   PathComposeM []
|   |   |   |   |   |   PathField [e]
|   |   |   |   |   |   PathConstant []
|   |   |   |   |   |   Variable [projGetPath_0]
|   |   |   |   |   PathKeep [e]
|   |   |   |   PathKeep [d]
|   |   |   PathKeep [c]
|   |   PathKeep [b]
|   PathKeep [_id, a, a1]
Evaluation [{projGetPath_0} = Const ["str"]]
Scan [collection, {scan_0}]


