code: def test_extract_range_list_from_predicate(self):
      # id > 10 AND id > 20 -> (21, 100)
      expr = LogicalExpression(
          ExpressionType.LOGICAL_AND,
          self.gen_cmp_expr(10),
          self.gen_cmp_expr(20),
      )
      self.assertEqual(
          extract_range_list_from_predicate(expr, 0, 100), [(21, 100)]
      )
      # id > 10 OR id > 20 -> (11, 100)
      expr = LogicalExpression(
          ExpressionType.LOGICAL_OR,
          self.gen_cmp_expr(10),
          self.gen_cmp_expr(20),
      )
      self.assertEqual(
          extract_range_list_from_predicate(expr, 0, 100), [(11, 100)]
      )
  
      # (id > 10 OR id > 20) OR (id > 10 AND id < 5) -> (11, 100)
      expr1 = LogicalExpression(
          ExpressionType.LOGICAL_OR,
          self.gen_cmp_expr(10),
          self.gen_cmp_expr(20),
      )
      expr2 = LogicalExpression(
          ExpressionType.LOGICAL_AND,
          self.gen_cmp_expr(10),
          self.gen_cmp_expr(5, ExpressionType.COMPARE_LESSER),
      )
      expr = LogicalExpression(ExpressionType.LOGICAL_OR, expr1, expr2)
      self.assertEqual(
          extract_range_list_from_predicate(expr, 0, 100), [(11, 100)]
      )
  
      # (id > 10 OR id > 20) AND (id > 10 AND id < 5) -> []
      expr = LogicalExpression(ExpressionType.LOGICAL_AND, expr1, expr2)
      self.assertEqual(
          extract_range_list_from_predicate(expr, 0, 100), []
      )
  
      # (id < 10 OR id > 20) OR (id > 25 OR id < 5) -> [(0,9), (21,100)]
      expr1 = LogicalExpression(
          ExpressionType.LOGICAL_OR,
          self.gen_cmp_expr(10, ExpressionType.COMPARE_LESSER),
          self.gen_cmp_expr(20),
      )
      expr2 = LogicalExpression(
          ExpressionType.LOGICAL_OR,
          self.gen_cmp_expr(25),
          self.gen_cmp_expr(5, ExpressionType.COMPARE_LESSER),
      )
      expr = LogicalExpression(ExpressionType.LOGICAL_OR, expr1, expr2)
      self.assertEqual(
          extract_range_list_from_predicate(expr, 0, 100),
          [(0, 9), (21, 100)],
      )
  
      with self.assertRaises(RuntimeError):
          expr = ArithmeticExpression(
              ExpressionType.AGGREGATION_COUNT, Mock(), Mock()
          )
          extract_range_list_from_predicate(expr, 0, 100)
  
file_path: evadb/test/unit_tests/expression/test_expression_utils.py
imports: import unittest
  from unittest.mock import Mock
  from evadb.expression.abstract_expression import ExpressionType
  from evadb.expression.arithmetic_expression import ArithmeticExpression
  from evadb.expression.comparison_expression import ComparisonExpression
  from evadb.expression.constant_value_expression import ConstantValueExpression
  from evadb.expression.expression_utils import conjunction_list_to_expression_tree, contains_single_column, extract_range_list_from_comparison_expr, extract_range_list_from_predicate, is_simple_predicate
  from evadb.expression.logical_expression import LogicalExpression
  from evadb.expression.tuple_value_expression import TupleValueExpression
label_desc: Use image node_id 3 for calling the ExpressionUtilsTest obj's underlying member method code with example usage: obj.test_extract_range_list_from_predicate() without return types