       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
+      # Trigger if A) no changes came in during the update, or B) applying
+      # those changes has no effect on the result set, and this one is
+      # still good.
+      if @_queuedChangeRecords.length is 0 or not @_processChangeRecords()
         @_createResultAndTrigger()
-      else
-        @_processChangeRecords()
 
   cancelPendingUpdate: =>
     @_queryVersion += 1

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

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

      @_set.clipToRange(@_query.range())

  _createResultAndTrigger: =>
    allCompleteModels = @_set.isComplete()
    allUniqueIds = _.uniq(@_set.ids()).length is @_set.ids().length

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

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

    if @_options.asResultSet
      @_set.setQuery(@_query)
      @_lastResult = @_set.immutableClone()
