[NO ISSUE][RT] Skip appending empty frames in Primary/SecondaryUpsertOperator

- user model changes: no
- storage format changes: no
- interface changes: no

Change-Id: I99cf5326044570002b6c4ccf5316d97e546401b6
Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/17787
Reviewed-by: Ali Alsuliman <ali.al.solaiman@gmail.com>
Integration-Tests: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Tested-by: Michael Blow <mblow@apache.org>
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/operators/LSMPrimaryUpsertOperatorNodePushable.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/operators/LSMPrimaryUpsertOperatorNodePushable.java
index 1e7f4b7..3b8ee68 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/operators/LSMPrimaryUpsertOperatorNodePushable.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/operators/LSMPrimaryUpsertOperatorNodePushable.java
@@ -282,7 +282,9 @@
 
                 @Override
                 public void frameCompleted() throws HyracksDataException {
-                    appender.write(writer, true);
+                    if (appender.getTupleCount() > 0) {
+                        appender.write(writer, true);
+                    }
                     callback.frameCompleted();
                 }
 
@@ -404,7 +406,9 @@
      */
     @Override
     public void flushPartialFrame() throws HyracksDataException {
-        appender.write(writer, true);
+        if (appender.getTupleCount() > 0) {
+            appender.write(writer, true);
+        }
     }
 
     protected void appendFilterToPrevTuple() throws IOException {
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/operators/LSMSecondaryUpsertOperatorNodePushable.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/operators/LSMSecondaryUpsertOperatorNodePushable.java
index 955d5aa..eb4e46a 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/operators/LSMSecondaryUpsertOperatorNodePushable.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/operators/LSMSecondaryUpsertOperatorNodePushable.java
@@ -152,4 +152,9 @@
         }
         return false;
     }
+
+    @Override
+    public void flush() throws HyracksDataException {
+        // No op since nextFrame flushes by default
+    }
 }