 
     _projectionToInclusionSet: (modelClass, projection) ->
         # See the projection semantics documentation at the top of this file.
-
-        # Returns {includedFieldOrReactiveName: true}
-
+        # Returns {includeSpec: true}
+
+        if projection is undefined then projection = {}
         inclusionSet = {}
 
         if projection._ is false
-            for fieldOrReactiveName, include of projection
-                continue if fieldOrReactiveName is '_'
-                if include then inclusionSet[fieldOrReactiveName] = true
+            for includeSpec, include of projection
+                continue if includeSpec is '_'
+                if include then inclusionSet[includeSpec] = true
 
         else
             for fieldName, fieldSpec of modelClass.fieldSpecs

                if reactiveSpec.include ? false
                    inclusionSet[reactiveName] = true

            for fieldOrReactiveName, include of projection
                continue if fieldOrReactiveName is '_'
                if include
                    inclusionSet[fieldOrReactiveName] = true
                else
                    delete inclusionSet[fieldOrReactiveName]

        inclusionSet


        # Returns whether the results from the querySpecs in superQsArr
        # are sufficient to provide accurate results to qs

        qs = @makeCanonicalQs qs
        superQs = @makeCanonicalQs superQs

        return false if qs.modelName isnt superQs.modelName
        modelClass = J.models[qs.modelName]

        # Make sure the selector is covered
        return false if not @isSelectorCovered qs, superQs

        # And make sure the projection is covered
        inclusionSet = @_projectionToInclusionSet modelClass, qs.fields
        superInclusionSet = @_projectionToInclusionSet modelClass, superQs.fields
        inclusionDiff = J.util.diffStrings _.keys(inclusionSet), _.keys(superInclusionSet)
        for missingInclusionSpec in inclusionDiff.deleted
            # Check for a situation like "w.x.y.z" being covered by "w.x"
            ok = false
            missingInclusionSpecParts = missingInclusionSpec.split('.')
            for i in [0...missingInclusionSpecParts.length - 1]
                if missingInclusionSpecParts[0..i].join('.') of superInclusionSet
                    ok = true
                    break
            return false if not ok

        true


    isSelectorCovered: (qs, superQs) ->
