     @_queuedChangeRecords.push(record)
     @_processChangeRecords() unless @_updateInFlight
 
+  # Scan through change records and apply them to the last result set.
+  # - Returns true if changes did / will result in new result set being created.
+  # - Returns false if no changes were made.
+  #
   _processChangeRecords: =>
-    return if @_queuedChangeRecords.length is 0
-    return @update() if not @_set
+    if @_queuedChangeRecords.length is 0
+      return false
+    if not @_set
+      @update()
+      return true
 
     knownImpacts = 0
     unknownImpacts = 0

      return unless @_queryVersion is version
      @_updateInFlight = false

      allChangesApplied = @_queuedChangeRecords.length is 0
      allCompleteModels = @_set.isComplete()
      allUniqueIds = _.uniq(@_set.ids()).length is @_set.ids().length

      if allChangesApplied and not allUniqueIds
        throw new Error("QuerySubscription: Applied all changes and result set contains duplicate IDs.")

      if allChangesApplied and not allCompleteModels
        throw new Error("QuerySubscription: Applied all changes and result set is missing models.")

      if allChangesApplied and allCompleteModels and allUniqueIds
        @_createResultAndTrigger()
      else
        @_processChangeRecords()

  cancelPendingUpdate: =>
    @_queryVersion += 1

    if unknownImpacts > 0
      @_set = null if mustRefetchAllIds
      @update()
      return true
    else if knownImpacts > 0
      @_createResultAndTrigger()
      return true
    else
      return false

  _itemSortOrderHasChanged: (old, updated) ->
    for descriptor in @_query.orderSortDescriptors()
