Validatie

Overzicht

De validatielaag vormt de kwaliteitscontroleur van Wasstraat Archeologische Data. Dit onderdeel voert systematische controles uit op alle opgeslagen gegevens en vergewist zich van semantische integriteit en logische consistentie.

Kernfunctionaliteiten

1. Gegevenslogica Validatie

Controle van gegevens tegen voorafgestelde logische regels:

Validatieregels Voorbeelden:
──────────────────────────────────────────────────

1. Datumlógica
   ├─ Vondstdatum  Verwerkingsdatum
   ├─ Onderzoeksstartdatum  Onderzoekseindatum
   └─ Periode moet chronologisch plausibel zijn

2. Geografische lógica
   ├─ Coördinaten moeten in Nederland liggen
   ├─ Graafvak moet binnen onderzoeksgebied liggen
   └─ Diepte moet positief zijn

3. Semantische lógica
   ├─ Materiaaltype moet geldig zijn
   ├─ Artefacttype moet erkend zijn
   └─ Bouwperiode moet geldig zijn

4. Relationele lógica
   ├─ Artefact moet aan een locatie gekoppeld zijn
   ├─ Verwijzingen moeten bestaan
   └─ Hiërarchie moet consistent zijn

Voorbeeld Validatieregels

from validatie import ValidationRule, Validator

# Definitie van validatieregels
regel_datum = ValidationRule(
    name="vondstdatum_logisch",
    check=lambda record: record.get('vondstdatum') <= record.get('verwerkingsdatum'),
    error_message="Vondstdatum kan niet na verwerkingsdatum liggen"
)

regel_coördinaten = ValidationRule(
    name="coördinaten_nederland",
    check=lambda record: (50.75 <= record.get('latitude') <= 53.5 and
                         3.4 <= record.get('longitude') <= 7.2),
    error_message="Coördinaten liggen buiten Nederlands grondgebied"
)

# Toepassing
validator = Validator([regel_datum, regel_coördinaten])
resultaten = validator.validate(dataset)

2. Caching Mechanisme

Intelligente opslag van validatieresultaten ter vermindering van computationele overhead:

Primera validatie:
┌─────────────────────────────┐
  Record WSTR-001            
  ├─ Datum-regel: PASS       
  ├─ Coördinaten-regel: PASS 
  ├─ Materiaal-regel: PASS   
  └─ Caching  Opslaan
└─────────────────────────────┘

Vervolgzoeking (uit cache):
┌─────────────────────────────┐
  Record WSTR-001            
  ├─ Cache Hit!              
  ├─ Resultaat: PASS (snel)  
  └─ Geen re-berekening      
└─────────────────────────────┘

Cache-Structuur

{
  "cache_entry": {
    "record_id": "WSTR-001",
    "timestamp_validatie": "2024-03-09T10:30:00Z",
    "timestamp_record_wijziging": "2024-03-08T15:45:00Z",
    "validatie_status": "PASS",
    "regels_gecontroleerd": [
      "vondstdatum_logisch",
      "coördinaten_nederland",
      "materiaal_geldig"
    ],
    "cache_geldig_tot": "2024-03-16T10:30:00Z"
  }
}

3. Cache-Consistentie Beheer

Automatische invalidatie en vernieuwing van cache bij gegevenswijzigingen:

Scenario: Record Wijziging
         
         
┌────────────────────────────┐
 Detectie: Record Modified  
 (timestamp check)          
└────────────┬───────────────┘
             
             
┌────────────────────────────┐
 Cache Invalidation         
 (gerelateerde records)     
└────────────┬───────────────┘
             
             
┌────────────────────────────┐
 Herschedulering            
 (validatie opnieuw qeued)  
└────────────────────────────┘

Invalidatie-Triggers

  • Record wijzigd
  • Gerelateerde records wijzigen
  • Validatieregels bijgewerkt
  • Cache TTL (Time To Live) verstreken

4. Gelijktijdigheid Beheer

Robuuste afhandeling van concurrent verwerkende threads en processes:

Thread 1                     Thread 2
────────                     ────────
Validate Record A            Validate Record A
                                     ├─ Read Cache                 ├─ Read Cache
     (miss)                        (miss)
                                     ├─ Lock Record                     (acquire)                     (waiting...)
                                     ├─ Validate                        (compute)                                                         ├─ Write Cache                                                     ├─ Unlock                                                       (acquire lock)
                                                                  ├─ Read Cache
                                  (hit!)
                                                                  ├─ Return Result
                                 

Implementatie

from threading import Lock, RLock
from queue import Queue

class ThreadSafeValidator:
    def __init__(self):
        self.cache = {}
        self.locks = {}  # Per-record locks
        self.lock = RLock()  # Global lock

    def validate(self, record_id):
        # Verkrijg record-specifieke lock
        with self._get_lock(record_id):
            # Controleer cache
            if record_id in self.cache:
                return self.cache[record_id]

            # Voer validatie uit
            resultaat = self._validate_impl(record_id)

            # Cache resultaat
            self.cache[record_id] = resultaat
            return resultaat

Architectuur

┌─────────────────────────────────┐
  Opgeslagen Data (SingleStore)  
└────────────┬────────────────────┘
             
             
┌─────────────────────────────────┐
  Validatieregels Basisbibliotheek
  ├─ Datumvalidatie              
  ├─ Geografische validatie      
  ├─ Semantische validatie       
  └─ Relationele validatie       
└────────────┬────────────────────┘
             
             
┌─────────────────────────────────┐
  Validatie Engine               
├─────────────────────────────────┤
  Regeltoepassing               
  Cachecontrole                 
  Thread-Safety                 
  Gelijktijdighed Management    
└────────────┬────────────────────┘
             
             
┌─────────────────────────────────┐
  Cache Manager                  
├─────────────────────────────────┤
  Resultaat-caching             
  TTL Management                
  Invalidatie-logica            
  Lock Coordination             
└────────────┬────────────────────┘
             
             
┌─────────────────────────────────┐
  Validatierapporten & Logging   
└─────────────────────────────────┘

Validatie-Niveaus

Niveau 1: Syntactische Validatie

Controle van basisgegevensstructuur:

 Verplichte velden aanwezig
 Gegevenstypen correct
 Geen null-waarden waar verboden

Niveau 2: Semantische Validatie

Controle van betekenis en inhoud:

✓ Waarden liggen in toegestaan bereik
✓ Gekenmerkte categorieën
✓ Referentie-integriteit

Niveau 3: Logische Validatie

Controle van relaties en consistentie:

✓ Temporale consistentie (datums)
✓ Geografische plausibiliteit
✓ Semantische coherentie

Rapporten

Validatiesamenvattingen

{
  "validatierapport": {
    "moment": "2024-03-09T10:30:00Z",
    "dataset": "Alle records",
    "statistieken": {
      "totaal_records": 12500,
      "succesvol": 12475,
      "waarschuwingen": 15,
      "fouten": 10,
      "succes_percentage": 99.88
    },
    "fouten": [
      {
        "record_id": "WSTR-001",
        "regel": "vondstdatum_logisch",
        "ernst": "KRITIEK",
        "boodschap": "Vondstdatum na verwerkingsdatum"
      }
    ],
    "waarschuwingen": [
      {
        "record_id": "WSTR-042",
        "regel": "coördinaten_precisie",
        "ernst": "WAARSCHUWING",
        "boodschap": "Coördinaten hebben lage precisie"
      }
    ]
  }
}

Best Practices

Regelconfiguratie

Validatieregels moeten zorgvuldig worden ingesteld. Te strenge regels kunnen valide data verwerpen; te soepele regels laten fouten door.

  • Test nieuwe regels op steekproefgegevens
  • Houdt regelwijzigingen in versiecontrole
  • Document alle aangepaste regels
  • Voer periodieke validatie-audits uit

Performance

Cache-instellingen afstemmen op update-frequentie: - Weinig updates: langere TTL (meer cache-hits) - Veel updates: kortere TTL (meer nauwkeurigheid)

Integratie

De validatielaag werkt samen met:

  • SingleStore: Valideert opgeslagen records
  • Transformatie: Valideert transformatieresultaten
  • Crossviews: Valideert geïdentificeerde relaties
  • Configuratie: Maakt aangepaste validatieregels mogelijk
  • Zoeken: Kan alleen gevalideerde data indexeren