Tables système index vers json

méthode qui créé un fichier json à partir des index

<code 4D>
//Index_StructureToObject
//lecture des index et conversion en objet
// _USER_INDEXES:
// INDEX_ID VARCHAR Numéro d’index
// INDEX_TYPE INT32 Type d’index(1=BTree/Composite, 3=Cluster/Mots-clés, 7=Auto, 8=Auto pour champ Objet)
// KEYWORD BOOLEAN Vrai si l’index est un index de mots-clés, faux sinon
// UNIQUENESS BOOLEAN Vrai si l’index impose une contrainte d’unicité, faux sinon
// _USER_IND_COLUMNS:
// INDEX_ID VARCHAR Numéro d’index
// INDEX_NAME VARCHAR Nom d’index
// TABLE_NAME VARCHAR Nom de table avec index
// COLUMN_NAME VARCHAR Nom de colonne avec index
// COLUMN_POSITION INT32 Position de colonne dans l’index
// TABLE_ID INT64 Numéro de table avec index
// COLUMN_ID INT64 Numéro de colonne
C_OBJET($indexes_o)
C_OBJET($index_o)
TABLEAU OBJET($index_ao;0)
C_OBJET($field_o;0)
TABLEAU OBJET($field_ao;0)

TABLEAU TEXTE($indexID_at;0x0000)
TABLEAU TEXTE($indexName_at;0x0000)
TABLEAU ENTIER LONG($position_al;0x0000)
TABLEAU ENTIER LONG($table_al;0x0000)
TABLEAU ENTIER LONG($column_al;0x0000)
TABLEAU BOOLÉEN($keyword_ab;0x0000)
TABLEAU BOOLÉEN($unique_ab;0x0000)
TABLEAU ENTIER LONG($type_al;0x0000)

FIXER ACTIVATION ASSERTIONS(Vrai)
TRACE

Début SQL
SELECT A.INDEX_ID, A.INDEX_NAME, A.COLUMN_POSITION, A.TABLE_ID, A.COLUMN_ID, B.INDEX_TYPE, B.KEYWORD, B.UNIQUENESS
FROM _USER_IND_COLUMNS A, _USER_INDEXES B
WHERE B.INDEX_ID = A.INDEX_ID
INTO :$indexID_at, :$indexName_at, :$position_al, :$table_al, :$column_al, :$type_al, :$keyword_ab, :$unique_ab;
Fin SQL
$zz:=Compter dans tableau($keyword_ab;Vrai)

TABLEAU MULTI TRI($indexID_at;>;$position_al;>;$indexName_at;$table_al;$column_al;$type_al;$keyword_ab;$unique_ab)
TABLEAU ENTIER LONG($columnInIndex_al;0x0000)
$indexEnd_b:=Faux
$indexes_o:=JSON Parse("{}")
$index_o:=JSON Parse("{}")
$field_o:=JSON Parse("{}")
Boucle ($i_l;1;Taille tableau($indexID_at))
$indexName_t:=$indexName_at{$i_l} //ignored
$indexSQLType_l:=$type_al{$i_l}
$position_l:=$position_al{$i_l}
$table_l:=$table_al{$i_l}
AJOUTER À TABLEAU($columnInIndex_al;$column_al{$i_l})

//vérif champ unique => index unique
Si ($unique_ab{$i_l})
$nomChamp_t:=Nom du champ($table_l;$column_al{$i_l})
LIRE PROPRIÉTÉS CHAMP($table_l;$column_al{$i_l};$type_l;$len_l;$idx_b;$unique_b)
ASSERT($unique_b=$unique_ab{$i_l})
ASSERT($nomChamp_t=“PK@”)
Fin de si

//index SQL -> 4D translation
//SQL : 1=BTree / Composite, 3=Cluster / Mots-clés, 7=Auto, 8=Auto pour champ Objet
//CREATE INDEX : -1 = Mots-clés, 0 = par défaut, 1 = B-Tree standard, 3 = BTree cluster
Au cas ou
: ($indexSQLType_l=1) //1=BTree/Composite
$index4DType_l:=1 //1 = B-Tree standard
Si (Taille tableau($columnInIndex_al)>1)
$codeName_t:=“cp”
Sinon
$codeName_t:=“bt”
Fin de si
: ($indexSQLType_l=3) //3=Cluster/Mots-clés
Si ($keyword_ab{$i_l})
$index4DType_l:=-1 //-1 = Mots-clés
$codeName_t:=“kw”
Sinon
$index4DType_l:=3 //3 = BTree cluster
$codeName_t:=“cl”
Fin de si
: ($indexSQLType_l=7) //7=Auto
$index4DType_l:=0 //0 = par défaut
$codeName_t:=“au”
//: ($indexSQLType_l=8) //8=Auto pour champ Objet
//#TODO en attente v15, tester si type du champ = Est un objet
Sinon
ASSERT(Faux;“unknown index type”)
Fin de cas
Au cas ou
: ($i_l=Taille tableau($indexID_at))
$indexEnd_b:=Vrai //fin description
: ($indexID_at{$i_l}=$indexID_at{$i_l+1}) //composite
$indexEnd_b:=Faux
Sinon
$indexEnd_b:=Vrai //fin description
Fin de cas

Si ($indexEnd_b)
Si (Vrai) //$indexName_t="")
//Passez dans nomIndex le nom de l’index à créer.
// Nommer les index est nécessaire
// si plusieurs index de types différents
// peuvent être associés à un même champ
// et si vous souhaitez pouvoir les supprimer individuellement
// à l’aide de la commande SUPPRIMER INDEX.
// Si l’index nomIndex existe déjà, la commande ne fait rien.
$indexName_t:=“T”+Chaîne($table_l)+"."+$codeName_t
Boucle ($j_l;1;Taille tableau($columnInIndex_al))
$indexName_t:=$indexName_t+".C"+Chaîne($columnInIndex_al{$j_l})
Fin de boucle
Fin de si

OB FIXER($index_o;“name”;$indexName_t)
OB FIXER($index_o;“table”;$table_l)
OB FIXER($index_o;“type”;$index4DType_l)
OB FIXER($index_o;“unique”;$unique_ab{$i_l})
Boucle ($j_l;1;Taille tableau($columnInIndex_al))
OB FIXER($field_o;“field”;$columnInIndex_al{$j_l})
OB FIXER($field_o;“position”;$j_l)
AJOUTER À TABLEAU($field_ao;OB Copier($field_o))
Fin de boucle
OB FIXER TABLEAU($index_o;“column”;$field_ao)
//ob fixer($index_o;“type”;$indexType_t)
EFFACER VARIABLE($field_ao)
EFFACER VARIABLE($columnInIndex_al)
AJOUTER À TABLEAU($index_ao;OB Copier($index_o))
Fin de si

Fin de boucle
OB FIXER TABLEAU($indexes_o;“index”;$index_ao)
FIXER TEXTE DANS CONTENEUR(JSON Stringify($indexes_o;*))
//_

</code 4D>

Oublié de mettre la “contraire”…
D’ores et déjà, ça me permet de définir hors de la structure des index que je considère “optionnels”, par opposition aux “obligatoires” (~ clés primaires). Quand j’ouvre un fichier de données non indexé, les index “obligatoires” sont toujours construits automatiquement, par contre je peux déporter la construction des optionnels après le Sur ouverture ou Sur démarrage serveur. Gain de temps appréciable.
Plus tard je pense utiliser des index optionnels adaptés à l’usage qui est fait des données selon le site.

<code 4D>
//Index_ObjectToStructure (path_t) -> txt
//créé les index définis par le fichier json $1
//cf Index_StructureToObject
C_TEXTE($0)
C_TEXTE($1)
C_TEXTE($error_t)

C_OBJET($indexes_o)
C_OBJET($index_o)
TABLEAU OBJET($index_ao;0)
C_OBJET($field_o;0)
TABLEAU OBJET($field_ao;0)

$nmc_t:=Nom méthode courante
$params_l:=Nombre de paramètres
$error_t:=""
$path_t:=$1
Si ($error_t="")
Si (Tester chemin acces($path_t)#Est un document)
$error_t:=$nmc_t+" $1 invalid path"
Fin de si
Fin de si
Si ($error_t="")
$json_t:=Document vers texte($path_t)
$indexes_o:=JSON Parse($json_t)
Fin de si

OB LIRE TABLEAU($indexes_o;“index”;$index_ao)
Boucle ($i_l;1;Taille tableau($index_ao))
$index_o:=OB Copier($index_ao{$i_l})
$indexName_t:=OB Lire($index_o;“name”;Est un texte)
$index4DType_l:=OB Lire($index_o;“type”;Est un entier long)
$table_l:=OB Lire($index_o;“table”;Est un entier long)
ASSERT(Est un numéro de table valide($table_l);"Invalid table number "+Chaîne($table_l))
Si (Est un numéro de table valide($table_l))
$table_p:=Table($table_l)
Fin de si

OB LIRE TABLEAU($index_o;“column”;$field_ao)
TABLEAU POINTEUR($columnInIndex_ap;0x0000)
TABLEAU ENTIER LONG($order_al;0x0000)
Boucle ($j_l;1;Taille tableau($field_ao))
$field_o:=OB Copier($field_ao{$j_l})
$field_l:=OB Lire($field_o;“field”;Est un entier long)
$pos_l:=OB Lire($field_o;“position”;Est un entier long)
Si (Est un numéro de champ valide($table_l;$field_l))
AJOUTER À TABLEAU($columnInIndex_ap;Champ($table_l;$field_l))
AJOUTER À TABLEAU($order_al;$pos_l)
Fin de si
Fin de boucle
Si (Taille tableau($field_ao)>1)
TRIER TABLEAU($order_al;$columnInIndex_ap;>)
Fin de si
CRÉER INDEX($table_p->;$columnInIndex_ap;$index4DType_l;$indexName_t)
Fin de boucle
//_
</code 4D>