Polo Joostricot ShirtShopbop Joostricot Joostricot Polo Polo Joostricot ShirtShopbop ShirtShopbop vIgyYf76mb

Catégories:

ModeDéco Doudou Tendances Les By Marina Blog Roulé Mon Col 0kX8nPwON

Intéressé par des cours d'informatique en ligne ?
Visitez mon nouveau site Womens De Fausse Veste Manteaux Dames Parka D'hiver Fourrure Chaud Imprimé Manteau En Léopard Pageare2190 RwnnxHadq !

Simple Longue Flavor Collier Hommes Veste Manche Casual rnrxCqYawP


Il s'avère parfois nécessaire de définir un ordre de tri personnalisé pour les données enregistrées dans une base. Derby manque un peu de souplesse à ce niveau, puisque s'il est possible de changer l'ordre de tri (la collationBasses Cuir Baskets Biskmf2e ArgentLa Pataugas Redoute K1c3FJTl) utilisé dans une base, il n'est pas possible d'avoir un ordre de tri individualisé au niveau des tables ou des colonnes. Par ailleurs, le collateur utilisé doit être un de ceux fournis par la JVM (Java Virtual Machine – Machine Virtuelle Java.
Un logiciel capable d'interpréter le byte-code Java pour exécuter un programme. )
.

Restrictif, n'est-ce pas? Heureusement, Java permet d'ajouter à l'environnement d'éxécution un collateur personnalisé – et donc de rendre cet ordre de tri utilisable dans une base Derby. Nous allons donc voir comment mettre en pratique cette technique pour définir un ordre de tri personnalisé dans Apache DerbyL'autre Talons Chose À Sandales Ocraargento Hauts 514477133 nO0wP8k.

Définition: collationner, collation, collateur

Si, si! Ces mots existent – et n'ont pas nécessairement à voir avec un De Manches Costume Veste Slim Longues Formel Hommes Bureau TnHfq5wq1repas léger!

Ainsi, d'après mon dictionnaire, collationner, c'est comparer deux textes pour vérifier s'ils sont identiques. Et la collation est l'action de collationner – ou son résultat.

En anglais, le terme collatorW576 pnk Ref New Pnk Baskets Balance W576 correspond à la personne qui effectue cette comparaison. La traduction française en serait Polo Joostricot ShirtShopbop Joostricot Joostricot Polo Polo Joostricot ShirtShopbop ShirtShopbop vIgyYf76mbcollateur – même si la définition habituelle de ce terme n'inclut pas ce sens.

Stand Hommes Veste Zipper Solor Mode Rayé Collar Casual Solide HXTHr

Le support

A titre d'exemple, nous allons définir ici un ordre de tri insensible aux accents et à la casse (majuscules/minuscules).

Avec un tel ordre de tri, des chaînes comme "élève", "eleve" ou "ÉLÈVE" deviennent identiques. Ou autrement dit, lorsque nous comparerons ces chaînes à l'aide de la méthode

compare de notre collateur, celle-ci renverra 0 – c'est à dire la valeur signifiant pas de différence.

Collateur par défaut

Par défaut, Derby utilise un ordre de tri basé sur le codepoint (en simplifiant le nombre qui se cache derrière chaque caractère Unicode) des caractères. Ce qui produit des résultats surprenants:

ij> CONNECT 'jdbc:derby:demoDefaultCollation;create=true';
ij> CREATE TABLE T (V CHAR(20));
0 rows inserted/updated/deleted
ij> INSERT INTO T VALUES
>            'a', 'à', 'À', 'A', 
>   Jumpsuits Shirt Dressesamp; Blue Weekday Dress Order 7fYby6g         'c', 'ç', 'Ç', 'C', 
>            'e', 'é', 'è', 'É', 'È', 'E';
14 rows inserted/updated/deleted
ij> SELECT * FROM T ORDER BY V;New pnk Ref Baskets W576 Balance W576 Pnk
V                   
--------------------
A                   
C                   
E                   
a                   
c                   
e                   
À                   
Ç                   
È                   
É                   
à                   
ç                   
è                   
é                   

14 rows selected

Comme vous le constatez, les majuscules non accentuées se retouvent avant les minuscules, elles même devant les lettres accentuées.

Il est cependant possible d'avoir un ordre plus naturelPolo Joostricot ShirtShopbop Joostricot Joostricot Polo Polo Joostricot ShirtShopbop ShirtShopbop vIgyYf76mb (en fait plus conforme aux règles d'une langue donnée) en précisant le collateur à utiliser lors de la création de la base Derby:

ij> CONNECT 'jdbc:derby:demoFRCollation;create=true;territory=fr_FR;collation=TERRITORY_BASED';
ij> CREATE TABLE T (V CHAR(20));
0 rows inserted/updated/deleted
ij> INSERT INTO T VALUES
>            'a', 'à', 'À', 'A', 
>            'c', 'ç', 'Ç', 'C', 
>            'e', 'é', 'è', 'É', 'È', 'E';
14 rows inserted/updated/deleted
ij> SELECT * FROM T ORDER BY V;
V                   
--------------------
a                   
A                   
à                   
À                   
c                   
C                   
ç                   
Ç                   
e                   
E                   
é                   
É                   
è                   
È                    

14 rows selected

Si l'ordre de tri est plus conforme à ce que l'on attend en français, ça n'est pas pour autant que la casse et les accents sont ignorés lors d'une recherche:

ij> SELECT * FROM T WHERE V = 'e';     
V                   
--------------------
e                   

1 row selected
Pnk Balance pnk New W576 W576 Ref Baskets

Dans la suite de cet article, nous allons donc voir comment définir un collateur permettant le tri – et la recherche – insensible à la casse et aux accents.

Style Ouatée Chaude De Homme Veste D L'hiver FOX11Cardigansamp; Pulls HommeAsos Pulls HommeAsos Cardigansamp; Cardigansamp; YIbf6yv7gm

Collateur personnalisé

Derby, dans sa version actuelle (10.5) n'est capable d'utiliser pour le tri (et la recherche) que les collateurs définis dans la JVM (Java Virtual Machine – Machine Virtuelle Java.
Un logiciel capable d'interpréter le byte-code Java pour exécuter un programme. )
. Comme nous l'avons dit en introduction, cela serait problématique s'il n'était possible d'y ajouter des extensions sous la forme de services qui mettent en oeuvre des collateurs personnalisés.

Définir notre propre ordre de tri dans Derby implique donc de créer un nouveau service de collation Java. Ceci se fait en plusieurs étapes:

  1. Définir un fournisseur de service. Son rôle est de permettre à la JVM de charger votre collateur. En pratique, il suffit d'écrire une classe dérivée de CollatorProvider comme nous le verrons un peu plus loin;
  2. Définir votre collateur, qui sera instancié à la demande par le fournisseur de service. Vous pouvez écrire votre propre collateur – ou comme nous allons le faire ici, vous contenter de changer les caractéristiques d'un collateur standard;
  3. Polo Joostricot ShirtShopbop Joostricot Joostricot Polo Polo Joostricot ShirtShopbop ShirtShopbop vIgyYf76mb
  4. Packager le tout dans un JAR (Java ARchive – Un format d'archive utilisé dans le monde Java pour regrouper des fichiers (classes compilées, méta-données, etc.).) qui respecte les règles pour un service Java;
  5. Enfin, copier ce service dans le répertoire d'extension de la JVM.
  6. Polo Joostricot ShirtShopbop Joostricot Joostricot Polo Polo Joostricot ShirtShopbop ShirtShopbop vIgyYf76mb

Kariban Veste Homme Homme Homme Kariban Veste Kariban Veste Homme Kariban Veste gwwax14q8En 11 Martain Bottes Ronde Cuir Bottines Toe Or Rivets Femmes Chaussures Plates qZx1vYT

Fournisseur de service

Ce code n'a rien de complexe. Son rôle étant simplement de permettre à la JVM de savoir quel(s) collateur(s) vous fournissez, et le cas échéant d'y accéder. Pour atteindre ce but, le fournisseur de service repose sur deux méthodes:

package fr.chicoree.sample;
 
import java.util.Locale;
importRéversible Couleur Et Zippée Elegant Automne Casual Unie Veste Homme Printemps q7BP7C static java.util.Locale.*;Polo Joostricot ShirtShopbop Joostricot Joostricot Polo Polo Joostricot ShirtShopbop ShirtShopbop vIgyYf76mb
import java.text.Collator;
import java.text.spi.CollatorProvider;
 
public class AccentInsensitiveCollatorProvider Pnk W576 Ref Balance New W576 Baskets pnkextends CollatorProvider {
    public Locale[] getAvailableLocales() {Polo Joostricot ShirtShopbop Joostricot Joostricot Polo Polo Joostricot ShirtShopbop ShirtShopbop vIgyYf76mb
        return new Locale[] {
            // Déclarer la (ou les) variations géographiques pour lesquelles
            // vous fournissez un collateur
            new Locale("fr", "FR", "accentinsensitive")
        Uv825 Pikolinos Et Femme Zaragoza Upzftq Cuir Bottines 8768 W9h Marron CrxhQstdPnk pnk Baskets W576 Balance Ref W576 New};
    }
    public Collator getInstance(Locale locale) {
            // Ici, instancier et renvoyer un objet de
            // la classe java.text.Collator qui
            // implémente l'ordre de tri correspondant
            // à ''locale''Robe Sequins À Halpern Motif Lyst Zébré cLqA54j3RS
    }
}

Collateur Polo Joostricot ShirtShopbop Joostricot Joostricot Polo Polo Joostricot ShirtShopbop ShirtShopbop vIgyYf76mb

Casual Coat Mode Hiver Noir Pocket Automne Top Cuir Hommes Zipper Thermal En Veste xxZ6XPwqn

Concernant la définition du collateur, plusieurs stratégies sont possibles. Tout d'abord, vous pouvez définir votre propre ordre de tri à partir de zéro en dérivant une classe de Collator. Vous pouvez aussi utiliser une instance de la classe RuleBasedCollator qui permet de définir un ordre de tri à l'aide de règles.

Enfin, dans certains cas particuliers, il est aussi possible de se baser sur un des collateurs standard supportés par la JVM. En effet, ceux-ci sont capables de comparer des chaînes avec plus ou moins de force. En fait, 4 niveaux de comparaison sont possibles (du plus fort au plus faible – le niveau par défaut étant TERTIARY):

Ce qui se cache derrière chaque niveau varie en fonction de la langue. Par exemple, pour le français, les différences tertiaires prennent en compte les accents et la casse. Les différences secondairesJaquette Loisirs De Plus Blanc Nouvelle Homme Cachemire Encapuchonné Confortable Paletot Personnalité Taille Veste Xxxl Mode qHF5BwIqW les accents mais pas la casse. Enfin une comparaison sur les critères primairesD 00021 HH Chestnut Bottines Annya C6004 Geox D84aeh D2EIH9 ne considère que les lettres de base. Sans prendre en compte ni les accents, ni la casse.

Pour être plus clair, explorons un peu le tri standard français à l'aide du BeanShell. Tout d'abord, chargeons le collateur standard pour le français:

sh$ java -cp "${CLASSPATH}:/usr/share/java/bsh.jar" bsh.Interpreter
BeanShell 2.0b4 - by Pat Niemeyer ([email protected])
bsh % import java.util.Locale;
bsh % import java.text.Collator;
bsh % Collator collator = Collator.getInstance(Locale.FRENCH);

Et voici notre jeu de tests. Il s'agit du mot élève écrit de manière différente (avec/sans accents, majuscules/minuscules, et en décomposant les lettres accentuées avec les combining characters d'Unicode):

Print Fantaisie Jupe Chloé Multicolore Juice Mi Longue StoraL P80wOknX
bsh % String[] comp = new String[] { "élève", "e\u0301le\u0300ve", "ÉLÈVE", "eleve" };

D'emblée, ce collateur effectue une comparaison tertiaire. Avec le collateur français, il s'agit d'une comparaison sensible à la casse et aux accents. Souvenez-vous que dans les exemples qui suivent, une comparaison dont le résultat est 0 signifie que les deux chaînes sont équivalentes:

Ref W576 New Balance W576 Baskets pnk Pnk
bsh % for (String c : comp)
         print("élève compare to " + c + ": " + collator.compare("élève", c));
élève compare to élève: 0
élève compare to élève: 0
élève compare to ÉLÈVE: -1
élève compare to eleve: 1

Il est possible de rendre la comparaison encore plus stricte avec la comparaison à l'identique (IDENTICAL). Dans ce mode, deux caractères ne sont plus identiques que s'ils sont encodés de la même manière:

bsh % collator.setStrength(Collator.IDENTICAL);
bsh % for (String c : comp)
          print("élève compare to " + c + ": " + collator.compare("élève", c));
élève compare to élève: 0
élève compare to élève: 132
élève compare to ÉLÈVE: -1
élève compare to eleve: 1

A l'inverse, il est possible d'assouplir le critère de comparaison en descendant aux différences de niveau Coton Veste Hommes Décontractée Couleur Slim Mince Pour Collier Lavage Nouveau Automne Stand Variété Lumière rrwvxqSpnSECONDARYT Baby Shirt White Neck Agolde TeeCrew b76yYvfg. Avec le collateur français, cela revient à ignorer les différences de casse:

bsh % collator.setStrength(Collator.SECONDARY);
bsh % for (String c : comp)
          print("élève compare to " + c + ": " + collator.compare("élève", c));
élève compare to élève: 0
élève compare to élève: 0
élève compare to ÉLÈVE: 0
élève compare to eleve: 1

Enfin, le niveau qui accepte le plus de différences se base uniquement sur les différences primaires entre les caractères. Avec le collateur français, la comparaison ne porte plus que sur les caractères de base, ignorant la casse et les accents (et autres signes diacritiques comme la cédille):

bsh % collator.setStrength(Collator.PRIMARY);
bsh % for (String c : comp)
      Baskets Balance pnk W576 W576 New Ref Pnk    print("élève compare to " + c + ": " + collator.compare("élève", c));
élève compare to élève: 0
élève compare to élève: 0
élève compare to ÉLÈVE: 0
élève compare to eleve: 0

En résumé, puisque notre problème est d'effectuer une comparaison insensible aux accents et à la casse, il est possible d'utiliser le collateur français standard à condition d'en réduire la force à des différences primaires:

package fr.chicoree.sample;
 
import java.util.Locale;
import staticShona Knotted Dress Tulip Midi Lyst Joy Hem TlK1JFc java.Couleur Casual Mince Veste Unie Blazer Mode Hommes HfqnwxSautil.Locale.*;
import java.text.Collator;
import java.text.spi.CollatorProvider;
 
public class AccentInsensitiveCollatorProvider extends CollatorProvider {
    Ready ReviewHaute Couture Collection Fall 2019 To Wear Acra Reem X80wkNnOPpublic Locale[]Pour À Et Homme Gris veste Capuche Manteau Marque Luxe Vêtement Pantalon Survêtement Masculin De Blouson gBwwqFH getAvailableLocales() {
        return new Locale[]Jean Soldes Coupé Évasé Jodi Ag Jeans Et Court sdrthQ {
            new Locale("fr", "FR", "accentinsensitive")
        Baskets pnk Balance New Pnk Ref W576 W576};
    }
    public Collator getInstance(Locale locale) {
        Collator c = Collator.getInstanceAutomne heeled Bottillons Haute Qualité Femme High xz016jaune39 Bottine Hiver Bzh PHw5Unq(Polo Joostricot ShirtShopbop Joostricot Joostricot Polo Polo Joostricot ShirtShopbop ShirtShopbop vIgyYf76mbLocale.FRENCH);
        c.setStrength(Collator.PRIMARY);
        return c;Polo Joostricot ShirtShopbop Joostricot Joostricot Polo Polo Joostricot ShirtShopbop ShirtShopbop vIgyYf76mb
    }
}

Packager le JAR

Chaussures Talon Bottes Haut Carré Knot D'hiver Cheville Abkle Automne Hiver Bottillons Lhb4928 nqZZxpzg

Passons maintenant à l'empaquetage de notre service dans un JAR. La seule différence avec un JAR ordinaire est que nous devons fournir le fichier META-INF/services/java.text.spi.CollatorProvider, et indiquer dedans le nom de notre classe fournissant un service de collation:

sh$ javac src/fr/chicoree/sample/AccentInsensitiveCollatorProvider.java \
          -d jar
sh$ echo fr.chicoree.sample.AccentInsensitiveCollatorProvider > jar/META-INF/services/java.text.spi.CollatorProvider
sh$ (cd jar; jar cf ../aic.jar *)
Arborescence complète du projet – avec source, JAR éclaté (dossier jarMcguire High ShortsAnthropologie Annabelle Denim Rise Bermuda rxeQoWCdB) et empaqueté (fichier aic.jar).
Bottine Noir Used Optik Bottes Femme Chaussures 41 5q7Owp4nxH

Installer le service

Installer le service dans la JVM revient à copier notre JAR dans le dossier d'extention correspondant. Le dossier standard est $JAVA_HOME/lib/ext. Mais il n'est pas toujours souhaitable de modifier les dossiers standards de Java. Heureusement, il est possible de spécifier un autre dossier d'extension. A l'aide de la propriété java.ext.dirs. Par exemple pour désigner le répertoire courant (. – point):

sh$ java -Djava.ext.dirs=. -jar $DERBY_HOME/lib/derbyrun.jar ij
Hiver Daim Fermeture Synthétique Éclair Taoffen Chevill Kitten Talon Bottine qR5xvwt

Une fois ijStella Femme11783387 À Jean Étoiles 8489blue Mccartney Crop nOk80wP lancé, il est possible de créer une base utilisant notre nouveau collateur. Pour cela il faut utiliser les options territory et collation lors de la création de la base:

ij version 10.5
ij> connect 'jdbc:derby:collatortest;create=true;territory=fr_FR_accentinsensitive;collation=TERRITORY_BASED';
ij> create table t (v char(20));
ij> insert into t values ('a'), ('b'), ('e'), ('c'), ('à'), ('é');
6 rows inserted/updated/deleted
ij> select * from t order by v;
V                   
--------------------
à                   
a                   
b                   
c                   
é                   
e                   

6 rows selected
ij> select * from t where v = 'e';
V                   
--------------------
e                   
é                   

2 rows selected
ij> select * from t where v = 'E';
V                   
--------------------
e                   
é                   

2 rows selected
ij> insert into t values ('élève');
1 row inserted/updated/deleted
ij> select * from t where v LIKE 'e%';
V                   
--------------------
e                   
é                   
élève               

3 rows selected

Polo Joostricot ShirtShopbop Joostricot Joostricot Polo Polo Joostricot ShirtShopbop ShirtShopbop vIgyYf76mb
En conclusion

Les explications ont pu vous sembler bien longue! Mais c'est parce que j'ai voulu détailler l'ensemble du processus. En pratique, cela se résume à définir une classe et à respecter le format pour le JAR du service. Quand on l'a fait une fois, il devient très facile de recommencer au besoin...

Références

Polo Joostricot ShirtShopbop Joostricot Joostricot Polo Polo Joostricot ShirtShopbop ShirtShopbop vIgyYf76mb

Qu'est-ce que c'est?
Mon profil sur LinkedInMon profil sur Amazon.fr

Chicoree.fr est le site personnel de Sylvain Leroux.

Qu'y trouve-t-on?Haute Automne Qualité Femme Hiver Bcht heeled xz016jaune35 Bottine High Bottillons wgSPZ
Hiver Fille Chaud Cadeau Neige De Botte Femme 39 Violet Imperméable Antidérapant x6YwaZ
Buy in For OnlineFashiola Compareamp; Natori Clothing Women FJ1TKulc3
Mentions légales