o
     h                     @  s   d dl mZ d dlZd dlmZ d dlmZ d dlmZ d dl	m
Z
 d dl	mZ G dd deZG d	d
 d
eZG dd deZeG dd dZG dd de
jZdS )    )annotationsN)	dataclass)Enum)Optional)Floatc                   @  s   e Zd ZdZdZ	 dZdS )VectorIndexTypezEnum representing different types of VECTOR index structures.

    See :ref:`oracle_vector_datatype` for background.

    .. versionadded:: 2.0.41

    HNSWIVFN)__name__
__module____qualname____doc__r   r	    r   r   T/var/www/html/venv/lib/python3.10/site-packages/sqlalchemy/dialects/oracle/vector.pyr      s    r   c                   @  &   e Zd ZdZdZ	 dZ	 dZ	 dZdS )VectorDistanceTypezEnum representing different types of vector distance metrics.

    See :ref:`oracle_vector_datatype` for background.

    .. versionadded:: 2.0.41

    	EUCLIDEANDOTCOSINE	MANHATTANN)r
   r   r   r   r   r   r   r   r   r   r   r   r   (   s    r   c                   @  r   )VectorStorageFormatzEnum representing the data format used to store vector components.

    See :ref:`oracle_vector_datatype` for background.

    .. versionadded:: 2.0.41

    INT8BINARYFLOAT32FLOAT64N)r
   r   r   r   r   r   r   r   r   r   r   r   r   G   s    r   c                   @  s   e Zd ZU dZejZded< dZded< dZ	ded< dZ
ded	< dZded
< dZded< dZded< dZded< dZded< dd ZdS )VectorIndexConfiga  Define the configuration for Oracle VECTOR Index.

    See :ref:`oracle_vector_datatype` for background.

    .. versionadded:: 2.0.41

    :param index_type: Enum value from :class:`.VectorIndexType`
     Specifies the indexing method. For HNSW, this must be
     :attr:`.VectorIndexType.HNSW`.

    :param distance: Enum value from :class:`.VectorDistanceType`
     specifies the metric for calculating distance between VECTORS.

    :param accuracy: interger. Should be in the range 0 to 100
     Specifies the accuracy of the nearest neighbor search during
     query execution.

    :param parallel: integer. Specifies degree of parallelism.

    :param hnsw_neighbors: interger. Should be in the range 0 to
     2048. Specifies the number of nearest neighbors considered
     during the search. The attribute :attr:`.VectorIndexConfig.hnsw_neighbors`
     is HNSW index specific.

    :param hnsw_efconstruction: integer. Should be in the range 0
     to 65535. Controls the trade-off between indexing speed and
     recall quality during index construction. The attribute
     :attr:`.VectorIndexConfig.hnsw_efconstruction` is HNSW index
     specific.

    :param ivf_neighbor_partitions: integer. Should be in the range
     0 to 10,000,000. Specifies the number of partitions used to
     divide the dataset. The attribute
     :attr:`.VectorIndexConfig.ivf_neighbor_partitions` is IVF index
     specific.

    :param ivf_sample_per_partition: integer. Should be between 1
     and ``num_vectors / neighbor partitions``. Specifies the
     number of samples used per partition. The attribute
     :attr:`.VectorIndexConfig.ivf_sample_per_partition` is IVF index
     specific.

    :param ivf_min_vectors_per_partition: integer. From 0 (no trimming)
     to the total number of vectors (results in 1 partition). Specifies
     the minimum number of vectors per partition. The attribute
     :attr:`.VectorIndexConfig.ivf_min_vectors_per_partition`
     is IVF index specific.

    r   
index_typeNzOptional[VectorDistanceType]distancezOptional[int]accuracyhnsw_neighborshnsw_efconstructionivf_neighbor_partitionsivf_sample_per_partitionivf_min_vectors_per_partitionparallelc                 C  sN   t | j| _dD ]}t| |}|d ur$t|ts$t| dt|j qd S )N)r   r    r!   r"   r#   r$   r   z$ must be an integer ifprovided, got )r   r   getattr
isinstanceint	TypeErrortyper
   )selffieldvaluer   r   r   __post_init__   s   
	zVectorIndexConfig.__post_init__)r
   r   r   r   r   r   r   __annotations__r   r   r   r    r!   r"   r#   r$   r-   r   r   r   r   r   b   s   
 2r   c                   @  sj   e Zd ZdZdZd Zejdejdej	dej
diZddd	Zd
d Zdd Zdd ZG dd dejjZdS )VECTORzOracle VECTOR datatype.

    For complete background on using this type, see
    :ref:`oracle_vector_datatype`.

    .. versionadded:: 2.0.41

    TbBfdNc                 C  sD   |durt |tstd|durt |tstd|| _|| _dS )aP  Construct a VECTOR.

        :param dim: integer. The dimension of the VECTOR datatype. This
         should be an integer value.

        :param storage_format: VectorStorageFormat. The VECTOR storage
         type format. This may be Enum values form
         :class:`.VectorStorageFormat` INT8, BINARY, FLOAT32, or FLOAT64.

        Nzdim must be an intergerz:storage_format must be an enum of type VectorStorageFormat)r&   r'   r(   r   dimstorage_format)r*   r4   r5   r   r   r   __init__   s   

zVECTOR.__init__c                   s    fdd}|S )zT
        Convert a list to a array.array before binding it to the database.
        c                   sF   | d u s
t | tjr| S t | tr  j}t|| } | S td)Nz$VECTOR accepts list or array.array())r&   arraylist_array_typecoder5   r(   )r,   typecoder*   r   r   process   s   
z.VECTOR._cached_bind_processor.<locals>.processr   )r*   dialectr<   r   r;   r   _cached_bind_processor   s   zVECTOR._cached_bind_processorc                 C  s   dd }|S )zR
        Convert a array.array to list before binding it to the database.
        c                 S  s   t | tjr
t| S d S )N)r&   r7   r8   )r,   r   r   r   r<      s   z0VECTOR._cached_result_processor.<locals>.processr   )r*   r=   coltyper<   r   r   r   _cached_result_processor   s   zVECTOR._cached_result_processorc                 C  s   | j |dS )z7
        Map storage format to array typecode.
        r3   )_typecode_mapget)r*   r:   r   r   r   r9      s   zVECTOR._array_typecodec                   @  s$   e Zd Zdd Zdd Zdd ZdS )zVECTOR.comparator_factoryc                 C     | j dtd|S )Nz<->return_typeopr   r*   otherr   r   r   l2_distance     z%VECTOR.comparator_factory.l2_distancec                 C  rC   )Nz<#>rD   rF   rH   r   r   r   inner_product  rK   z'VECTOR.comparator_factory.inner_productc                 C  rC   )Nz<=>rD   rF   rH   r   r   r   cosine_distance	  rK   z)VECTOR.comparator_factory.cosine_distanceN)r
   r   r   rJ   rL   rM   r   r   r   r   comparator_factory  s    rN   )NN)r
   r   r   r   cache_ok__visit_name__r   r   r   r   r   rA   r6   r>   r@   r9   types
TypeEngine
ComparatorrN   r   r   r   r   r/      s    	
r/   )
__future__r   r7   dataclassesr   enumr   typingr   sqlalchemy.typesrQ   r   r   r   r   r   rR   r/   r   r   r   r   <module>   s   	P