code: private void fireObjectsChanged(DBIDs objects, Type type) {
      // flush first
      if(currentDataStoreEventType != null && !currentDataStoreEventType.equals(type)) {
        flushDataStoreEvents();
      }
      if(accumulateDataStoreEvents) {
        if(this.dataStoreObjects == null) {
          this.dataStoreObjects = DBIDUtil.newHashSet();
        }
        this.dataStoreObjects.addDBIDs(objects);
        currentDataStoreEventType = type;
        return;
      }
      // Execute immediately:
      DataStoreEvent e;
      switch(type){
      case INSERT:
        e = DataStoreEvent.insertionEvent(objects);
        break;
      case REMOVE:
        e = DataStoreEvent.removalEvent(objects);
        break;
      case UPDATE:
        e = DataStoreEvent.updateEvent(objects);
        break;
      default:
        return;
      }
  
      for(int i = dataListenerList.size(); --i >= 0;) {
        dataListenerList.get(i).contentChanged(e);
      }
    }
docs: Handles a DataStoreEvent with the specified type. If the current event type
  is not equal to the specified type, the events accumulated up to now will
  be fired first.
  
  The new event will be aggregated and fired on demand if
  {@link #accumulateDataStoreEvents} is set, otherwise all registered
  <code>DataStoreListener</code> will be notified immediately that the
  content of the database has been changed.
  
  @param objects the objects that have been changed, i.e. inserted, deleted
  or updated