
    >                     |   S 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\R0                  R2                  4S jr\R6                  " 5       R8                  R:                  R<                  r\R6                  " 5       R8                  R:                  R>                  r\R6                  " 5       R@                  RB                  RD                  r#\R6                  " 5       R@                  RB                  RH                  r$\R6                  " 5       R@                  RJ                  RL                  r&\
R6                  " 5       RN                  RP                  RR                  r*\
R6                  " 5       RN                  RV                  RX                  r,\
R6                  " 5       RN                  RV                  RZ                  r-\
R6                  " 5       R\                  R^                  R<                  r0\
R6                  " 5       R\                  R^                  R>                  r1S\R@                  S\\2\Rf                  4   4S jr4S r5S\2S\\2\24   4S jr6S\RN                  S\\2\Rf                  4   4S jr7S\R@                  RB                  S\2S\2S\\Rp                     S\R@                  4
S jr9 S1S\2S\:S\\Rp                     S\:S\RN                  4
S jjr;S\:S\2S\\\2\24      S\Rf                  4S jr<S\\Rf                     S\\Rf                     4S  jr=S!\Rf                  S\Rf                  4S" jr>S\\Rf                     S\\Rf                     4S# jr?S!\Rf                  S\Rf                  4S$ jr@S\2S\\Rf                     4S% jrAS\2S&\2S\\Rf                     4S' jrBS\2S(\\Rf                     SS4S) jrCS\2S&\2S(\\Rf                     S\:SS4
S* jrDS\2S+\\2   SS4S, jrES\2S&\2S+\\2   SS4S- jrFS\2S.\R                  SS4S/ jrHS\2S&\2S.\R                  S\:SS4
S0 jrIg)2z8Utilities for Cloud Datastore index management commands.    N)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,   S   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   
_Fullmatchr4   e   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/([^/]*)$r1   zInvalid resource path: {}      )r4   
ValueErrorformatgroup)r5   index_name_patternr0   s      r   &CollectionIdAndIndexIdFromResourcePathr=   j   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VectorConfigr?   VectorFlatIndexorderFIRESTORE_DESCENDINGr"   r$   r=   r   r%   apiScopeDATASTORE_API_SCOPEr9   r:   
queryScopeCOLLECTION_RECURSIVEr&   COLLECTION_GROUP)r   r   field_protor*   collection_idindex_idr+   s          r   $FirestoreApiMessageToIndexDefinitionrP      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   rC   r9   r"   	ASCENDINGr#   r$   r   )	r&   r   rQ   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_utilsrS   GoogleFirestoreAdminV1Indexr   rK   rL   rJ   rI   rH    GoogleFirestoreAdminV1IndexFieldrB   rC   r
   InvalidArgumentException"GoogleFirestoreAdminV1VectorConfigr?   GoogleFirestoreAdminV1FlatIndexr@   r"   FIRESTORE_ASCENDINGrF   rG   r$   rA   )	r   r^   r   r_   rZ   r   rA   r\   rM   s	            r   BuildIndexFirestoreProtorh      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&   )r^   r   r   r\   r+   s        r   
BuildIndexrk      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   NormalizeIndexesForDatastoreApirq     /     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 $ )rm   __key____name__r   r   r   r"   pop)r+   s    r   rn   rn     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.)NormalizeIndexForFirestoreApiro   rp   s     r   NormalizeIndexesForFirestoreApir}     rr   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{   rv   rw   rt   ru   r   rx   )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.)rU   )r   Listr   rS   #DatastoreProjectsIndexesListRequestr   r,   )rQ   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   rH   rI   rP   )rQ   r   r   r+   s       r   #ListDatastoreIndexesViaFirestoreApir   E  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>b      >r   autotickdetail_message_callback)r   rQ   r   rj   {0:.0%})r   ProgressTrackerr   Creater]   r&   ALL_ANCESTORSr'   r   r   r:   lenTick)rQ   r   cntptr+   r   s        @r   CreateIndexesViaDatastoreApir   Z  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   r^   r   r_   r   )r   r   	enumerater   CreateIndexr   rh   r&   r   r:   r   r   )rQ   r   r   r_   r   ir+   r   s          @r   CreateIndexesViaFirestoreApir   r  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   )rU   r(   rj   r   )
r   r   r   Deleter   rS   %DatastoreProjectsIndexesDeleteRequestr:   r   r   )rQ   r   r   r   rO   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   rj   r   )r   r   r   r   DeleteIndexr:   r   )rQ   r   r   r   
delete_cntr   rO   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   rq   r   r   )rQ   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.)rQ   r   r   r_   N)r   r}   r   r   )
rQ   r   r   r_   existing_indexesr   r+   existing_indexes_normalizedr   r   s
             r   #CreateMissingIndexesViaFirestoreApir     so     9
 !@-.-u-.! 7 #@+#!	 /s   A
)T)J__doc__r/   typingr   r   r    googlecloudsdk.api_lib.datastorer    googlecloudsdk.api_lib.firestorer   ra   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   rS   rX   DirectionValueValuesEnumrY   r#   rT   AncestorValueValuesEnumNONEr'   r   StateValueValuesEnumrV   rb   ApiScopeValueValuesEnumDATASTORE_MODE_APIrI   QueryScopeValueValuesEnumrL   rK   rc   OrderValueValuesEnumrg   rG   r!   r%   r,   r4   r=   rP   r    r]   boolrh   rk   rq   rn   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   