
    >                        S r SSKJr  SSKJr  SSKJr  SSKrSSKJrJrJ	r	  SSK
Jr  SSKJr  SS	KJr  SS
KJr  SSKJr  SSKJr  SSKJr  SSKJr  SSKJr  S\R8                  R:                  4S jr\R>                  " 5       R@                  RB                  RD                  r"\R>                  " 5       R@                  RB                  RF                  r#\R>                  " 5       RH                  RJ                  RL                  r'\R>                  " 5       RH                  RJ                  RP                  r(\R>                  " 5       RH                  RR                  RT                  r*\R>                  " 5       RV                  RX                  RZ                  r.\R>                  " 5       RV                  R^                  R`                  r0\R>                  " 5       RV                  R^                  Rb                  r1\R>                  " 5       Rd                  Rf                  RD                  r4\R>                  " 5       Rd                  Rf                  RF                  r5S\RH                  S\	\6\Rn                  4   4S jr8S r9S\6S\	\6\64   4S jr:S\RV                  S\	\6\Rn                  4   4S jr;S\RH                  RJ                  S\6S\6S\\Rx                     S\RH                  4
S jr= S4S\6S\>S\\Rx                     S\>S\RV                  4
S  jjr?S\>S\6S\\	\6\64      S\Rn                  4S! jr@S"\\Rn                     S\\Rn                     4S# jrAS$\Rn                  S\Rn                  4S% jrBS"\\Rn                     S\\Rn                     4S& jrCS$\Rn                  S\Rn                  4S' jrDS\6S\\Rn                     4S( jrES\6S)\6S\\Rn                     4S* jrFS\6S+\\Rn                     SS4S, jrGS\6S)\6S+\\Rn                     S\>SS4
S- jrHS\6S.\\6   SS4S/ jrIS\6S)\6S.\\6   SS4S0 jrJS\6S1\R                  SS4S2 jrLS\6S)\6S1\R                  S\>SS4
S3 jrMg)5z8Utilities for Cloud Datastore index management commands.    )absolute_import)division)unicode_literalsN)SequenceSetTuple)util)	api_utils)indexes)datastore_index)
exceptions)progress_tracker)datastore_v1_client)datastore_v1_messages)firestore_v1_messagesreturnc                  @    [         R                  " 5       R                  $ )zReturns the service for interacting with the Datastore Admin Service.

This is used to manage the datastore indexes (create/delete).
)r	   	GetClientprojects_indexes     1lib/googlecloudsdk/api_lib/datastore/index_api.pyGetIndexesServicer   #   s     
		*	**r   protoc                    / nU R                    H^  n[        R                  " [        UR                  5      S9nUR
                  [        :X  a  SUl        OSUl        UR                  U5        M`     [        R                  " [        U R                  5      US9nU R                  [        La  SUl
        U R                  U4$ )zHConverts a GoogleDatastoreAdminV1Index to an index definition structure.namedescasckind
propertiesT)r"   r   Propertystrr   	direction
DESCENDINGappendIndexr!   ancestorNO_ANCESTORindexId)r   r"   
prop_protoprop_definitionindexs        r   ApiMessageToIndexDefinitionr/   V   s     *$$j%..C
4HIOz)"(o"'oo& % 

S_
L%
^^;&EN		r   c                 :    [         R                  " SU -   S-   USS9$ )z"Emulate python-3.4 re.fullmatch().z(?:z)\Zr   )flags)rematchregexstrings     r   
_Fullmatchr7   h   s    	%%-&(&	::r   resource_pathc                     Sn[        XS9nU(       d  [        SR                  U 5      5      eUR                  S5      UR                  S5      4$ )a  Extracts collectionId and indexId from a collectionGroup resource path.

Args:
  resource_path: A str to represent firestore resource path contains
    collection group. ex: projects/p/databases/d/collectionGroups/c/indexes/i.

Returns:
  collection_id: A str to represent the collection id in the resource path.
  index_id: A str to represent the index id in the resource path.

Raises:
  ValueError: If the resource path is invalid.
zM^projects/([^/]*)/databases/([^/]*)/collectionGroups/([^/]*)/indexes/([^/]*)$r4   zInvalid resource path: {}      )r7   
ValueErrorformatgroup)r8   index_name_patternr3   s      r   &CollectionIdAndIndexIdFromResourcePathr@   m   sK      g
-
D%	
077F
GG	QQ	''r   c                    / nU R                    H  n[        R                  " [        UR                  5      S9nUR
                  bB  [        R                  " UR
                  R                  [        R                  " 5       S9Ul        O#UR                  [        :X  a  SUl        OSUl        UR                  U5        M     [        U R                  5      u  pE[        R                  " [        U5      US9nU R                   ["        :w  a$  [%        SR'                  U R                   5      5      eU R(                  [*        :X  a
  SUl        XV4$ U R(                  [.        :X  a
  SUl        XV4$ [%        S	R'                  U R(                  5      5      e)
am  Converts a GoogleFirestoreAdminV1Index to an index definition structure.

Args:
  proto: GoogleFirestoreAdminV1Index

Returns:
  index_id: A str to represent the index id in the resource path.
  index: A datastore_index.Index that contains index definition.

Raises:
  ValueError: If GoogleFirestoreAdminV1Index cannot be converted to index
  definition structure.
r   )	dimensionflatr   r   r    zInvalid api scope: {}TFzInvalid query scope: {})fieldsr   r#   r$   	fieldPathvectorConfigVectorConfigrB   VectorFlatIndexorderFIRESTORE_DESCENDINGr%   r'   r@   r   r(   apiScopeDATASTORE_API_SCOPEr<   r=   
queryScopeCOLLECTION_RECURSIVEr)   COLLECTION_GROUP)r   r"   field_protor-   collection_idindex_idr.   s          r   $FirestoreApiMessageToIndexDefinitionrS      sO     *\\k%..C8M8M4NOO+%4%A%A,,66..0&o" 
		2	2"(o"'oo& " C5::N-


S%7J
O%
^^**
,33ENNC
DD
--EN 
 ++EN 
 .55e6F6FG
HHr   r)   r!   
project_idr"   c                    [         R                  " 5       nUR                  5       nX%l        Xl        Xl        [        Ul        / nU Ht  nUR                  5       nUR                  Ul	        UR                  b  [        S5      eUR                  S:X  a  [        Ul        O[        Ul        UR                  U5        Mv     Xel        U$ )z1Builds and returns a GoogleDatastoreAdminV1Index.z<Vector Indexes cannot be created via the Datastore Admin APIr   )r	   GetMessagesGoogleDatastoreAdminV1Index	projectIdr!   r)   CREATINGstate%GoogleDatastoreAdminV1IndexedPropertyr   rF   r<   r%   	ASCENDINGr&   r'   r"   )	r)   r!   rT   r"   messagesr   propspropr,   s	            r   BuildIndexProtor`      s     (

.
.
0%/*.%+
%d??AJiiJO$
H  ~~&j'j	LL  	,r   r   is_ancestorenable_vectorc                    [         R                  " 5       nUR                  5       nXl        U(       a  [        O[
        Ul        [        Ul        / nU H  nUR                  5       nUR                  Ul
        UR                  bx  U(       d  [        R                  " SS5      eUR                  5       Ul        UR                  R                  UR                  l        UR!                  5       UR                  l        O'UR$                  S:X  a  [&        Ul        O[*        Ul        UR-                  U5        M     Xel        U$ )z1Builds and returns a GoogleFirestoreAdminV1Index.z
index.yamlz>Vector Indexes are currently only supported in the Alpha Trackr   )firestore_utilsrV   GoogleFirestoreAdminV1Indexr   rN   rO   rM   rL   rK    GoogleFirestoreAdminV1IndexFieldrE   rF   r   InvalidArgumentException"GoogleFirestoreAdminV1VectorConfigrB   GoogleFirestoreAdminV1FlatIndexrC   r%   FIRESTORE_ASCENDINGrI   rJ   r'   rD   )	r   ra   r"   rb   r]   r   rD   r_   rP   s	            r   BuildIndexFirestoreProtork      s    ((*(

.
.
0%*-8)>N%&%.&d;;=K IIK$11L
 	
 "*!L!L!Nk+/+<+<+F+Fk(&.&N&N&Pk#	5	 -k.k
MM+! " ,	,r   c                     [         R                  " [        U5      U Vs/ s H'  n[         R                  " [        US   5      US   S9PM)     snS9nXl        U$ s  snf )z;Builds and returns a datastore_index.Index YAML rep object.r      )r   r%   r    )r   r(   r$   r#   r)   )ra   r!   r"   r_   r.   s        r   
BuildIndexrn      sb     

t9 ! d 
"
"DGQ
H % .	,s   .A
r   c                 h    U =(       d    / n U =(       d    /  H  n[        U5        M     [        U 5      $ )HRemoves the last index property if it is __key__:asc which is redundant.)NormalizeIndexForDatastoreApisetr   r.   s     r   NormalizeIndexesForDatastoreApirt     /     Mr'}"}e!%( 	Wr   r.   c                     U R                   (       aT  U R                   S   R                  S;   a7  U R                   S   R                  S:X  a  U R                   R                  5         U $ )rp   __key____name__r   r"   r   r%   pop)r.   s    r   rq   rq     sY    
  

2

#
#'>
>


2

(
(E
1		,r   c                 h    U =(       d    / n U =(       d    /  H  n[        U5        M     [        U 5      $ )IRemoves the last index property if it is __name__:asc which is redundant.)NormalizeIndexForFirestoreApirr   rs   s     r   NormalizeIndexesForFirestoreApir     ru   r   c                 (   U R                    H  nUR                  S:X  d  M  SUl        M     U R                   (       aT  U R                   S   R                  S;   a7  U R                   S   R                  S:X  a  U R                   R                  5         U $ )r~   ry   rz   rw   rx   r   r{   )r.   r_   s     r   r   r   '  s~     dyyIdi   

2

#
#'>
>


2

(
(E
1		,r   c                     [        5       R                  [        R                  " 5       R	                  U S95      nUR
                   Vs1 s H  n[        U5      iM     sn$ s  snf )zFLists all datastore indexes under a database with Datastore Admin API.)rX   )r   Listr	   rV   #DatastoreProjectsIndexesListRequestr   r/   )rT   responser.   s      r   ListIndexesr   >  s]     %%
<< = (
 ;C:J:J	K:J
%e
,:J	KK	Ks   A database_idc                     [         R                  " X5      nUR                   Vs1 s H$  nUR                  [        :X  d  M  [        U5      iM&     sn$ s  snf )a  Lists all datastore indexes under a database with Firestore Admin API.

Args:
  project_id: A str to represent the project id.
  database_id: A str to represent the database id.

Returns:
  List[index]: A list of datastore_index.Index that contains index definition.
)firestore_indexesr   r   rK   rL   rS   )rT   r   r   r.   s       r   #ListDatastoreIndexesViaFirestoreApir   H  sV     **:C( ##
#%	.	. 2*51#
  
s   AAindexes_to_createc                   ^ SnSm[         R                  " SSU4S jS9 nU H  n[        5       R                  [	        UR
                  (       a  [        O[        UR                  U UR                  S95        US-   nS	R                  U[        U5      -  5      mUR                  5         M     SSS5        g! , (       d  f       g= f)
z>Sends the index creation requests via the Datastore Admin API.r   N.Fc                     > T $ Nr   detail_messages   r   <lambda>.CreateIndexesViaDatastoreApi.<locals>.<lambda>e      >r   autotickdetail_message_callback)r!   rT   r"   rm   {0:.0%})r   ProgressTrackerr   Creater`   r)   ALL_ANCESTORSr*   r!   r"   r=   lenTick)rT   r   cntptr.   r   s        @r   CreateIndexesViaDatastoreApir   ]  s    
 	
#.''	E3I	"  
$~~m;::#))	 !Gc ''c2C.D(DEnggi #  s   BB77
Cc                 v  ^ Sm[         R                  " SSU4S jS9 n[        U5       Hs  u  pV[        R                  " U UUR
                  [        SUR                  UR                  US95        SR                  U[        U5      -  5      mUR                  5         Mu     SSS5        g! , (       d  f       g= f)z>Sends the index creation requests via the Firestore Admin API.Nr   Fc                     > T $ r   r   r   s   r   r   .CreateIndexesViaFirestoreApi.<locals>.<lambda>~  r   r   r   )r   ra   r"   rb   r   )r   r   	enumerater   CreateIndexr!   rk   r)   r"   r=   r   r   )rT   r   r   rb   r   ir.   r   s          @r   CreateIndexesViaFirestoreApir   u  s     .''	E3I	/0##


**
"..)))		
 !''C0A,B(BCnggi 1  s   BB**
B8indexes_to_delete_idsc           	      ^  ^ SnSm[         R                  " SSU4S jS9 nU Hn  n[        5       R                  [        R
                  " 5       R                  XS95        US-   nS	R                  U[        U5      -  5      mUR                  5         Mp     SSS5        g! , (       d  f       g= f)
z>Sends the index deletion requests via the Datastore Admin API.r   Nr   Fc                     > T $ r   r   r   s   r   r   DeleteIndexes.<locals>.<lambda>      nr   r   )rX   r+   rm   r   )
r   r   r   Deleter	   rV   %DatastoreProjectsIndexesDeleteRequestr=   r   r   )rT   r   r   r   rR   r   s        @r   DeleteIndexesr     s    
 	
#.''	4 
)  




B
B" C 
 !Gc ''c2G.H(HInggi *  s   A5B
B,c                   ^ SnSm[        U5      n[        R                  " SSU4S jS9 nU HB  n[        R                  " XU5        US-   nSR                  X4-  5      mUR                  5         MD     SSS5        g! , (       d  f       g= f)	z>Sends the index deletion requests via the Firestore Admin API.r   Nr   Fc                     > T $ r   r   r   s   r   r   .DeleteIndexesViaFirestoreApi.<locals>.<lambda>  r   r   r   rm   r   )r   r   r   r   DeleteIndexr=   r   )rT   r   r   r   
delete_cntr   rR   r   s          @r   DeleteIndexesViaFirestoreApir     s     	
#.()*''	4 
)##JXF!Gc ''(89nggi	 *  s   A	A==
Bindex_definitionsc                     [        U 5      n[        UR                  5      nX2 VVs1 s H  u  pEUiM	     snn-
  n[        X5        gs  snnf )z>Creates the indexes if the index configuration is not present.N)r   rt   r   r   )rT   r   r   normalized_indexes_r.   new_indexess          r   #CreateMissingIndexesViaDatastoreApir     sM    
 
#'6 #G%DGeG%DD+z7 &Es   Ac                     [        X5      n[        U VVs/ s H  u  pVUPM	     snn5      n[        UR                  5      nX-
  n	[        U UU	US9  gs  snnf )zPCreates the indexes via Firestore API if the index configuration is not present.)rT   r   r   rb   N)r   r   r   r   )
rT   r   r   rb   existing_indexesr   r.   existing_indexes_normalizedr   r   s
             r   #CreateMissingIndexesViaFirestoreApir     so     9
 !@-.-u-.! 7 #@+#!	 /s   A
)T)N__doc__
__future__r   r   r   r2   typingr   r   r    googlecloudsdk.api_lib.datastorer	    googlecloudsdk.api_lib.firestorer
   rd   r   r   "googlecloudsdk.appengine.datastorer   googlecloudsdk.callioper   googlecloudsdk.core.consoler   2googlecloudsdk.generated_clients.apis.datastore.v1r   r   2googlecloudsdk.generated_clients.apis.firestore.v1r   DatastoreV1ProjectsIndexesServicer   rV   r[   DirectionValueValuesEnumr\   r&   rW   AncestorValueValuesEnumNONEr*   r   StateValueValuesEnumrY   re   ApiScopeValueValuesEnumDATASTORE_MODE_APIrL   QueryScopeValueValuesEnumrO   rN   rf   OrderValueValuesEnumrj   rJ   r$   r(   r/   r7   r@   rS   r#   r`   boolrk   rn   rt   rq   r   r   r   r   r   r   r   r   IndexDefinitionsr   r   r   r   r   <module>r      s   ? &  ' 	 ' ' 1 I I > . 8 R T T+##::+ 	<<UU__ 

 	<<UU`` 
 	22JJOO 
 	22JJXX 
 	22GGPP 	
 !==UUhh 
 !==WWhh 
 !==WWll 
 !BBWWaa 
 !BBWWbb 
 <<
3%%%&$;
((
38_(0* <<*
3%%%&*Z#??WW
  112	
 66D 	 
   112  	 
 66 F
 sCx) 	"o++,		  o++,		  .LC LH_-B-B$C L o##$* 5 56 
0   5 56 	
 
6#C= 
. $C= 
	*
8
8&77
8 

8 '77 	
 
r   