code: def test_should_return_smaller_num_rows(self):
      dfs = [
          pd.DataFrame(
              np.random.randint(0, 100, size=(100, 4)),
              columns=list("ABCD"),
          )
          for _ in range(4)
      ]
  
      batches = [Batch(frames=df) for df in dfs]
  
      sample_value = 3
  
      plan = SamplePlan(ConstantValueExpression(sample_value))
  
      sample_executor = SampleExecutor(MagicMock(), plan)
      sample_executor.append_child(DummyExecutor(batches))
      reduced_batches = list(sample_executor.exec())
  
      original = Batch.concat(batches)
      filter = range(0, len(original), sample_value)
      original = original._get_frames_from_indices(filter)
      original = Batch.concat([original])
  
      reduced = Batch.concat(reduced_batches)
  
      self.assertEqual(len(original), len(reduced))
      self.assertEqual(original, reduced)
  
file_path: evadb/test/unit_tests/executor/test_sample_executor.py
imports: import unittest
  from test.unit_tests.executor.utils import DummyExecutor
  import numpy
  import pandas
  from mock import MagicMock
  from evadb.executor.sample_executor import SampleExecutor
  from evadb.expression.constant_value_expression import ConstantValueExpression
  from evadb.models.storage.batch import Batch
  from evadb.plan_nodes.sample_plan import SamplePlan
label_desc: Use image node_id 1 for calling the SampleExecutorTest obj's underlying member method code with example usage: obj.test_should_return_smaller_num_rows() without return types