nodes: 0, module; 1, function_definition; 2, function_name:find; 3, parameters; 4, block; 5, identifier:self; 6, list_splat_pattern; 7, dictionary_splat_pattern; 8, expression_statement; 9, if_statement; 10, expression_statement; 11, expression_statement; 12, expression_statement; 13, expression_statement; 14, expression_statement; 15, if_statement; 16, expression_statement; 17, expression_statement; 18, expression_statement; 19, if_statement; 20, expression_statement; 21, if_statement; 22, return_statement; 23, identifier:_clauses; 24, identifier:kwargs; 25, comment:"""Perform a simple search on the table.
  
          Simply pass keyword arguments as ``filter``.
          ::
  
              results = table.find(country='France')
              results = table.find(country='France', year=1980)
  
          Using ``_limit``::
  
              # just return the first 10 rows
              results = table.find(country='France', _limit=10)
  
          You can sort the results by single or multiple columns. Append a minus
          sign to the column name for descending order::
  
              # sort results by a column 'year'
              results = table.find(country='France', order_by='year')
              # return all rows sorted by multiple columns (descending by year)
              results = table.find(order_by=['country', '-year'])
  
          To perform complex queries with advanced filters or to perform
          aggregation, use :py:meth:`db.query() <dataset.Database.query>`
          instead.
          """; 26, not_operator; 27, block; 28, assignment; 29, assignment; 30, assignment; 31, assignment; 32, assignment; 33, boolean_operator; 34, block; 35, assignment; 36, assignment; 37, assignment; 38, call; 39, block; 40, assignment; 41, identifier:_streamed; 42, block; 43, call; 44, attribute; 45, return_statement; 46, identifier:_limit; 47, call; 48, identifier:_offset; 49, call; 50, identifier:order_by; 51, call; 52, identifier:_streamed; 53, call; 54, identifier:_step; 55, call; 56, comparison_operator:_step is False; 57, comparison_operator:_step == 0; 58, expression_statement; 59, identifier:order_by; 60, call; 61, identifier:args; 62, call; 63, identifier:query; 64, call; 65, identifier:len; 66, argument_list; 67, expression_statement; 68, identifier:conn; 69, attribute; 70, expression_statement; 71, expression_statement; 72, identifier:ResultIter; 73, argument_list; 74, identifier:self; 75, identifier:exists; 76, call; 77, attribute; 78, argument_list; 79, attribute; 80, argument_list; 81, attribute; 82, argument_list; 83, attribute; 84, argument_list; 85, attribute; 86, argument_list; 87, identifier:_step; 88, False; 89, identifier:_step; 90, integer:0; 91, assignment; 92, attribute; 93, argument_list; 94, attribute; 95, argument_list; 96, attribute; 97, argument_list; 98, identifier:order_by; 99, assignment; 100, attribute; 101, identifier:executable; 102, assignment; 103, assignment; 104, call; 105, keyword_argument; 106, keyword_argument; 107, identifier:iter; 108, argument_list; 109, identifier:kwargs; 110, identifier:pop; 111, string; 112, None; 113, identifier:kwargs; 114, identifier:pop; 115, string; 116, integer:0; 117, identifier:kwargs; 118, identifier:pop; 119, string; 120, None; 121, identifier:kwargs; 122, identifier:pop; 123, string; 124, False; 125, identifier:kwargs; 126, identifier:pop; 127, string; 128, identifier:QUERY_STEP; 129, identifier:_step; 130, None; 131, identifier:self; 132, identifier:_args_to_order_by; 133, identifier:order_by; 134, identifier:self; 135, identifier:_args_to_clause; 136, identifier:kwargs; 137, keyword_argument; 138, attribute; 139, identifier:select; 140, keyword_argument; 141, keyword_argument; 142, keyword_argument; 143, identifier:query; 144, call; 145, identifier:self; 146, identifier:db; 147, identifier:conn; 148, call; 149, identifier:conn; 150, call; 151, attribute; 152, argument_list; 153, identifier:row_type; 154, attribute; 155, identifier:step; 156, identifier:_step; 157, list; 158, string_content:_limit; 159, string_content:_offset; 160, string_content:order_by; 161, string_content:_streamed; 162, string_content:_step; 163, identifier:clauses; 164, identifier:_clauses; 165, identifier:self; 166, identifier:table; 167, identifier:whereclause; 168, identifier:args; 169, identifier:limit; 170, identifier:_limit; 171, identifier:offset; 172, identifier:_offset; 173, attribute; 174, argument_list; 175, attribute; 176, argument_list; 177, attribute; 178, argument_list; 179, identifier:conn; 180, identifier:execute; 181, identifier:query; 182, attribute; 183, identifier:row_type; 184, identifier:query; 185, identifier:order_by; 186, list_splat; 187, attribute; 188, identifier:connect; 189, identifier:conn; 190, identifier:execution_options; 191, keyword_argument; 192, identifier:self; 193, identifier:db; 194, identifier:order_by; 195, attribute; 196, identifier:engine; 197, identifier:stream_results; 198, True; 199, identifier:self; 200, identifier:db
code: def find(self, *_clauses, **kwargs):
          """Perform a simple search on the table.
  
          Simply pass keyword arguments as ``filter``.
          ::
  
              results = table.find(country='France')
              results = table.find(country='France', year=1980)
  
          Using ``_limit``::
  
              # just return the first 10 rows
              results = table.find(country='France', _limit=10)
  
          You can sort the results by single or multiple columns. Append a minus
          sign to the column name for descending order::
  
              # sort results by a column 'year'
              results = table.find(country='France', order_by='year')
              # return all rows sorted by multiple columns (descending by year)
              results = table.find(order_by=['country', '-year'])
  
          To perform complex queries with advanced filters or to perform
          aggregation, use :py:meth:`db.query() <dataset.Database.query>`
          instead.
          """
          if not self.exists:
              return iter([])
  
          _limit = kwargs.pop('_limit', None)
          _offset = kwargs.pop('_offset', 0)
          order_by = kwargs.pop('order_by', None)
          _streamed = kwargs.pop('_streamed', False)
          _step = kwargs.pop('_step', QUERY_STEP)
          if _step is False or _step == 0:
              _step = None
  
          order_by = self._args_to_order_by(order_by)
          args = self._args_to_clause(kwargs, clauses=_clauses)
          query = self.table.select(whereclause=args,
                                    limit=_limit,
                                    offset=_offset)
          if len(order_by):
              query = query.order_by(*order_by)
  
          conn = self.db.executable
          if _streamed:
              conn = self.db.engine.connect()
              conn = conn.execution_options(stream_results=True)
  
          return ResultIter(conn.execute(query),
                            row_type=self.db.row_type,
                            step=_step)