
    -i                    ~   d dl Z d dlZd dlZd dlZd dlZd dlmZ d dlmZ d dl	m
Z
mZmZmZmZ d dlmZmZ  ej        d          rd dlmZ  ej        ed                    ej        Zeed<   d Zd	Zd Zd	Z G d
 de          Z G d de
          Z G d de          Z G d de          Z G d de          Z dS )    N)cdb_environment)
IU_Storage)IndexIndexExceptionDocIdNotFoundElemNotFoundTryReindexException)	cache1lvl	cache2lvl	rlock_obj)patchtree_buffer_size   c                       e Zd ZdS )NodeCapacityExceptionN__name__
__module____qualname__     U/var/www/html/speakWrite/venv/lib/python3.11/site-packages/codernitydb3/tree_index.pyr   r   .           Dr   r   c                   X    e Zd ZdZdZdZ	 	 	 	 	 d] fd		Zd
 Zd Z fdZ	d Z
d Zd^dZd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd  Zd! Zd" Zd# Z d$ Z!	 	 	 d_d&Z"	 	 	 d_d'Z#d( Z$d) Z%d* Z&d+ Z'd, Z(d- Z)d^d.Z*	 d^d/Z+d0 Z,d1 Z-d2 Z.d3 Z/d4 Z0d5 Z1d6 Z2	 d`d7Z3d8 Z4	 d^d9Z5d: Z6	 d`d;Z7d< Z8d= Z9d> Z:d? Z;d@ Z<dA Z=dB Z>dC Z?dD Z@dadFZAdbdGZBdcdIZCdcdJZDdcdKZEdcdLZFdcdMZGdN ZHdO ZIdcdPZJ	 	 	 	 dddRZKdedTZLdU ZMdV ZNdW ZOdX ZPdfdYZQ fdZZRd[ ZS fd\ZT xZUS )gIU_TreeBasedIndexz2from codernitydb3.tree_index import TreeBasedIndex   l   n32sI32sIIc
   Nc                 X   |dk     rt           t          t          |                               ||           | j        dz   | _        || _        d| _        d| _        || _	        || _
        || _        |                                  |st          }|rt          |t                    s|j        }|| _        d | _        t'          d          }t)          d          }	 || j                  | _         || j                  | _         |	| j                  | _         |	| j                  | _         |	| j                  | _         |	| j                  | _         || j                  | _         || j                  | _         || j                  | _         || j                  | _        d S )N   r   chd      )r   superr   __init__
_start_ind
data_startnode_capacityflag_formatelements_counter_formatpointer_format
key_formatmeta_format_count_propsr   
isinstancestrr   storage_classstorager
   r   	_find_key_match_doc_id_find_key_in_leaf_read_single_node_key!_find_first_key_occurence_in_node _find_last_key_occurence_in_node_read_leaf_nr_of_elements_read_leaf_neighbours(_read_leaf_nr_of_elements_and_neighbours+_read_node_nr_of_elements_and_children_flag)selfdb_pathnamer0   r/   r1   r,   r5   cachetwolvl_cache	__class__s             r   r)   zIU_TreeBasedIndex.__init__9   s    1''&&//>>>/A-*'*$,$& 	'&M 	3M3!?!? 	3)2M*# ~~t~.."U4#566 ".d.D!E!E%1\$2L%M%M"1=224 24.0<113 13-).t/M)N)N&%*U4+E%F%F"8=99; 9;5;@5<<> <>888r   c                 H   | j         | j        z   | _        | j        | j         z   | j        z   | _        | j        | j        z   | j        z   | j         | j        z   | j        z  z   | _        | j        | j        dz  z   | j        | j        z  z   | _	        | j        | j        dz  z   | _
        | j        | j        z   | _        t          j        d| j         z             | _        t          j        d| j        z             | _        t          j        d| j        z             | _        t          j        d| j        z             | _        t          j        d| j        z             | _        t          j        d| j	        z             | _        t          j        d| j        z             | _        t          j        d| j        z             | _        t          j        d| j        z             | _        t          j        d| j
        z             | _        t          j        d| j        z             | _        dS )zQ
        Counts dynamic properties for tree, such as all complex formats
           <N)r0   r1   single_leaf_record_formatr/   single_node_record_formatr.   r-   r,   node_formatleaf_formatleaf_heading_formatnode_heading_formatstructcalcsizekey_size	meta_sizesingle_leaf_record_sizesingle_node_record_size	node_size	leaf_size	flag_sizeelements_counter_sizepointer_sizeleaf_heading_sizenode_heading_sizerA   s    r   r2   zIU_TreeBasedIndex._count_propse   s    *.4;K)K&)-)<O*"1*2&7$:JJ!"%)_%)%8&9<@<N%OO  7$:MPQ:QQ-1CCD#'#?!#$$ #'#?$ do(=>>t/?)?@@'-$00(2 (2$'-$00(2 (2$t/?)?@@t/?)?@@t/?)?@@%+_$..&0 &0""OC$2E,EFF!'151I2J "K "K!'151I2J "K "Kr   c                    t           j                            t           j                            | j        | j        dz                       rt          d          t          j        t           j                            | j        | j        dz             d          5 }t          | j        | j
        | j        | j        | j        | j        | j        | j        | j        	  	        }|                    t'          j        |                     d d d            n# 1 swxY w Y   t          j        t           j                            | j        | j        dz             dd          | _        |                                  | j                            | j                   | j                            t3          j        d| j                             |                                  | j        | _        d S )	N_buckzAlready existszw+b)	rC   r-   r/   r.   r,   r0   r1   versionr5   r+br   	buffering<c)ospathisfilejoinrB   rC   r   ioopendictr-   r/   r.   r,   r0   r1   __version__r5   writemarshaldumpsbuckets_create_storageseekr*   rP   pack	TYPE_LEAF_insert_empty_root	root_flag)rA   fpropss      r   create_indexzIU_TreeBasedIndex.create_index   s   7>>"',,t|TY5HIIJJ 	3 !1222WRW\\$,	G0CDD  	* di%)%5(,(;151M'+'9$(O%)%5!%!1'+'9; ; ;E GGGM%(()))	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* wrw||DL$)g:MNN$)*, , , 	$/***6;tT^<<===!!!s   A-DDDc                 ~    t          t          |                                            |                                  d S N)r(   r   destroy_clear_cacherA   rF   s    r   r|   zIU_TreeBasedIndex.destroy   s8    &&..000r   c                 D   t           j                            t           j                            | j        | j        dz                       st          d          t          j        t           j                            | j        | j        dz             dd          | _	        | j	        
                    | j                   t          j        d| j	                            d                    d         | _        |                                  |                                  d S )Nr_   zDoesn't existsra   r   rb   rd   r   )re   rf   rg   rh   rB   rC   r   ri   rj   rp   rr   r*   rP   unpackreadrv   _fix_params_open_storager]   s    r   
open_indexzIU_TreeBasedIndex.open_index   s    w~~bgll4<W9LMMNN 	3 !1222wrw||DL$)g:MNN$)*, , , 	$/***tT\->->q-A-ABB1Er   c                    | j                             | j                   t          j        d| j        z   ddd          }|| j        | j        z  dz  z  }| j                             |           | 	                                 d S )NrI   r       )
rp   rr   r+   rP   rs   rN   rT   r,   rm   flush)rA   roots     r   ru   z$IU_TreeBasedIndex._insert_empty_root   sx    $/***{3!991aCC,t/AAGKK4   

r   c           
          |p| j         }|                     |          \  }}|                     |                                |||||||           | j                            |           d S r{   )STATUS_O_find_leaf_to_insert_insert_new_record_into_leafpopr8   delete)rA   doc_idkeystartsizestatusnodes_stackindexess           r   insertzIU_TreeBasedIndex.insert   sy    (4=#88==W))+//*;*;S&*/v{*1	3 	3 	3 	!!&)))))r   c                     | j                             |           | j                             | j        d| j        z  z             }t          j        d| j        z   d| j        z  z   |          \  }}}|||fS NrH   rI   )	rp   rr   r   rY   rZ   rP   r   r.   r/   )rA   
leaf_startdatanr_of_elementsprev_lnext_ls         r   r?   z:IU_TreeBasedIndex._read_leaf_nr_of_elements_and_neighbours   s    *%%%|  !;!"T%6!6"7 8 8)/$..T5H1HH$*P *P&vv--r   c                     | j                             |           | j                             | j        | j        z             }t          j        d| j        z   | j        z   |          \  }}||fS NrI   )	rp   rr   r   rY   rX   rP   r   r.   r-   )rA   r   r   r   children_flags        r   r@   z=IU_TreeBasedIndex._read_node_nr_of_elements_and_children_flag   so    %   |  !;dn!LMM(.$..1AA4)I )I%},,r   c                     | j                             |           | j                             | j                  }t	          j        d| j        z   |          }|d         S )NrI   r   )rp   rr   r   rY   rP   r   r.   )rA   r   r   r   s       r   r=   z+IU_TreeBasedIndex._read_leaf_nr_of_elements   sY    %   |  !;<<sT-I'I'+- -a  r   c                     | j                             |                     ||| j                             | j                             | j                  }t          j        d| j        z   |          \  }}}|||fS r   )	rp   rr   _calculate_key_position	TYPE_NODEr   rU   rP   r   rK   )rA   
node_start	key_indexr   	flag_leftr   pointer_rights          r   r:   z'IU_TreeBasedIndex._read_single_node_key   s    ((Y)-9 9	: 	: 	: |  !=>>(.$00$)8 )8%	3#},,r   c                     | j                             |                     ||| j                             | j                             | j                  }t          j        d| j        z   |          \  }}}}}|||||fS r   )	rp   rr   r   rt   r   rT   rP   r   rJ   )	rA   r   r   r   r   r   r   r   r   s	            r   _read_single_leaf_recordz*IU_TreeBasedIndex._read_single_leaf_record   s    ((Y)-9 9	: 	: 	: |  !=>>+1=$00$,8 ,8(VUD&FE4//r   c                     || j         k    r|| j        z   || j        z  z   S || j        k    r|| j        z   || j        | j        z   z  z   S dS )z<
        Calculates position of key in buckets file
        N)rt   r[   rT   r   r\   rZ   rR   )rA   r   r   flags       r   r   z)IU_TreeBasedIndex._calculate_key_position   sj     4>!!411I@\4\\\T^##411I!DM153 3 3 $#r   c                 ,   |dz   }|}|                      |          d         }	 ||k     rE|                     ||          \  }	}
}}}||	k    rt          ||
k    r|| j        k    r|||fS |dz   }n&|st          |}|                     |          \  }}}d}rNr   Tr   )r>   r   r   STATUS_Dr?   )rA   r   r   element_indexr   r   curr_key_indexcurr_leaf_start	next_leafcurr_keycurr_doc_id
curr_start	curr_sizecurr_status	prev_leafs                  r   r8   zIU_TreeBasedIndex._match_doc_id   s    &*$..z::1=		'.."&"?"?'#9 #9 +z9(??''{**{dm/K/K*NNJJ%3a%7NN  '''&/O;?;h;h!<# <#8NIy%&N)	'r   c                     |dz   }|}|                      |          d         }	 ||k     r?|                     ||          \  }}	}
}}||k    rt          || j        k    r|||fS |dz   }n&|st          |}|                     |          \  }}}d}lr   )r>   r   r   r   r?   )rA   r   r   r   r   r   r   r   r   r   r   r   r   r   s                 r   _find_existingz IU_TreeBasedIndex._find_existing  s    &*$..z::1=		'.."&"?"?'#9 #9 +z9(??&& DM11*NNJJ%3a%7NN  '&&&/O;?;h;h!<# <#8NIy%&N%	'r   c                     | j                             |                     ||| j                  | j        z              | j                             t          j        d| j        z   g|R             d S r   )	rp   rr   r   rt   rR   rm   rP   rs   r1   )rA   r   r   new_datas       r   _update_elementz!IU_TreeBasedIndex._update_element#  su    ((YOOm	 	 	 	6;sT-='=IIIIJJJJJr   c                     | j                             |                     ||| j                  | j        z   dz
             | j                             t          j        d| j                             d S )Nr   rd   )	rp   rr   r   rt   rT   rm   rP   rs   r   )rA   r   r   s      r   _delete_elementz!IU_TreeBasedIndex._delete_element)  sr    ((YOO*+-./	0 	0 	0 	6;tT];;<<<<<r   c                    | j                             |           | j                             ||z
  dz   | j        z            }t	          j        d| j        z   |d | j                           d         }|| j        d          }d}||k    rJ|dz  }t	          j        d| j        z   |d | j                           d         }|| j        d          }||k    J||z   S Nr   rI   r   )rp   rr   r   rT   rP   r   r0   rR   rA   r   r   start_index	end_indexr   r   
curr_indexs           r   _leaf_linear_key_searchz)IU_TreeBasedIndex._leaf_linear_key_search/  s    %   |  $q(D,HHJ J=t!6!%nt}n!57 778:D0112
#oo!OJ}S4?%:%).4=.%9; ;;<>H4556D	 #oo
 Z''r   c                    | j                             || j        z              | j                             ||z
  dz   | j        | j        z   z            }t          j        d| j        z   |d | j                           d         }|| j        | j        z   d          }d}||k    rR|dz  }t          j        d| j        z   |d | j                           d         }|| j        | j        z   d          }||k    R||z   S r   )rp   rr   rZ   r   rR   rP   r   r0   r   s           r   _node_linear_key_searchz)IU_TreeBasedIndex._node_linear_key_search>  s   %$"33444|  )k"9A"="&-$2C"C"E F F=t!6!%nt}n!57 778:DMD$55667
#oo!OJ}S4?%:%).4=.%9; ;;<>H(99::;D	 #oo
 Z''r   c                     ||t           z   fS r{   r   rA   buffer_start
buffer_ends      r   _next_bufferzIU_TreeBasedIndex._next_bufferM  s    :(8888r   c                     |t           z
  |fS r{   r   r   s      r   _prev_bufferzIU_TreeBasedIndex._prev_bufferP  s    ..<<r   c                     ||k    rt           }n||| j        z   k     rt          }nd }|                     |||z   dz  | j                  ||z   dz  |fS )NrH   )MOVE_BUFFER_PREVrT   MOVE_BUFFER_NEXTr   rt   )rA   r   candidate_startr   r   iminimaxmove_buffers           r   $_choose_next_candidate_index_in_leafz6IU_TreeBasedIndex._choose_next_candidate_index_in_leafS  ss     /))*KK/D,HHHH*KKK++*N "Tka/= 	=r   c                     ||k    rt           }n*||| j        z   k     r| j        | j        z   dz
   t          }nd }|                     |||z   dz  | j                  ||z   dz  |fS )Nr   rH   )r   rU   rZ   rR   r   r   r   )rA   r   r   r   r   r   r   r   s           r   $_choose_next_candidate_index_in_nodez6IU_TreeBasedIndex._choose_next_candidate_index_in_node`  s     /))*KK/D,HHHH.!33*KKK++*N "Tka/= 	=r   c                     |dk    r|                      ||          dd          S |                     |||          dd          S )Nr   )"_find_key_in_leaf_with_one_element%_find_key_in_leaf_using_binary_search)rA   r   r   r   s       r   r9   z#IU_TreeBasedIndex._find_key_in_leafn  sg    Q::3;EG GGIssL L ==Z1 1136 6r   c                 |    |dk    r|                      |||          S |                     |||t          |          S )Nr   )r   )moder   )r   r   
MODE_FIRST)rA   r   r   r   r   s        r   _find_key_in_leaf_for_updatez.IU_TreeBasedIndex._find_key_in_leaf_for_updatev  se    Q::3;EBH ; J J J ==c>H>LCMEK	 > M M Mr   c                     |dk    r&|                      ||t          d          d d         S |                     |||t          d          d d         S Nr   T)r   return_closestrH   r   r   r   rA   r   r   r   s       r   -_find_index_of_first_key_equal_or_smaller_keyz?IU_TreeBasedIndex._find_index_of_first_key_equal_or_smaller_key  s    Q::Zj ; G GGIrK K ==# > % %
 &(aR) )r   c                     |dk    r&|                      ||t          d          d d         S |                     |||t          d          d d         S r   )r   	MODE_LASTr   r   s       r   ,_find_index_of_last_key_equal_or_smaller_keyz>IU_TreeBasedIndex._find_index_of_last_key_equal_or_smaller_key  s    Q::Zi ; F FFHqbJ J ==# > % %
 &(aR) )r   c                     |dk    r%|                      ||t                    d d         S |                     |||t                    d d         S )Nr   r   rH   r   r   s       r   _find_index_of_first_key_equalz0IU_TreeBasedIndex._find_index_of_first_key_equal  sz    Q::3;E@J ; L LLNQBP P ==Zj > B BBD1"F Fr   Fc                     |                      |d          \  }}}}	}
||k    r|r|
| j        k    r|dfS t          |
| j        k    rt          |||k    rt          |d||||	|
fS )Nr   )r   r   r   r   )rA   r   r   r   r   r   r   r   r   r   r   s              r   r   z4IU_TreeBasedIndex._find_key_in_leaf_with_one_element  s     77
AFF	+z9(?? #+">">!1}$""dm++""#+(=(=##!1k8ZT___r   c                    d|dz
  }}|                                  \  }	}
|                     ||                     |||z   dz  | j                  |	|
||          \  }}}||k    r||k    r|                     ||          \  }}}}}|                     ||| j                  }||k     rN|t
          k    r|                     |	|
          \  }	}
n|du  |dz
  }|                     |||	|
||          \  }}}n ||k    r|t          k    rM|t          k    r| 	                    |	|
          \  }	}
n|du  |dz   }|                     |||	|
||          \  }}}n|| j
        k    rn|t
          k    r|                     |	|
          \  }	}
n|du  |}|                     |||	|
||          \  }}}nL|t          k    r| 	                    |	|
          \  }	}
n|du  |dz   }|                     |||	|
||          \  }}}||k    r||k    ||k    r|}n|}|                     ||          \  }}}}}||k    r|r||fS t          |r||k    r|| j
        k    r	|||||||fS |t          k    r9||k     r3|                     ||                     ||| j                  ||          }n|}|                     ||          \  }}}}}|| j        k    r:|s8|                     ||||          \  }}}|                     ||          \  }}}}}|?||k    r9|                     |||||          \  }}}|                     ||          \  }}}}}|||||||fS )zH
        Binary search implementation used in all get functions
        r   r   rH   N)_set_buffer_limitsr   r   rt   r   r   r   r   r   r   r   r   r   r   r   r   r8   )rA   r   r   r   r   r   r   r   r   r   r   r   candidate_indexr   r   r   r   r   r   chosen_key_positionmatching_record_indexs                        r   r   z7IU_TreeBasedIndex._find_key_in_leaf_using_binary_search  s    *d#'#:#:#<#< j8<8a8a((dTka5G)-9 9:Fd	9$ 9$5+
 dlltd{{HLHeHeOI- I-EHk:y+"::OT^= =OX~~"222/3/@/@$j02 02,L**  4''&*@D@i@iz$A  A =++ 9$$"&666373D3D(*46 460jj $t++*Q.DDHDmDm"O\:dE$ E$AO_kk #dm33&*:::7;7H7H ,j8: 8:4L** (4//.HLHqHq&&dI4 I4E++ "222/3/@/@$j02 02,L**  4''&*@D@i@iz$A  A =+] dlltd{{d $;;"1"&DHDaDa+E- E-A+z9k(?? #!#666"" 	pf++t}0L0L2K:W`bmmmz!!d-@&@&@(,(D(D00T15A ABF'	)) ))%% )<%HLHeHe1I3 I3EHk:y+dm++N+DHDWDW.
NEL ELA
N,ALPLiLi 5M7 M7I+z9k!f&;&;DHDVDVC!6
"E$ E$A
N,A MQLiLi 5M7 M7I+z9k4k8ZYbdooor   c                 h    |dk    r|                      ||          S |                     |||          S Nr   )$_find_place_in_leaf_with_one_element'_find_place_in_leaf_using_binary_searchr   s       r   _find_place_in_leafz%IU_TreeBasedIndex._find_place_in_leaf$  sB    Q<<S*MMM??Z1 1 1r   c                     |                      |d          \  }}}}}|| j        k    r|ddddfS ||k     r|ddddfS |ddddfS )Nr   FTr   )r   r   )rA   r   r   r   r   r   r   r   s           r   r   z6IU_TreeBasedIndex._find_place_in_leaf_with_one_element+  sn    77
AFF	+z9$-''q!UD00X~~!1a55!1a55r   c                    d|dz
  }}|                                  \  }}|                     ||                     |||z   dz  | j                  ||||          \  }}	}
||k    r||k    r|                     ||	          \  }}}}}|                     ||	| j                  }||k     rM|
t
          k    r|                     ||          \  }}n|
du  |	dz
  }|                     ||||||          \  }}	}
nL|
t          k    r|                     ||          \  }}n|
du  |	dz   }|                     ||||||          \  }}	}
||k    r||k    ||k     r	||k     r|}n|}|                     ||          \  }}}}}|| j	        k    r||dddfS ||k     r`|dk    rG|                     ||dz
            \  }}}}}|| j	        k    r
||dz
  dddfS ||||z
  || j
        k    dfS ||||z
  || j
        k    dfS ||dz
  k     rM|                     ||dz             \  }}}}}|| j	        k    r
||dz   dddfS ||dz   ||z
  dz
  || j
        k    dfS ||dz   ||z
  dz
  || j
        k    dfS )zF
        Binary search implementation used in insert function
        r   r   rH   NFT)r   r   r   rt   r   r   r   r   r   r   r,   )rA   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   s                    r   r   z9IU_TreeBasedIndex._find_place_in_leaf_using_binary_search6  s   
 *d#'#:#:#<#< j8<8a8a((dTka5G)-9 9:Fd	9$ 9$5+
 dlltd{{HLHeHeOI- I-EHk:y+"::OT^= =OX~~"222/3/@/@$j02 02,L**  4''&*@D@i@iz$A  A =++ "222/3/@/@$j02 02,L**  4''&*@D@i@iz$A  A =+- dlltd{{2 $;;4.00"&"&DHDaDa+E- E-A+z9k$-''2AudBB8^^"Q&&LPLiLi 3a 7M9 M9I+z9k..%':Q'>5$NN%':NM`<`&$*<<uE E "#6I\8\"d&885A A #^a%777LPLiLi 3a 7M9 M9I+z9k..%':Q'>5$NN%':Q'>Qd@dgh@h&$*<<uE E "#6#:NM`<`cd<d"d&885A Ar   c                 f    | j                                         }||t          z  z
  }||t          z   fS r{   )rp   tellr   )rA   posr   s      r   r   z$IU_TreeBasedIndex._set_buffer_limits|  s6    l!!c$445l-==>>r   c                     |dk    r|                      ||t                    S |                     |||t                    S Nr   r   )"_find_key_in_node_with_one_elementr   %_find_key_in_node_using_binary_searchrA   r   r   r   s       r   r;   z3IU_TreeBasedIndex._find_first_key_occurence_in_node  sb    Q::3;E@J ; L L L ==c>H>LCM > O O Or   c                     |dk    r|                      ||t                    S |                     |||t                    S r  )r  r   r  r  s       r   r<   z2IU_TreeBasedIndex._find_last_key_occurence_in_node  sb    Q::3;E@I ; K K K ==c>H>LCL > N N Nr   c                     |                      |d          \  }}}||k     rd|fS ||k    rd|fS |t          k    rd|fS |t          k    rd|fS t          d          )Nr   z%Invalid mode declared: set first/last)r:   r   r   	Exception)rA   r   r   r   	l_pointerr   	r_pointers          r   r  z4IU_TreeBasedIndex._find_key_in_node_with_one_element  s    )-)C)C* *&	8Y>>i<8^^i<z!!)|#"")|# GHHHr   c                    d|dz
  }}|                                  \  }}|                     ||                     |||z   dz  | j                  ||||          \  }	}
}||k    rH||k    rA|                     ||
          \  }}}|                     ||
| j                  }	||k     rM|t
          k    r|                     ||          \  }}n|d u  |
dz
  }|                     ||	||||          \  }	}
}n||k    rY|t          k    rM|t          k    r| 	                    ||          \  }}n|d u  |
dz   }|                     ||	||||          \  }	}
}nMnY|t          k    r| 	                    ||          \  }}n|d u  |
dz   }|                     ||	||||          \  }	}
}||k    r||k    A||k    r|
}n||k     r	||k     r|}n|}|                     ||          \  }}}|t          k    r9||k     r3|                     ||                     ||| j                  ||          }n|}|                     ||          \  }}}||k     r||fS ||k    r||fS |t          k    r||fS |t          k    r||fS t          d          )Nr   r   rH   z!Invalid mode declared: first/last)r   r   r   r   r:   r   r   r   r   r   r   r   r  )rA   r   r   r   r   r   r   r   r   r   r   r   r  r   r	  r   r   s                    r   r  z7IU_TreeBasedIndex._find_key_in_node_using_binary_search  s   
 *d#'#:#:#<#< j8<8a8a((dTka5G)-9 9:Fd	9$ 9$5+
 dlltd{{-1-G-GO.- .-*Ix"::OT^= =OX~~"222/3/@/@$j02 02,L**  4''&*@D@i@iz$A  A =++ 9$$"&666373D3D(*46 460jj $t++*Q.DDHDmDm"O\:dE$ E$AO_kk "222/3/@/@$j02 02,L**  4''&*@D@i@iz$A  A =+G dlltd{{N $;;"1D[[TN22"&"&)-)C)C+*- *-&	8Y:$)<"<"<$($@$@,,Zt~NN)%+ %+!!
 %8!)-)C)C-*/ */&	8Y>>()338^^()33z!!,i77"",i77 CDDDr   c                    | j                             |           | j                             t          j        d|                     |                     ||| j                  }| j                             |           | j                             t          j        d||z
  | j        z  z   g|R             | j        	                    |           | j
        	                    |           d S )N<hrI   )rp   rr   rm   rP   rs   r   rt   rJ   r=   r   r?   )rA   r   r   new_nr_of_elementsrecords_to_rewritestart_positions         r   _update_leaf_ready_dataz)IU_TreeBasedIndex._update_leaf_ready_data  s    *%%%6;t-?@@AAA55j+6:nF F.)))K)K7./ /E1CE E E	F 	F 	F 	&--j9995<<ZHHHHHr   c           
         |dk    r| j                             |                     ||| j                             | j                             t          j        d| j        z   ||||	|
                     |                                  n8|                     ||| j                  }| j                             |           | j         	                    || j
        z            }t          j        d|| j        z  z   |          }d}t          |          }|dd d         D ]+}|| j        k    r||dz  |dz  dz   = |dz  }|dz  }&|dz  },| j                             |           | j                             t          j        d|dz   | j        z  z   ||||	|
gt          |          R             |                                  | j                             |           |s0| j                             t          j        d|dz                        | j                            |           | j                            |           | j                            |           d S )Nr   rI         r   r  )rp   rr   r   rt   rm   rP   rs   rJ   r   r   rT   r   listr   tupler=   r   r?   r9   )rA   r   new_record_positionr   nr_of_records_to_rewrite
on_deletednew_key
new_doc_id	new_startnew_size
new_statusr   r   r  r   r   s                   r   _update_leafzIU_TreeBasedIndex._update_leaf  s    $q((L,,Z9L-1^= => > > LC$"@@'&	8ZI IJ J J JJLLLL001D15A AE Le$$$<$$%=%)%A&B C CD!'(4+IIJ" " J!%&8!9!9,  $ $ T]***:>*q.1:L+LM,1,"a'NN!OJJLe$$$L3a723 34;	8Z0 -..	0 0 01 1 1 JJLLL*%%% 	FLv{4!1CDDEEE&--j9995<<ZHHH%%j11111r   c                     | j                             || j        z              | j                             d| j        z            }t          j        dd| j        z  z   |          \  }}||fS r   )rp   rr   rY   r   rZ   rP   r   r/   )rA   r   neihbours_datar   r   s        r   r>   z'IU_TreeBasedIndex._read_leaf_neighbours:  sn    *t'AABBB**1t/@+@AAsQ1D-D'D'57 7v~r   c                 Z   | j                             |           | j                             t          j        d| j        z   d| j        z  z   |||                     | j                            |           | j	                            |           | j
                            |           d S )NrI   rH   )rp   rr   rm   rP   rs   r.   r/   r=   r   r>   r?   )rA   r   r  new_prevnew_nexts        r   _update_leaf_size_and_pointersz0IU_TreeBasedIndex._update_leaf_size_and_pointersA  s    *%%%Kd22Q9L5LL(H. .	/ 	/ 	/
 	&--j999"))*5555<<ZHHHHHr   c                    | j                             || j        z              | j                             t	          j        d| j        z   |                     | j                            |           | j	                            |           d S r   )
rp   rr   rY   rm   rP   rs   r/   r>   r   r?   )rA   r   pointers      r   _update_leaf_prev_pointerz+IU_TreeBasedIndex._update_leaf_prev_pointerM  s~    *t'AABBB6;sT-@'@'JJKKK"))*5555<<ZHHHHHr   c                    | j                             |           | j                             t          j        d| j        z   |                     | j                            |           | j                            |           d S r   )	rp   rr   rm   rP   rs   r.   r=   r   r?   )rA   r   r  s      r   _update_sizezIU_TreeBasedIndex._update_sizeT  s    %   Kd::HEE	G 	G 	G 	&--e4445<<UCCCCCr   c           
         | j         |z
  | j        z  dz  }| j        | j        z   }| j        | j        z   | j        z   }	| j                            | j        | j        z              | j                            | j        | j         z            }
t          j
        d| j        | j         z  z   |
          }|                     | j        |d|          rd S ||dz
  k    r||dz
  dz           }n||dz
  k    r	|d         }n||dz           }|                     |||	| j                  }||k    rt          j        d| j        z   | j        | j         |z
  z  z   |d|	g|d | dz           R  }|t          j        d| j        ||z
  dz   z  z   |d         |d         |d         |d         |d         g|| dz  |dz
  dz           R  z  }t          j        d| j        z   d| j        z  z   | j        |z  z   ||dg|| dz  d          R  }n|r ||dz  | dz           }|| dz  d          }n||dz  d          }g }t          j        d| j        z   | j        |z  z   |d|	g|d |dz           R  }t          j        d| j        z   d| j        z  z   | j        ||z
  dz
  z  z   ||dg|R  }|t          j        d| j        |dz   z  z   |d         |d         |d         |d         |d         g|R  z  }|| j         |z
  | j        z  dz  z  }||z  }||z  }||z  }| j                            | j                   | j                            t          j        d	| j                  |z              | j        | _        | j                            |           | j                            |           | j                            |           | j                            |           d S )
Nr   rI   r   r   r  rH   r#   r  rd   )r,   rT   r+   rV   rW   rp   rr   r[   r   rP   r   rJ   _update_if_has_deleted_prepare_new_root_datart   rs   rN   r.   r/   r*   rm   r   rv   r9   r   r=   r?   r>   )rA   r   r  new_leaf_sizeold_leaf_size	half_sizer   blanksleft_leaf_start_positionright_leaf_start_positionr   	leaf_datakey_moved_to_parent_nodedata_to_writeleft_leaf_dataright_leaf_datarecords_beforerecords_afters                     r   _create_new_root_from_leafz,IU_TreeBasedIndex._create_new_root_from_leaf\  sI    $}4()+23#'?T^#C $(ON%!^%,!$/D,BBCCC|  !=!%!3"4 5 5M$043EEEtM M	 &&t	1'/1 1 	4#ma&777'0-!2Cq1H'I$$%):::'/{$$'01B'C$334L4L4M48ND D $i// $[d...#&>>@@AN,	<
 95599:< < <N fkd4)M9A=? ?@HXa[(1+x{ 44q8-!:K:  	   N %kd22Q9L5LL.>?@M(!N /88J8K8K.LN N NOO ( #!*=+,,-.F-F-J,K "L )+C*Ca*G*H*H I!*=1+<+=+=!> "#[d...>?@M,N 099K-!:K9K/LN N NN
 %kd22Q9L5LL.!99A=??@M(!	> /=	> > >O
 v{d4)A-/ /08Xa[Xa[(1+ G 9F G  G  G GO 	4-=#;<>EF 	F6!'($/***6;tT^<<}LMMM 	%%j111&--j9995<<ZHHH"))*555tr   c	           
         | j         dz  }	| j         dz  dk    r|	}
|	dz   }n|	dz   x}
}|r#|||||g}|                     ||||
|	|           dS | j         |z
  | j        z  dz  }|                     |          \  }}||	k    r| j                            |                     || j         |z
  | j                             | j                            || j        z            }t          j
        d|| j        z  z   |          }|                     ||| j         |z
  |||||g          rdS || dz           }| j                            dd           | j                                        }t          j        d| j        z   d| j        z  z   | j        |z  z   |||g|| dz  d         R  }||z  }| j                            |           |                     ||
||           | j                            |                     || j         |z
  | j                             | j                            t          j        d| j        ||z
  dz   z  z   ||||| j        g|d| dz           R             |r|                     ||           | j                            |           ||fS | j                            |                     ||
| j                             | j                            | j        |dz
  z            }t          j
        d|dz
  | j        z  z   |          }|                     |||
|||||g          rdS ||dz
   dz           }||k    r|}| j                            dd           | j                                        }|dz  }|r|d|          }|| d         }n|}g }t          j        d| j        z   d| j        z  z   | j        ||z
  dz
  z  z   |||g|R  }|t          j        d| j        |dz   z  z   ||||| j        g|R  z  }||z  }| j                            |           |                     ||
||           |r|                     ||           | j                            |           ||fS )z
        Splits full leaf in two separate ones, first half of records stays on old position,
        second half is written as new leaf at the end of file.
        rH   r   r   r   rI   Nr  )r,   r:  rT   r>   rp   rr   r   rt   r   rP   r   rJ   r+  r   rs   r.   r/   rm   r$  r   r'  r9   r   )rA   r   r  r  r  r  r  r  create_new_rootr/  r.  r-  r   r0  r   r   r   r  r4  new_leaf_startnew_leafindex_of_records_splitr8  r9  s                           r   _split_leafzIU_TreeBasedIndex._split_leaf  sg    &!+	!Q&&%M%MMM,5M9MM u	@Y*MH++J,D,9=,5xA A A A A
 (=8,-/67F!77
CCNFF')33!!00"*-EE( () ) ) |(()A)-)E*F G G%+],t/MMN& &"
 .."$6*-EEj)XzJL L    4+=}n>??@ ,A( !!!Q'''!%!2!2!4!4!;$66++,2]BC ":v	>
 ((:(;(;<> > > F"""8,,,33J4:NL L L !!00"*-EE( () ) ) ""Kd<1MAAEG GY	B
 ,,?m^a-?,?@B B BC C C  K226>JJJ&--j999%'??? !!00]15A AB B B |(()E*7!*;*= > >%+]=1,0NNN& &" .."$6j)XzJL L    4+=#a'(1,,.(+g55/6,!!!Q'''!%!2!2!4!4)AA)E&) '%7 9P9O8O9P &QN$6//00%2MM &8N$&M!;$66++,.2.L"%==A/CC ":v	H 9G	H H H
 FK$8-13 34;ZxH :GH H H H F"""8,,,33J4:NL L L K226>JJJ&--j999%'???r   c                 n   d}| j         }t          |          }|ddd         D ]&}|| j        k    r||dz  |dz  dz   = |dz  }!|dz  }'|| j         k     r_d}|ddd         D ]}	|	|d         k    r n|dz  }|d|dz           |z   ||dz  d         z   }|                     |||dz   |          f dS dS )zq
        Checks if there are any deleted elements in data to rewrite and prevent from writing then back.
        r   r  Nr  r   TF)r,   r  r   r  )
rA   r   r  r  new_record_datar   r   r   data_split_indexr   s
             r   r+  z(IU_TreeBasedIndex._update_if_has_deleted?  s;   
 
+!"455(A. 	  	 F&&&zA~j1nq6H'HI!#a

D... )!$Q$/ * *+++E$)$$!34I5E5I4I!J!""$%5%9%:%:;"< ((^)7!););= = > > 45r   c                     |p| j         }t          j        d| j        z   | j        z   d||||          }|| j        | j        z   | j        dz
  z  dz  z  }|S )NrI   r   r   )r   rP   rs   rO   rK   rR   rZ   r,   )rA   root_keyleft_pointerright_pointerr   new_roots         r   r,  z(IU_TreeBasedIndex._prepare_new_root_data_  sz    
 &7;$**T-KKQ<=B B 	T]T%664;M;<<= >@GH 	Hr   c                    | j                             | j        | j        z              | j                             | j        | j        | j        | j        z   z  z             }t          j	        d| j
        z   | j        | j        | j
        z   z  z   |          }	| j                             dd           | j                                         }
||k    r|}t          j        d| j        z   | j
        z   || j        | j
        z   z  z   ||g|	d |dz  dz            R  }t          j        d| j        z   | j
        z   || j        | j
        z   z  z   |||g|	|dz  dz   d          R  }n ||k    r|	|dz  dz
           }|| j        k    r|	d d         }|	d|dz  dz
           }n"|	d | dz           }|	| dz  |dz  dz
           }t          j        d| j        z   | j
        z   | j        |z
  | j        | j
        z   z  z   ||g|R  }|t          j        d| j        | j
        z   ||z
  z  z   ||g|R  z  }t          j        d| j        z   | j
        z   || j        | j
        z   z  z   ||g|	|dz  d          R  }n|	|dz  dz            }t          j        d| j        z   | j
        z   || j        | j
        z   z  z   ||g|	d |dz  dz            R  }|r#|	|dz   dz  | dz           }|	| dz  d          }n|	|dz   dz  d          }g }t          j        d| j        z   | j
        z   ||z
  dz
  | j        | j
        z   z  z   ||g|R  }|t          j        d|dz   | j        | j
        z   z  z   ||g|R  z  }|                     ||
|
| j        z             }|| j        |z
  | j        | j        z   z  dz  z  }|| j        |z
  | j        | j        z   z  dz  z  }| j                             dd           | j                             ||z              | j                             | j                   | j                             |           | j                            |           | j                            |           d S )NrI   r   rH   r   r   )rp   rr   r+   r\   r   rZ   r,   rR   rP   r   r/   r0   r   rs   rO   r,  rV   rm   r:   r   r@   )rA   r   r   nr_of_keys_to_rewritenew_node_sizeold_node_sizer  new_pointerr   old_node_datanew_node_startkey_moved_to_root	left_node
right_nodekeys_before
keys_afterrH  s                    r   _create_new_root_from_nodez,IU_TreeBasedIndex._create_new_root_from_nodel  s    	$/D,BBCCC|  !2T5G"&-$2C"C6E "E F F$%%(:_t22)4 459; ; 	!Q**,, M11 'd..1DD43F!FGH}8 5 1A 556	8 8 8I  d..1DD43F!FGH}k8 }q014556	8 8 8JJ
 #]22 -ma.?!.C D$(:::+BQB/*1]Q->-B+BC

+,G.C-Ca-G,GH*-B+C+,,--:Q->-B,C D
d..1DD#&;;4#66889F	- !,	- - -I
 t)<<&68 89@+    I
  d..1DD43F!FGH}4 }q0112	4 4 4JJ !.ma.?!.C Dd..1DD43F!FGH}8 5 1A 556	8 8 8I
 %  +]Q->,--./D.Dq.H-I J*,A+AA+E+F+FG

+]Q->!,C,D,DE
d..1DD!66:4#66889F	- !,	- - -J
 &+,q04#668 89@+    J ../@/=/=/NP P 	d(=8]T..029: 	:	 	t)M9]T..029: 	:
!Q9z1222$/***8$$$"))*5558??
KKKtr   c           	         | j         dz  }| j         dz  dk    r|x}}	n|}|dz   }	|r|                     ||||	|||           dS | j         |	z
  | j        | j        z   z  dz  }
||	k    rg| j                            |                     ||| j                  | j        z              | j                            || j        | j        z   z            }t          j
        d|| j        | j        z   z  z   |          }| j                            dd           | j                                        }t          j        d| j        z   | j        z   | j        | j        z   |	z  z   |	||g|R  }||
z  }| j                            |           |                     ||           | j                            |           | j                            |           ||fS ||k    r,| j                            |                     || j         |z
  | j                  | j        z              | j                            || j        | j        z   z            }t          j
        d|| j        | j        z   z  z   |          }||	dz    dz           }| j                            dd           | j                                        }t          j        d| j        z   | j        z   | j        | j        z   |	z  z   |	|||	 dz  dz
           g||	 dz  d         R  }||
z  }| j                            |           |                     ||           | j                            |                     || j         |z
  | j                  | j        z              | j                            t          j        d| j        | j        z   ||	z
  z  z   ||g|d|	dz    dz           R             | j                            |           | j                            |           ||fS | j                            |                     ||| j                  | j        z              | j                            |	| j        | j        z   z            }t          j
        d|	| j        | j        z   z  z   |          }|d         }| j                            dd           | j                                        }|dz  }|d         }|dd         }|r|d|          }|| d         }n|}g }t          j        d| j        z   | j        z   | j        | j        z   |	|z
  dz
  z  z   |	||g|R  }|t          j        d| j        | j        z   |dz   z  z   ||g|R  z  }||
z  }| j                            |           |                     ||           | j                            |           | j                            |           ||fS )z
        Splits full node in two separate ones, first half of records stays on old position,
        second half is written as new leaf at the end of file.
        rH   r   r   r   rI   N)r,   rU  rR   rZ   rp   rr   r   r   r   rP   r   r0   r/   r   rs   rO   rm   r)  r:   r   r@   )rA   r   rJ  r  rM  r   r<  r/  rL  rK  r0  r   rN  rO  new_noder4  r?  first_leaf_pointerrS  rT  s                       r   _split_nodezIU_TreeBasedIndex._split_node  s    &!+	!Q&&,55MMM%M%MM A	@++J,A,9=,3[B B B B B
 (=8 1135<=F$55!!00]15A A%&' ' '
 |(()>*.-$:K*K*M N N &/_t'::< <=A!C !C !!!Q'''!%!2!2!4!4!;$22T5HH_t'::mKL!=+O ANO O O F"""8,,,!!*m<<<*11*===@GG      &w..&22!!00"D$6-%./3~? ? %&' ' ' |(()>*.-$:K*K*M N N &/_t'::< <=A!C !C ,9=1;L9M9::; ,<(!!!Q'''!%!2!2!4!4!;$22T5HH_t'::mKL!=!=.1"4q"89	9
 #M>A#5#6#679 9 9 F"""8,,,!!*m<<<!!00"D$6-%./3~? ? %&' ' ' ""Kt1DD.>@ @AH#C ''@-!*;(<q(@'@A	C C CD D D *11*===@GG      &'??? !!00]15A A%&' ' ' |((*.-$:K*K*M N N &-_t'::< <=A!C !C ,9+;(!!!Q'''!%!2!2!4!4)>)B&%21%5" -abb 1) $"/0H2H1H0H"IK!.0F/F/G/G!HJJ"/K!#J!;$22T5HH_t'::"%::Q>@@AN!#5	E 9D	E E E
 FK4?T-@@*Q.0 018+!  ! ! ! ! F"""8,,,!!*m<<<*11*===@GG      &'???r   c           
         | j                             |           | j                             t          j        d| j        z   d                     | j                             || j        z              | j                             t          j        d| j        z   |||||                     | j        	                    |           | j
        	                    |           | j        	                    |           d S )NrI   r   )rp   rr   rm   rP   rs   r.   r[   rJ   r9   r   r=   r?   )rA   r   r   r   r   r   r   s          r   insert_first_record_into_leafz/IU_TreeBasedIndex.insert_first_record_into_leaf^  s    *%%%6;sT-I'I1MMNNN*t'==>>>Kd<<c6tV- -	. 	. 	.
 	%%j111&--j9995<<ZHHHHHr   c	                    |                      |          }	|	dk    r|                     ||||||           d S |                     |||	          \  }}
}}}|rn	 |                                }n# t          $ r d}Y nw xY w|                     ||||||||rdnd          }|!|\  }}|                     ||||||           d S d S | j                            |           | 	                    ||
|	|||||||
  
         d S )Nr   FTr<  )
r=   r[  r   r   
IndexErrorr@  _insert_new_key_into_noderp   rr   r  )rA   r   r   r   r   r   r   r   r   r   r  r  	full_leafr  leaf_parent_pointer
split_datanew_leaf_start_positionr4  s                     r   r   z.IU_TreeBasedIndex._insert_new_record_into_leafl  s   77
CCQ..z3/3V= = =F&&sJGG 	Y
')A9j 	;(&1oo&7&7## ( ( (&'###())(*=!G4 * J JJ %DNA')A../B/G/9/F/:G	E E E E E &% Lj)))j*=~6
C$eT6; ; ; ; ;s   A- -A<;A<c                    |dk    rn| j                             |           | j                             t          j        d| j        z   | j        z   ||                     |                                  d S | j                             |           | j                             || j	        | j
        z   z            }t          j        d|| j        | j        z   z  z   |          }| j                             |           | j                             t          j        d|dz   | j        | j        z   z  z   ||g|R             |                                  d S )Nr   rI   r   )rp   rr   rm   rP   rs   r0   r/   r   r   rR   rZ   r   )rA   new_key_positionrJ  r  rM  r   keys_to_rewrites          r   _update_nodezIU_TreeBasedIndex._update_node  sy    A%%L.///LC$/1D4GG#[2 23 3 3 JJLLLLLL.///<$$%:&*md6G&G&I J JD$m+4#668 89=? ?O L.///L014_t'::< <=D3 #23 3 34 4 4
 JJLLLLLr   c                    |                                 }|                     |          \  }}	|                     ||          d         }
|
|k    r*| j        |                     ||| j                  z   }||z
  }n/| j        |                     ||dz   | j                  z   }||dz   z
  }|| j        k    r	 |                                 }n# t          $ r d}Y nw xY w|                     |||||	|rdnd          }|r|\  }}| 	                    ||||||           | j
                            |           | j                            |           d S |                     ||dz              |                     ||||           | j
                            |           | j                            |           | j                            |           | j                            |           d S )Nr   r   FTr]  )r   r@   r:   rZ   r   r   r,   r^  rY  r_  r;   r   r<   r)  rg  )rA   r   r  old_half_startnew_half_startr   r   parent_key_indexr   r   parent_prev_pointerre  rJ  node_parent_pointerr   new_node_start_positionr4  s                    r   r_  z+IU_TreeBasedIndex._insert_new_key_into_node  sw   ";;==(,(X(X) )%"88(* **+-.00#043O3O,dn4> 4>  >$25E$E!!#043O3O,q0$.4B 4B  B$26F6J$K!T///(&1oo&7&7## ( ( (&'###(''%*=!G4 ( J JH  EDLA')A../B/G/9/F/:G	E E E 299*EEE188DDDDDj.1*<===.0Ew,. . . 299*EEE188DDD&--j999<CCJOOOOOs   4C	 	CCc                    | j         g}| j        | j        k    r|g fS |                     | j                   \  }}|                     | j         ||          \  }}|                    |           |g}|| j        k    rg|                     |          \  }}|                     |||          \  }}|                    |           |                    |           || j        k    g||fS )z
        Traverses tree in search for leaf for insert, remembering parent nodes in path,
        looks for last occurence of key if already in tree.
        )r+   rv   rt   r@   r<   appendr   )rA   r   r   r   curr_child_flagr   curr_pointerr   s           r   r   z&IU_TreeBasedIndex._find_leaf_to_insert  s   
 '>T^++?".2.^.^/! /!+NO'+'L'Ln(6 (6$J|,,,!lG"dn44262b2b 3" 3"/+/+P+P #~,7 ,7(
L""<000z*** #dn44 ''r   c                 H   | j         | j        k    r| j        S |                     | j                  \  }}|                     | j        ||          d         }|| j        k    r@|                     |          \  }}|                     |||          d         }|| j        k    @|S r   )rv   rt   r+   r@   r<   r   rA   r   r   rq  curr_positions        r   "_find_leaf_with_last_key_occurencez4IU_TreeBasedIndex._find_leaf_with_last_key_occurence  s    >T^++?".2.^.^/! /!+NO AAn6 6679M"dn44262b2b!3# 3#/ $ E E!3!8 !889!; #dn44
 ! r   c                 H   | j         | j        k    r| j        S |                     | j                  \  }}|                     | j        ||          d         }|| j        k    r@|                     |          \  }}|                     |||          d         }|| j        k    @|S r   )rv   rt   r+   r@   r;   r   rt  s        r   #_find_leaf_with_first_key_occurencez5IU_TreeBasedIndex._find_leaf_with_first_key_occurence  s    >T^++?".2.^.^/! /!+NO BBn6 6679M"dn44262b2b!3# 3#/ $ F F!3!8 !889!; #dn44
 ! r   c                 B   |                      |          }|                     |          \  }}}	 |                     |||          \  }}}}	}
nL# t          $ r? |r|                     |          }nt          |                     |||          \  }}}}	}
Y nw xY w||||	|
fS r{   )rx  r?   r9   r   r=   )rA   r   containing_leaf_startr   r   r   r   l_keyr   r   r   s              r   r7   zIU_TreeBasedIndex._find_key  s     $ H H M M/3/\/\!0# 0#,	9		0151G1G%sN2< 2<.FE5$ 	0 	0 	0 #!%!?!?	!J!J""151G1G320 20.FE5$	0 ueT611s   A ABBc                    |                      |          }|                     |          \  }}}	 |                     ||||          \  }}}}	}
}}nt# t          $ rg |r|                     |          }nt                      	 |                     ||||          \  }}}}	}
}}n# t          $ r t                      w xY wY nw xY w||||	|
||fS )zV
        Search tree for key that matches not only given key but also doc_id.
        )rx  r?   r   r   r=   r	   )rA   r   r   rz  r   r   r   r   record_indexr{  r   r   r   s                r   _find_key_to_updatez%IU_TreeBasedIndex._find_key_to_update  s1    !% H H M M/3/\/\!0# 0#,	9	,KOKlKlV2NLD LDHJfeUD&& 		, 		, 		, ,!%!?!?	!J!J)+++,OSOpOpNP< P<L
L&%ff , , ,)+++, GMf		, <tVKKs)    A 0C B#"C#B<<CCr   c                 D   |p| j         }|                     ||          \  }}}}	}
}}|r|}
|r|}|r|}||
||f}|                     |||           | j                            |           | j                            |           | j                            ||           dS NT)r   r~  r   r7   r   r8   r9   )rA   r   r   u_startu_sizeu_statusrz  r   
old_doc_idold_key	old_startold_size
old_statusr   s                 r   updatezIU_TreeBasedIndex.update4  s    ,t}eie}e}f fb}j'9hXb 	 I 	H 	"!J	8Z@2M8LLLc"""!!&)))%%&;SAAAtr   c                    |                      ||          d d         \  }}|                     ||           | j                            |           | j                            |           | j                            ||           dS )NrH   T)r~  r   r7   r   r8   r9   )rA   r   r   r   r   rz  r   s          r   r   zIU_TreeBasedIndex.deleteF  s    /3/G/G0 0!0,}2MBBBc"""!!&)))%%&;SAAAtr   r   c              #     K   |                      |          }|                     |          \  }}}	 |                     |||          \  }}|                     |          \  }}}n-# t          $ r  |}d}|                     |          \  }}}Y nw xY w|rd||k     r:|                     ||          \  }	}
}}}||	k    r|| j        k    r|dz  }|dz  }n$d S d}|r|}|                     |          \  }}}nd S |d|rn||k     rB|                     ||          \  }	}
}}}||	k    r|| j        k    r|
|||fV  |dz  }|dz  }n$d S d}|r|}|                     |          \  }}}nd S |ld S d S Nr   r   )rx  r?   r   r   r   r   rA   r   limitoffsetleaf_with_keyr   r   r   r   r   r   r   r   r   s                 r   _find_key_manyz IU_TreeBasedIndex._find_key_manyP  sJ     @@EE/3/\/\0 0,	9		'+'J'J]N(4 (4$M9373`3`4 40NIyy 	 	 	%MI373`3`4 40NIyyy	
  	>))8<8U8U!99. 9.5&%v(??..!NIIF	 $-M;?;h;h!<# <#8NIyy F#  	$  	>))8<8U8U!99. 9.5&%v(??..$eT69999
NIIF	 $-M;?;h;h!<# <#8NIyy F%  	 	 	 	 	   3A& &'BBc              #     K   |                      |          }|                     |          \  }}}|                     |||          \  }}|                     |          \  }}}|                     ||          d         }	|	|k    r|dz  }|r_|dk    r2|                     ||          \  }}
}}}|| j        k    r|dz  }|dz  }n%|r!|}|                     |          \  }}}|dz
  }nd S |_|rj|dk    r;|                     ||          \  }}
}}}|| j        k    r|
||||fV  |dz  }|dz  }n%|r!|}|                     |          \  }}}|dz
  }nd S |hd S d S r  rx  r?   r   r   r   r  s                 r   _find_key_smallerz#IU_TreeBasedIndex._find_key_smaller  s     @@EE/3/\/\0 0,	9#'#U#U$0 $0 y/3/\/\0 0,	900	JJ1Ms??NI 	A~~373P3P!94. 4.0VUD&T]**aKFQ		 $-M;?;h;h!<# <#8NIy . 2IIF  	  	A~~373P3P!94. 4.0VUD&T]** #udF::::QJEQ		 $-M;?;h;h!<# <#8NIy . 2IIF  	 	 	 	 	r   c              #     K   |                      |          }|                     |          \  }}}	 |                     |||          \  }}|                     |          \  }}}n-# t          $ r  |}|                     |          d         }Y nw xY w|                     ||          d         }	|	|k    r|dz  }|r_|dk    r2|                     ||          \  }}
}}}|| j        k    r|dz  }|dz  }n%|r!|}|                     |          \  }}}|dz
  }nd S |_|rj|dk    r;|                     ||          \  }}
}}}|| j        k    r|
||||fV  |dz  }|dz  }n%|r!|}|                     |          \  }}}|dz
  }nd S |hd S d S r  rv  r?   r   r   r   r   r  s                 r   _find_key_equal_and_smallerz-IU_TreeBasedIndex._find_key_equal_and_smaller  sZ     ??DD/3/\/\0 0,	9	"'+'X'X]N(4 (4$M9373`3`4 40NIyy 	" 	" 	"%MEE  "III	" 00	JJ1Mc>>NI 	A~~373P3P!94. 4.0VUD&T]**aKFQ		 $-M;?;h;h!<# <#8NIy . 2IIF  	  	A~~373P3P!94. 4.0VUD&T]** #udF::::QJEQ		 $-M;?;h;h!<# <#8NIy . 2IIF  	 	 	 	 	r  c              #     K   |                      |          }|                     |          \  }}}	 |                     |||          \  }}|                     |          \  }}}n# t          $ r d}Y nw xY w|                     ||          d         }	|	|k    r|dz  }|r\||k     r2|                     ||          \  }	}
}}}|| j        k    r|dz  }|dz  }n"d}|r|}|                     |          \  }}}nd S |\|rg||k     r;|                     ||          \  }	}
}}}|| j        k    r|
|	|||fV  |dz  }|dz  }n"d}|r|}|                     |          \  }}}nd S |ed S d S r  r  r  s                 r   _find_key_biggerz"IU_TreeBasedIndex._find_key_bigger  s6     ??DD/3/\/\0 0,	9	'+'X'X]N(4 (4$M9373`3`4 40NIyy 	 	 	III	00	JJ1Ms??NI 	>))8<8U8U!99. 9.5&%vT]**aKFQ			 $-M;?;h;h!<# <#8NIyy F  	  	>))8<8U8U!99. 9.5&%vT]** (E4????QJEQ			 $-M;?;h;h!<# <#8NIyy F  	 	 	 	 	s   3A& &A54A5c              #     K   |                      |          }|                     |          \  }}}|                     |||          \  }}|                     |          \  }}}|                     ||          d         }	|	|k     r|dz  }|r\||k     r2|                     ||          \  }	}
}}}|| j        k    r|dz  }|dz  }n"d}|r|}|                     |          \  }}}nd S |\|rg||k     r;|                     ||          \  }	}
}}}|| j        k    r|
|	|||fV  |dz  }|dz  }n"d}|r|}|                     |          \  }}}nd S |ed S d S r  r  r  s                 r   _find_key_equal_and_biggerz,IU_TreeBasedIndex._find_key_equal_and_bigger  s     @@EE/3/\/\0 0,	9#'#U#U$0 $0 y/3/\/\0 0,	900	JJ1Mc>>NI 	>))8<8U8U!99. 9.5&%vT]**aKFQ			 $-M;?;h;h!<# <#8NIyy F  	  	>))8<8U8U!99. 9.5&%vT]** (E4????QJEQ			 $-M;?;h;h!<# <#8NIyy F  	 	 	 	 	r   c              #     K   |r|                      |          }|                     |          \  }}	}
|                     |||          \  }}|                     |          \  }}	}
|                     ||          d         }||k     r|dz  }no|                     |          }|                     |          \  }}	}
|                     |||          \  }}|                     ||          \  }}}}}||k    r|dz  }|r\||k     r2|                     ||          \  }}}}}|| j        k    r|dz  }|dz  }n"d}|
r|
}|                     |
          \  }}	}
ndS |\|rw||k     rK|                     ||          \  }}}}}||k    s||k    r|sdS || j        k    r|||||fV  |dz  }|dz  }n"d}|
r|
}|                     |
          \  }}	}
ndS |udS dS )zO
        Returns generator containing all keys withing given interval.
        r   r   N)rx  r?   r   r   rv  r   r   )rA   r   endr  r  inclusive_startinclusive_endr  r   r   r   r   r   r   r   r   r   s                    r   _find_key_betweenz#IU_TreeBasedIndex._find_key_between8  s     
  	 DDUKKM373`3`4 40NIy'+'Y'Y}n(6 (6$M9373`3`4 40NIy44]5>@ @@ACH%Q	 CCEJJM373`3`4 40NIy'+'X'X}n(6 (6$M9HLHeHeyI* I*EHk:y+5  Q	 	>))LPLiLi!9M. M.I+z9k$-//aKFQ			 $-M;?;h;h!<# <#8NIyy F  	  	>))LPLiLi!9M. M.I+z9kc>>h#oomoF DM11%xYSSSSQJEQ			 $-M;?;h;h!<# <#8NIyy F#  	 	 	 	 	r   c                 R    |                      |                     |                    S r{   )r7   make_keyrA   r   s     r   getzIU_TreeBasedIndex.getu  s     ~~dmmC00111r   c                 V    |                      |                     |          ||          S r{   )r  r  )rA   r   r  r  s       r   get_manyzIU_TreeBasedIndex.get_manyx  s&    ""4==#5#5ufEEEr   Tc                    |E|                      |          }|r|                     |||          S |                     |||          S |E|                      |          }|r|                     |||          S |                     |||          S |                      |          }|                      |          }|                     ||||||          S r{   )r  r  r  r  r  r  )rA   r   r  r  r  r  r  s          r   get_betweenzIU_TreeBasedIndex.get_between{  s     =--$$C B77UFKKK--c5&AAA[MM%((E C66ueVLLL,,UE6BBBMM%((E--$$C))%eV*9=J J Jr   c              #     K   | j         | j        k    r| j        | j        z   }n| j        }|                     |          \  }}}d}|r\||k     r2|                     ||          \  }}	}
}}|| j        k    r|dz  }|dz  }n"d}|r|}|                     |          \  }}}ndS |\|rg||k     r;|                     ||          \  }}	}
}}|| j        k    r|	||
||fV  |dz  }|dz  }n"d}|r|}|                     |          \  }}}ndS |edS dS )zy
        Traverses linked list of all tree leaves and returns generator containing all elements stored in index.
        r   r   N)rv   r   r+   rV   r?   r   r   )rA   r  r  r   r   r   r   r   r   r   r   r   r   s                r   allzIU_TreeBasedIndex.all  s      >T^++4>9JJJ/3/\/\0 0,	9	 	>))8<8U8U	9+ 9+5&%vT]**aKFQ			 !*J;?;h;h!<# <#8NIyy F  	  	>))8<8U8U	9+ 9+5&%vT]** (E4????QJEQ			 !*J;?;h;h!<# <#8NIyy F  	 	 	 	 	r   c                     t                      r{   NotImplementedErrorr  s     r   r  zIU_TreeBasedIndex.make_key      !###r   c                     t                      r{   r  rA   r   s     r   make_key_valuez IU_TreeBasedIndex.make_key_value  r  r   c                     t                      | j                 }| j        s || j        | j                  | _        | j                                         d S r{   )globalsr5   r6   rB   rC   rj   rA   ss     r   r   zIU_TreeBasedIndex._open_storage  sN    IId()| 	61T\4955DLr   c                     t                      | j                 }| j        s || j        | j                  | _        | j                                         d S r{   )r  r5   r6   rB   rC   creater  s     r   rq   z!IU_TreeBasedIndex._create_storage  sN    IId()| 	61T\4955DLr   c                    |s| j         }|                     | j        | j        dz   |          }|                                 |                                 }	 	 t          |          \  }}}}}n# t          $ r Y nw xY w| j        j	        
                    |           | j        j	                            |          }	|j        j	                                        }
|j        j	                            |	           |                    |||
||           |                                 | j        }|                                  t!          j        t$          j                            |j        |j        dz             t$          j                            | j        | j        dz                        t!          j        t$          j                            |j        |j        dz             t$          j                            | j        | j        dz                        |                                  || _        |                     t/          |                     |                                  |                                  dS )N_compact)r,   Tr_   _stor)rC   )r,   rF   rB   rC   ry   r  nextStopIterationr6   _frr   r   r   rm   r   close_indexshutilmovere   rf   rh   r   _save_paramsrk   r   r}   )rA   r,   compact_indgenr   r   r   r   r   valuestart_original_names               r   compactzIU_TreeBasedIndex.compact  sO    	/ .MnnT\%)Y%;3@ % B B 	  """hhjj		B37990UD&&    LO  '''LO((..E (+0022F"((///vsFD&AAA		B 	!!!	GLL,k.>.HIIGLLty7':;;	= 	= 	= 	GLL,k.>.HIIGLLty7':;;	= 	= 	= 	!	$M222333ts   A/ /
A<;A<c                 ~    t          t          |                                            |                                  d S r{   )r(   r   r   r2   r~   s    r   r   zIU_TreeBasedIndex._fix_params  8    &&22444r   c                    | j                                          | j                                         | j                                         | j                                         | j                                         | j                                         | j                                         | j                                         | j	                                         | j
                                         d S r{   )r7   clearr8   r9   r:   r;   r<   r=   r>   r?   r@   r]   s    r   r}   zIU_TreeBasedIndex._clear_cache  s      """$$&&&"((***.44666-33555&,,..."((***5;;===8>>@@@@@r   c                 ~    t          t          |                                            |                                  d S r{   )r(   r   r  r}   r~   s    r   r  zIU_TreeBasedIndex.close_index	  r  r   )r   r   r    r!   Nr{   )NNF)F)r   r   Nr   r   )r   r   )r   r   TT)r  r   )r   )Vr   r   r   custom_headerrt   r   r)   r2   ry   r|   r   ru   r   r?   r@   r=   r:   r   r   r8   r   r   r   r   r   r   r   r   r   r9   r   r   r   r   r   r   r   r   r   r   r;   r<   r  r  r  r  r>   r$  r'  r)  r:  r@  r+  r,  rU  rY  r[  r   rg  r_  r   rv  rx  r7   r~  r  r   r  r  r  r  r  r  r  r  r  r  r  r  r   rq   r  r   r}   r  __classcell__rF   s   @r   r   r   2   s       HMII
 " #%!#*> *> *> *> *> *>XK K KB( ( (0    	 	 	  * * * *. . .- - -! ! !- - -0 0 0	3 	3 	3' ' '6' ' '0K K K= = =( ( (( ( (9 9 9= = == = == = =6 6 6M M M) ) )) ) )F F F 3704:?` ` ` `4 6:37=Bfp fp fp fpP1 1 1	6 	6 	6DA DA DAL? ? ?

O 
O 
O
N 
N 
NI I I I& 48	NE NE NE NE`I I I 02 02 02d  
I 
I 
II I ID D DW W WB %*H@ H@ H@ H@T  H .2	   \ \ \H %*R@ R@ R@ R@hI I I"; "; ";H  .-P -P -P^( ( (4! ! !! ! !2 2 2 L L L,   $   2 2 2 2h) ) ) )V. . . .`, , , ,\) ) ) )V; ; ;z2 2 2F F F F $("&J J J J2) ) ) )V$ $ $$ $ $    % % % %N    A A A        r   r   c                   V     e Zd ZdZ fdZd
 fd	Zd
 fd	Zd fd	Z fdZd	 Z	 xZ
S )IU_MultiTreeBasedIndexz
    Class that allows to index more than one key per database record.

    It operates very well on GET/INSERT. It's not optimized for
    UPDATE operations (will always readd everything)
    c                 H     t          t          |           j        |i | d S r{   )r(   r  r)   )rA   argskwargsrF   s      r   r)   zIU_MultiTreeBasedIndex.__init__  s,    4$d++4dEfEEEEEr   Nc                    |p| j         }t          |t          t          f          rt	          |          }n%t          |t                    st	          |g          }t          t          |           j        }|D ]} ||||||           dS r  )r   r3   r  r  setr(   r  r   )	rA   r   r   r   r   r   insr   rF   s	           r   r   zIU_MultiTreeBasedIndex.insert  s    (4=cD%=)) 	c((CCC%% 	se**C*D118 	7 	7HC%v6666tr   c                    |p| j         }t          |t          t          f          rt	          |          }n%t          |t                    st	          |g          }t          t          |           j        }|D ]} ||||||           d S r{   )r   r3   r  r  r  r(   r  r  )	rA   r   r   r  r  r  updr   rF   s	           r   r  zIU_MultiTreeBasedIndex.update#  s    ,t}cD%=)) 	c((CCC%% 	se**C*D118 	= 	=HC'68<<<<	= 	=r   r   c                    t          |t          t          f          rt          |          }n%t          |t                    st          |g          }t	          t
          |           j        }|D ]} |||||           d S r{   )r3   r  r  r  r(   r  r   )rA   r   r   r   r   r   r   rF   s          r   r   zIU_MultiTreeBasedIndex.delete-  s    cD%=)) 	c((CCC%% 	se**C-t44; 	2 	2HF68UD1111	2 	2r   c                 T    t          t          |                               |          S r{   )r(   r  r  )rA   r   rF   s     r   r  zIU_MultiTreeBasedIndex.get6  s"    +T2266s;;;r   c                     t                      r{   r  r  s     r   r  z%IU_MultiTreeBasedIndex.make_key_value9  r  r   r{   r  )r   r   r   __doc__r)   r   r  r   r  r  r  r  s   @r   r  r    s         F F F F F	 	 	 	 	 	= = = = = =2 2 2 2 2 2< < < < <$ $ $ $ $ $ $r   r  c                       e Zd ZdS )TreeBasedIndexNr   r   r   r   r  r  A  r   r   r  c                       e Zd ZdZdS )MultiTreeBasedIndexz
    It allows to index more than one key for record. (ie. prefix/infix/suffix search mechanizms)
    That class is designed to be used in custom indexes.
    N)r   r   r   r  r   r   r   r  r  E  s           r   r  )!rP   rn   re   ri   r  codernitydb3.envr   codernitydb3.storager   codernitydb3.indexr   r   r   r   r	   codernitydb3.rr_cacher
   r   r  codernitydb3r   patch_cache_rrDEFAULT_BUFFER_SIZEr   r   r   r   r   r   r   r  r  r  r   r   r   <module>r     s  &   				 				  - , , , , , + + + + + + f f f f f f f f f f f f f f 6 6 6 6 6 6 6 6?{## 7""""""E5666) &6" #
	  	 	 	 	 	N 	 	 	Y Y Y Y Y Y Y Yx>,$ ,$ ,$ ,$ ,$. ,$ ,$ ,$f	 	 	 	 	& 	 	 	    0     r   