o 3a@sRdZddlmZmZGdddeZGdddZGdddZGd d d Zd S) z] Useful auxiliary data structures for query construction. Not useful outside the SQL domain. )INNERLOUTERc@seZdZdZddZdS) MultiJoinz Used by join construction code to indicate the point at which a multi-valued join was attempted (if the caller wants to treat that exceptionally). cC||_||_dSN)levelnames_with_path)self names_pospath_with_namesr E/usr/lib/python3/dist-packages/django/db/models/sql/datastructures.py__init__s zMultiJoin.__init__N)__name__ __module__ __qualname____doc__rr r r r rs rc@s eZdZdS)EmptyN)rrrr r r r rsrc@s`eZdZdZ dddZddZddZed d Zd d Z d dZ ddZ ddZ ddZ dS)Joina Used by sql.Query and sql.SQLCompiler to generate JOIN clauses into the FROM entry. For example, the SQL generated could be LEFT OUTER JOIN "sometable" T1 ON ("othertable"."sometable_id" = "sometable"."id") This class is primarily used in Query.alias_map. All entries in alias_map must be Join compatible by providing the following attributes and methods: - table_name (string) - table_alias (possible alias for the table, can be None) - join_type (can be None for those entries that aren't joined from anything) - parent_alias (which table is this join's parent, can be None similarly to join_type) - as_sql() - relabeled_clone() NcCs8||_||_||_||_||_||_||_||_dSr) table_name parent_alias table_alias join_typeget_joining_columns join_cols join_fieldnullablefiltered_relation)r rrrrrrrr r r r)s  z Join.__init__c Cs*g}g}|j}|jj}|jD]\}}|d||j||||j||fq|j|j j |j|j} | rI| | \} } |d| | | |j rb| |j \} } | rb|d| | | |sst|jd|j} td| jd|} |j|jkrdnd|j}d|j||j|| f}||fS) z Generate the full LEFT OUTER JOIN sometable ON sometable.somecol = othertable.othercol, params clause for this join. z %s.%s = %s.%sz(%s)fieldzaJoin generated an empty ON clause. %s did not yield either joining columns or extra restrictions.z AND  %sz%s %s%s ON (%s))quote_name_unless_aliasops quote_namerappendrrrget_extra_restrictionquery where_classcompileextendrgetattr ValueError __class__joinrr)r compiler connectionjoin_conditionsparamsqnqn2lhs_colrhs_col extra_cond extra_sql extra_paramsdeclared_field on_clause_sql alias_strsqlr r r as_sql;sD     z Join.as_sqlc sr|j|j}|j|j}|jdur'|j}fdd|jjD|_nd}|j|j|||j|j |j |dS)Ncsg|]}||qSr )get).0p change_mapr r msz(Join.relabeled_clone..)r) r>rrrclonepathr,rrrr)r rBnew_parent_aliasnew_table_aliasrr rAr relabeled_clonehs    zJoin.relabeled_clonecCs|j|j|j|j|jfSr)r,rrrrr r r r identityus z Join.identitycCt|tstS|j|jkSr) isinstancerNotImplementedrJr otherr r r __eq__  z Join.__eq__cC t|jSrhashrJrIr r r __hash__ z Join.__hash__cCs(|r||kS|jdd|jddkS)NrJr rOwith_filtered_relationr r r equalssz Join.equalscC|i}t|_|Sr)rHrrr newr r r demote z Join.demotecCr\r)rHrrr]r r r promoter`z Join.promoter)rrrrrr=rHpropertyrJrPrUr[r_rar r r r rs -   rc@sXeZdZdZdZdZdZddZddZddZ e d d Z d d Z d dZ ddZdS) BaseTablez The BaseTable class is used for base table references in FROM clause. For example, the SQL "foo" in SELECT * FROM "foo" WHERE somecond could be generated by this class. NcCrr)rr)r raliasr r r rs zBaseTable.__init__cCs2|j|jkrdnd|j}||j}||gfS)Nrr )rrr!)r r.r/r;base_sqlr r r r=s  zBaseTable.as_sqlcCs||j||j|jSr)r,rr>r)r rBr r r rHszBaseTable.relabeled_clonecCs|j|j|jfSr)r,rrrIr r r rJszBaseTable.identitycCrKr)rLrcrMrJrNr r r rPrQzBaseTable.__eq__cCrRrrSrIr r r rUrVzBaseTable.__hash__cCs |j|jkSrrXrYr r r r[s zBaseTable.equals)rrrrrrrrr=rHrbrJrPrUr[r r r r rcs  rcN) rdjango.db.models.sql.constantsrr Exceptionrrrrcr r r r s