U
    ]g%iz*                     @  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 d dl
mZ G dd	 d	e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ZG dd dejZdS )    )annotationsN)	dataclass)Enum)Optional)Union)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   `/var/www/html/api-medvista/venv/lib/python3.8/site-packages/sqlalchemy/dialects/oracle/vector.pyr      s   r   c                   @  s    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                   @  s    e Zd ZdZdZdZdZdZdS )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   H   s   r   c                   @  s   e Zd ZdZdZdZdS )VectorStorageTypez}Enum representing the vector type,

    See :ref:`oracle_vector_datatype` for background.

    .. versionadded:: 2.0.43

    SPARSEDENSEN)r   r   r   r   r   r   r   r   r   r   r   c   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 ]8}t| |}|d k	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'   r0   r   r   r   r   r   x   s   
2r   c                   @  s*   e Zd ZdZddddddZdd Zd	S )
SparseVectorz
    Lightweight SQLAlchemy-side version of SparseVector.
    This mimics oracledb.SparseVector.

    .. versionadded:: 2.0.43

    r*   zUnion[list, array.array]num_dimensionsindicesvaluesc                 C  sh   t |tjr|jdkr"td|}t |tjs:td|}t|t|krRtd|| _|| _|| _d S )NIdz.indices and values must be of the same length!)r)   arraytypecodelenr+   r4   r5   r6   )r-   r4   r5   r6   r   r   r   __init__   s    zSparseVector.__init__c                 C  s$   d| j  dt| j d| jj dS )NzSparseVector(num_dimensions=z, size=z, typecode=))r4   r;   r5   r6   r:   )r-   r   r   r   __str__   s    "zSparseVector.__str__N)r   r   r   r   r<   r>   r   r   r   r   r2      s   r2   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fr8   Nc                 C  sd   |dk	rt |tstd|dk	r4t |ts4td|dk	rNt |tsNtd|| _|| _|| _dS )a  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 should be Enum values form
         :class:`.VectorStorageFormat` INT8, BINARY, FLOAT32, or FLOAT64.

        :param storage_type: VectorStorageType. The Vector storage type. This
         should be Enum values from :class:`.VectorStorageType` SPARSE or
         DENSE.

        Nzdim must be an intergerz:storage_format must be an enum of type VectorStorageFormatz6storage_type must be an enum of type VectorStorageType)r)   r*   r+   r   r   dimstorage_formatstorage_type)r-   rC   rD   rE   r   r   r   r<      s&    
 
 zVECTOR.__init__c                   s    fdd}|S )z
        Converts a Python-side SparseVector instance into an
        oracledb.SparseVectormor a compatible array format before
        binding it to the database.
        c                   sj   | d kst | tjr| S t | tr>j}t|| } | S t | tr^ j| j| j| j	S t
dd S )Nz
                    Invalid input for VECTOR: expected a list, an array.array,
                    or a SparseVector object.
                    )r)   r9   list_array_typecoderD   r2   dbapir4   r5   r6   r+   )r/   r:   dialectr-   r   r   process(  s    

z.VECTOR._cached_bind_processor.<locals>.processr   )r-   rJ   rK   r   rI   r   _cached_bind_processor!  s    zVECTOR._cached_bind_processorc                   s    fdd}|S )a  
        Converts database-returned values into Python-native representations.
        If the value is an oracledb.SparseVector, it is converted into the
        SQLAlchemy-side SparseVector class.
        If the value is a array.array, it is converted to a plain Python list.

        c                   sF   | d krd S t | tjr t| S t |  jjrBt| j| j| jdS d S )Nr3   )r)   r9   rF   rH   r2   r4   r5   r6   )r/   rJ   r   r   rK   M  s    z0VECTOR._cached_result_processor.<locals>.processr   )r-   rJ   ZcoltyperK   r   rM   r   _cached_result_processorD  s    	zVECTOR._cached_result_processorc                 C  s   | j |dS )z7
        Map storage format to array typecode.
        r8   )_typecode_mapget)r-   r:   r   r   r   rG   ^  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  s   | j dtd|S )Nz<->return_typeopr   r-   otherr   r   r   l2_distancee  s    z%VECTOR.comparator_factory.l2_distancec                 C  s   | j dtd|S )Nz<#>rQ   rS   rU   r   r   r   inner_producth  s    z'VECTOR.comparator_factory.inner_productc                 C  s   | j dtd|S )Nz<=>rQ   rS   rU   r   r   r   cosine_distancek  s    z)VECTOR.comparator_factory.cosine_distanceN)r   r   r   rW   rX   rY   r   r   r   r   comparator_factoryd  s   rZ   )NNN)r   r   r   r   Zcache_okZ__visit_name__r   r   r   r   r   rO   r<   rL   rN   rG   types
TypeEngineZ
ComparatorrZ   r   r   r   r   r?      s"   	    
##r?   )
__future__r   r9   dataclassesr   enumr   typingr   r   Zsqlalchemy.typesr[   r   r   r   r   r   r   r2   r\   r?   r   r   r   r   <module>
   s   P!