o 3a,@sddlmZmZddlmZmZmZmZmZddl m Z ddl m Z ddl mZddlmZdgZGdddZGd d d eZd S) ) names_digestsplit_identifier)ColExpressionListFFuncOrderByCollate)Q)Query) partitionIndexc@szeZdZdZdZdddddddddZedd Zd d Zdd dZ ddZ ddZ ddZ ddZ ddZddZdS)ridxN)fieldsname db_tablespace opclasses conditionincludecGsn|r|stdt|tdtfstd|r|stdt|ttfs(tdt|ttfs3td|s;|s;td|rC|rCtd|rK|sKtd|rS|rStd |rat|t|kratd |rptd d |Dsptd |rx|sxtdt|tdttfstdt||_dd|jD|_ |pd|_ ||_ ||_ ||_ |rt|nd|_tdd |D|_dS)Nz(An index must be named to use opclasses.z%Index.condition must be a Q instance.z(An index must be named to use condition.z%Index.fields must be a list or tuple.z(Index.opclasses must be a list or tuple.z@At least one field or expression is required to define an index.z4Index.fields and expressions are mutually exclusive.z*An index must be named to use expressions.zgIndex.opclasses cannot be used with expressions. Use django.contrib.postgres.indexes.OpClass() instead.zGIndex.fields and Index.opclasses must have the same number of elements.css|]}t|tVqdSN) isinstancestr).0fieldrr:/usr/lib/python3/dist-packages/django/db/models/indexes.py 7z!Index.__init__..z8Index.fields must contain only strings with field names.zA covering index must be named.z&Index.include must be a list or tuple.cSs.g|]}|dr|dddfn|dfqS)-NDESC) startswithr field_namerrr ?s z"Index.__init__..r#rcss&|]}t|tr t|n|VqdSr)rrrr expressionrrrrHs  ) ValueErrorrtyper listtuplelenallr fields_ordersrrrrr expressions)selfrrrrrrr1rrr__init__sX   zIndex.__init__cCs t|jSr)boolr1r2rrrcontains_expressionsM zIndex.contains_expressionscs`|jdurdSt|dd}||j}|jjd}||j\}}|tfdd|DS)NF)model alias_cols) connectionc3s|]}|VqdSr) quote_value)rp schema_editorrrrXrz+Index._get_condition_sql..)rr build_where get_compilerr:as_sqlr-)r2r8r>querywherecompilersqlparamsrr=r_get_condition_sqlQs   zIndex._get_condition_sqlr#c sfdd|jD}||}|jr:g}|jD]}t|} | |j|| qt|t dd} d} d} nfdd|j D} dd|j D} d} |j f| |j ||j | |j||| d |S)Ncsg|] }j|jqSr_meta get_fieldcolumnr%r8rrr'[sz$Index.create_sql..F)r9csg|] \}}j|qSr)rIrJ)rr&_rLrrr'is cSsg|]}|dqS)r!r)rorderrrrr'm) rrusingr col_suffixesrrrr1)rrGr1IndexExpressionset_wrapper_classesr:appendrresolve_expressionr r0_create_index_sqlrrr) r2r8r>rPkwargsrrindex_expressionsr)index_expressionr1rrQrrLr create_sqlZs8      zIndex.create_sqlcKs|j||jfi|Sr)_delete_index_sqlr)r2r8r>rWrrr remove_sqlvszIndex.remove_sqlcCsd|jj|jjf}|dd}d|ji}|jr|j|d<|jdur'|j|d<|jr/|j|d<|jr7|j|d<|j r?|j |d <||j |fS) Nz%s.%szdjango.db.models.indexeszdjango.db.modelsrrrrrr) __class__ __module____name__replacerrrrrrr1)r2pathrWrrr deconstructys         zIndex.deconstructcCs|\}}}|j|i|S)zCreate a copy of this Index.)rbr])r2rMargsrWrrrclonesz Index.clonecstjj\}}fdd|jD}ddt||jD}|g||jg}d|dd|dddd t|d d i|jff|_t|j|j ksNJd |jdd ks\|jd rhd|jdd|_dSdS)a Generate a unique name for the index. The name is divided into 3 parts - table name (12 chars), field name (8 chars) and unique hash + suffix (10 chars). Each part is made to fit its size by truncating the excess length. csg|] \}}j|jqSrrH)rr&rNrLrrr'sz-Index.set_name_with_model..cSs$g|]\}\}}|r dnd|qS)z-%sz%sr)r column_namer&rNrrrr's z%s_%s_%sN rz%s_%slengthzVIndex too long for multiple database support. Is self.suffix longer than 3 characters?rMzD%sr!) rrIdb_tabler0zipsuffixrrr.max_name_lengthisdigit)r2r8rM table_name column_namescolumn_names_with_order hash_datarrLrset_name_with_models"  zIndex.set_name_with_modelc Csd|jj|js dndd|j|jsdn dddd|jD|jdur(dnd|j|js1dnd d|j|js?dfSd d|jfS) Nz<%s:%s%s%s%s%s>r#z fields='%s', z expressions='%s'cSg|]}t|qSr)rr(rrrr'sz"Index.__repr__..z condition=%sz include='%s'z opclasses='%s')r]r_rjoinr1rrrr5rrr__repr__szIndex.__repr__cCs |j|jkr||kStSr)r]rbNotImplemented)r2otherrrr__eq__s z Index.__eq__)r#)r_r^ __qualname__rlrmr3propertyr6rGrZr\rbrdrsrwrzrrrrr s( <   csVeZdZdZdZeefZdddZe ddZ    dfd d Z d d Z Z S)rRz7Order and wrap expressions for CREATE INDEX statements.z%(expressions)sNcCs.|r|jjrtdd|jD|_dSdSdS)NcSsg|]}|tur|qSrr r wrapper_clsrrrr's z7IndexExpression.set_wrapper_classes..)featurescollate_as_index_expressionr-wrapper_classes)r2r:rrrrSs z#IndexExpression.set_wrapper_classescGs ||_dSr)r)clsrrrrregister_wrappersr7z!IndexExpression.register_wrappersTFcs^t}tfdd|\}}dd|D} t| tt| kr1tddddjD|dt|d|krLtd dd djD|d} | |||||} t | t sdt | d d } |rt |fd dd}dd|D}t |ddD]\} } | || dgq|d| g|dgn| gt|||||S)Ncs t|jSr)rr)er5rrs z4IndexExpression.resolve_expression..cSrur)r+rwrapperrrrr'rOz6IndexExpression.resolve_expression..zAMultiple references to %s can't be used in an indexed expression.rtcSg|]}|jqSrr{r}rrrr'r!z8%s must be topmost expressions in an indexed expression.cSrrrr}rrrr'rz(%(expressions)s))templatecsjt|Sr)rindexr+)wr5rrrs)keycSsg|]}|qSr)copyrrrrr'rOr)r,flattenr r.setr*rvrrUrrrsorted enumerateset_source_expressionssuper)r2rB allow_joinsreuse summarizefor_saver1rXwrappers wrapper_typesroot_expressionresolve_root_expressionirr]r5rrUsX        z"IndexExpression.resolve_expressioncKs|j||fi|Sr)rA)r2rDr: extra_contextrrr as_sqlite szIndexExpression.as_sqliter)NTNFF)r_r^r{__doc__rrr rrS classmethodrrUr __classcell__rrrrrRs  :rRN)django.db.backends.utilsrrdjango.db.models.expressionsrrrrrdjango.db.models.functionsr django.db.models.query_utilsr django.db.models.sqlr django.utils.functionalr __all__rrRrrrrs    3