banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Rencontres QGIS 2025

L'appel à participation est ouvert jusqu'au 19 janvier 2025!

#1 Mon 24 July 2017 11:44

guil31
Participant actif
Date d'inscription: 22 Jan 2013
Messages: 79

Tests de non regression - Différentiel entre 2 bases

Bonjour,

Je souhaite effectuer le différentiel entre 2 bases de données pour faire des tests de non régression sur mon code python/postgresql.
Les identifiants ne sont pas forcément identiques dans les 2 bases mais la géométrie doit rester stable. Je dois donc me baser sur cette géométrie pour reconnaitre un objet dans les 2 bases. Toutes les autres données attributaires doivent rester stables et c'est ce qu'il faut vérifier.
Donc je souhaite repérer:
- les objets ajoutés
- les objets supprimés
- les modifications attributaires d'un même objet géométrique (qui peut être de type nœud, ligne ou polygone)

J'ai trouvé un ancien post qui évoque un outil de l'IGN (http://logiciels.ign.fr/?-Differentiel,4-)
Cet outil semble intéressant mais j'ai une erreur lorsque je l'exécute en commande en ligne sur des tables postgis.
L'erreur est la suivante: la fonction extent(geometry) n'existe pas
=> Que signifie cette erreur?

Sinon, plutôt que de réinventer la roue, je me dis que ce type d'outil doit bien exister .... Mais mes recherches n'aboutissent pas.
Sinon, une fonction de comparaison de deux tables en se basant sur la géométrie me serait très utile, car je peux encapsuler ça dans du code python.
=> Si quelqu'un a des pistes cela m'intéresse

Claire

Hors ligne

 

#2 Mon 24 July 2017 12:19

Nicolas Ribot
Membre
Lieu: Toulouse
Date d'inscription: 9 Sep 2005
Messages: 1554

Re: Tests de non regression - Différentiel entre 2 bases

Bonjour,

Le message d'erreur doit venir du fait que l'outil est vieux et utilise des noms de fonctions qui ne sont plus supportés par défaut: extent() a été remplacé par st_extent() par ex.

Vous pouvez installer les anciens noms de fonctions en exécutant le fichier legacy.sql qui se trouve dans le répertoire d'installation de Postgis.

Nicolas

Hors ligne

 

#3 Mon 24 July 2017 12:46

tumasgiu
Membre
Lieu: Ajaccio
Date d'inscription: 5 Jul 2010
Messages: 1159

Re: Tests de non regression - Différentiel entre 2 bases

Salut,

pour le fun, peut être qu'on peut faire çà en pur SQL :

Pour la partie ajout/suppresion, des OUTER JOINS font l'affaire :

Code:

SELECT 'création' err, NULL a_id, NULL a_geom, b.id b_id, b.geom b_geom, NULL modifs 
FROM A RIGHT JOIN B ON st_equals(A.geom, B.geom) where A.id is NULL
UNION
SELECT 'suppression', a.id, a.geom, NULL, NULL, NULL 
FROM A LEFT JOIN B ON st_equals(A.geom, B.geom) where B.id is NULL

Pour ce qui est des modifications sur les données attributaires:

On peut utiliser une comparaison par ligne.
A noter que cette comparaison ignore les champs nuls.

Code:

UNION
SELECT 'données modifiées', a.id, a.geom, b.id, b.geom, NULL 
FROM A INNER JOIN B ON st_equals(A.geom, B.geom)
WHERE (a.colA, a.colB...etc) <> (b.colA, b.colB....etc)

Référence : https://www.postgresql.org/docs/9.6/sta … isons.html

Une autre solution pourrait être d'utiliser l'extension hstore, qui permet de gérer des données de type clef valeur :

Code:

UNION
SELECT 'données modifiées', a_id, a_geom, b_id, b_geom, modifs
FROM 
    (SELECT a.id a_id, a.geom a_geom, b.id b_id, b.geom b_geom,
    hstore_to_array((hstore(A) - 'id'::text - 'geom'::text)
                   -(hstore(B) - 'id'::text - 'geom'::text)) modifs
    FROM A INNER JOIN B ON st_equals(A.geom, B.geom)
    ) foo
WHERE array_length(modifs, 1) > 0;

La fonction hstore() permet de créer un hstore à partir d'un record.
L'opération  hstore - 'text' supprime la clef correspondante à 'text' dans le hstore.
L'opération hstore - hstore supprime les couples de l'opérande de droite existant dans l'opérande de gauche.

Référence : https://www.postgresql.org/docs/9.6/static/hstore.html

On peut rendre la requête un peu plus élégante :

Code:

SELECT *
FROM (
SELECT A.id a_id, A.geom a_geom, B.id b_id, B.geom b_geom,
    CASE WHEN A.id IS NOT NULL and B.id IS NOT NULL THEN
    hstore_to_array((hstore(A) - 'id'::text - 'geom'::text)
                   -(hstore(B) - 'id'::text - 'geom'::text))
    ELSE
    NULL
    END modifs
    FROM A FULL OUTER JOIN B ON st_equals(A.geom, B.geom)
) foo
WHERE modifs IS NULL OR array_length(modifs, 1) > 0;

Dernière modification par tumasgiu (Mon 24 July 2017 13:09)

Hors ligne

 

#4 Mon 31 July 2017 08:49

guil31
Participant actif
Date d'inscription: 22 Jan 2013
Messages: 79

Re: Tests de non regression - Différentiel entre 2 bases

Bonjour,

Je suis désolé de ne répondre que maintenant mais j'ai du passer sur un autre sujet dans mon travail.

J'ai essayé la solution de Nicolas pour utiliser l'outil différentiel de l'IGN.

legacy.sql permet bien de passer outre l'erreur: la fonction extent(geometry) n'existe pas

Par contre les résultats ne sont pas ceux escomptés.
Je fais une identification sur le champ geom de données de type ponctuelle.
Le différentiel sort tous les points en objets supprimés et tous les points en objets crées.
Il faut donc que j'investisse plus pour trouver d'où vient le problème.

Je garde la solution de tumasgiu sous le coude.

Claire

Hors ligne

 

#5 Mon 31 July 2017 10:57

Pierre
DesCartesPourUnMondeMeilleur
Date d'inscription: 22 Sep 2005
Messages: 1643

Re: Tests de non regression - Différentiel entre 2 bases

Bonjour,

A titre professionnel, nous utilisons Toad Data Point. Cet outil a un générateur de script de comparaison entre table/bases. Une recherche qwant sur les mots clés "data compare" donne aussi d'autres résultats d'acteurs logiciel sur le marché. En effet, peut-être ne vaut-il pas de réinventer la roue.

Sinon pour al solution SQL, passez-vous par des dblinks entre les deux bases ?

Cordialement


art X I. Déclaration des Droits de l’Homme et du Citoyen 1789
La libre communication des pensées et des opinions est un des droits les plus précieux de l’Homme : tout Citoyen peut donc parler, écrire, imprimer librement, sauf à répondre de l’abus de cette liberté, dans les cas déterminés par la Loi.

Hors ligne

 

#6 Mon 31 July 2017 11:31

n314
Participant assidu
Date d'inscription: 6 Sep 2005
Messages: 706

Re: Tests de non regression - Différentiel entre 2 bases

Au cas où, une autre approche.

J'ai des souvenirs de concepts de https://fr.wikipedia.org/wiki/Fonction_de_hachage (md5 est un exemple) qui s'appliquent à la géométrie, à partir d'une géométrie on obtient une empreinte/clé/signature/condensat unique.

A ne pas confondre cependant avec https://fr.wikipedia.org/wiki/Geohash.

Exemple de début de recherche
https://gis.stackexchange.com/questions … r-gis-data
https://knowledge.safe.com/questions/24 … h-fme.html
https://github.com/pkinney/spatial_hash_ex
https://trac.osgeo.org/postgis/ticket/1014

Géométrie-> ToText -> Hash du texte -> stockage du condensat -> comparaison des condensats
ou
https://smathermather.com/2009/10/22/un … continued/

Hors ligne

 

Pied de page des forums

Powered by FluxBB