class_docstr: Handles connection and execution of the Qdrant statements.
class_docstr_tok: ["Handles","connection","and","execution","of","the","Qdrant","statements","."]
docstr: Select query handler
     Eg: SELECT * FROM qdrant.test_table
  
  Args:
      table_name (str): The name of the table to be queried
      columns (Optional[List[str]], optional): List of column names specified in the query. Defaults to None.
      conditions (Optional[List[FilterCondition]], optional): List of "where" conditionals. Defaults to None.
      offset (int, optional): Offset the results by the provided value. Defaults to 0.
      limit (int, optional): Number of results to return. Defaults to 10.
  
  Returns:
      HandlerResponse: The common query handler response
docstr_tok: ["Select","query","handler","Eg",":","SELECT","*","FROM","qdrant.test_table","Args",":","table_name","(","str",")",":","The","name","of","the","table","to","be","queried","columns","(","Optional","[","List","[","str","]","]",",","optional",")",":","List","of","column","names","specified","in","the","query",".","Defaults","to","None",".","conditions","(","Optional","[","List","[","FilterCondition","]","]",",","optional",")",":","List","of","``","where","''","conditionals",".","Defaults","to","None",".","offset","(","int",",","optional",")",":","Offset","the","results","by","the","provided","value",".","Defaults","to","0.","limit","(","int",",","optional",")",":","Number","of","results","to","return",".","Defaults","to","10",".","Returns",":","HandlerResponse",":","The","common","query","handler","response"]
code: def select(
      self,
      table_name: str,
      columns: Optional[List[str]] = None,
      conditions: Optional[List[FilterCondition]] = None,
      offset: int = 0,
      limit: int = 10,
  ) -> HandlerResponse:
      """Select query handler
         Eg: SELECT * FROM qdrant.test_table
  
      Args:
          table_name (str): The name of the table to be queried
          columns (Optional[List[str]], optional): List of column names specified in the query. Defaults to None.
          conditions (Optional[List[FilterCondition]], optional): List of "where" conditionals. Defaults to None.
          offset (int, optional): Offset the results by the provided value. Defaults to 0.
          limit (int, optional): Number of results to return. Defaults to 10.
  
      Returns:
          HandlerResponse: The common query handler response
      """
  
      # Validate and set offset and limit as None is passed if not set in the query
      offset = offset if offset is not None else 0
      limit = limit if limit is not None else 10
  
      # Full scroll if no where conditions are specified
      if not conditions:
          results = self._client.scroll(
              table_name, limit=limit, offset=offset
          )
          payload = self._process_select_results(results[0], columns)
          return Response(
              resp_type=RESPONSE_TYPE.TABLE, data_frame=payload
          )
  
      # Filter conditions
      vector_filter = [
          condition.value
          for condition in conditions
          if condition.column == TableField.SEARCH_VECTOR.value
      ]
      id_filters = [
          condition.value
          for condition in conditions
          if condition.column == TableField.ID.value
      ]
      query_filters = self._translate_filter_conditions(conditions)
  
      # Prefer returning results by IDs first
      if id_filters:
          results = self._client.retrieve(table_name, ids=id_filters)
      # Followed by the search_vector value
      elif vector_filter:
          # Perform a similarity search with the first vector filter
          results = self._client.search(
              table_name,
              query_vector=vector_filter[0],
              query_filter=query_filters or None,
              limit=limit,
              offset=offset,
          )
      elif query_filters:
          results = self._client.scroll(
              table_name,
              scroll_filter=query_filters,
              limit=limit,
              offset=offset,
          )[0]
  
      # Process results
      payload = self._process_select_results(results, columns)
      return Response(resp_type=RESPONSE_TYPE.TABLE, data_frame=payload)
  
imports: from collections import OrderedDict
  from typing import Any, List, Optional
  from itertools import zip_longest
  from qdrant_client import QdrantClient, models
  import pandas
  from mindsdb.integrations.libs.response import HandlerResponse
  from mindsdb.integrations.libs.const import HANDLER_CONNECTION_ARG_TYPE
  from mindsdb.integrations.libs.response import RESPONSE_TYPE
  from mindsdb.integrations.libs.response import HandlerResponse
  from mindsdb.integrations.libs.response import HandlerStatusResponse
  from mindsdb.integrations.libs.vectordatabase_handler import FilterCondition, FilterOperator, TableField, VectorStoreHandler
  from mindsdb.utilities import log
label_desc: Use image node_id 13 for calling the QdrantHandler obj's underlying member method code with example usage: obj.select(table_name, columns, conditions, offset, limit) and returns: Response, Response