/** * When no "before" id, and has "after", action is "insert" */ public boolean isInsert() { return !beforeExists() && (mAfter != null); }
/** * When "after" is wiped, action is "delete" */ public boolean isDelete() { return beforeExists() && (mAfter == null); }
/** * When "after" has no changes, action is no-op */ public boolean isNoop() { return beforeExists() && (mAfter != null && mAfter.size() == 0); }
/** * When "after" has some changes, action is "update" */ public boolean isUpdate() { if (!beforeExists() || mAfter == null || mAfter.size() == 0) { return false; } for (String key : mAfter.keySet()) { Object newValue = mAfter.get(key); Object oldValue = mBefore.get(key); if (oldValue == null) { if (newValue != null) { return true; } } else if (!oldValue.equals(newValue)) { return true; } } return false; }
/** * Merge the "after" values from the given {@link ValuesDelta}, * discarding any existing "after" state. This is typically used when * re-parenting changes onto an updated {@link Entity}. */ public static ValuesDelta mergeAfter(ValuesDelta local, ValuesDelta remote) { // Bail early if trying to merge delete with missing local if (local == null && (remote.isDelete() || remote.isTransient())) return null; // Create local version if none exists yet if (local == null) local = new ValuesDelta(); if (!local.beforeExists()) { // Any "before" record is missing, so take all values as "insert" local.mAfter = remote.getCompleteValues(); } else { // Existing "update" with only "after" values local.mAfter = remote.mAfter; } return local; }