- sql/110: add wavelength_tx_nm, wavelength_rx_nm, connector_type, data_completeness, enrichment_needed columns + trigger - sql/111: IEEE/MSA standards wavelength lookup table (SFP→OSFP) - sql/112: migrate existing wavelengths TEXT → integer columns - robots/wavelength-enricher.ts: fills missing wavelengths from IEEE lookup (deterministic) then product-name regex, runs every 4h - scheduler: register enrich:wavelength job (4h schedule) Fixes over-broad matching where 1G SFPs match 500+ competitors due to missing wavelength discrimination.
86 lines
4.4 KiB
PL/PgSQL
86 lines
4.4 KiB
PL/PgSQL
-- Migration 110: Wavelength (TX/RX getrennt für BiDi), Connector-Normalisierung,
|
||
-- Data-Completeness-Score, Enrichment-Flag
|
||
|
||
-- 1. Wellenlängen-Felder aufteilen (BiDi hat TX ≠ RX)
|
||
ALTER TABLE transceivers
|
||
ADD COLUMN IF NOT EXISTS wavelength_tx_nm INTEGER, -- TX-Wellenlänge in nm (z.B. 1270)
|
||
ADD COLUMN IF NOT EXISTS wavelength_rx_nm INTEGER, -- RX-Wellenlänge in nm (z.B. 1330)
|
||
ADD COLUMN IF NOT EXISTS connector_type TEXT, -- 'LC', 'SC', 'MPO-12', 'MPO-16', 'RJ45', 'CS', 'SN'
|
||
ADD COLUMN IF NOT EXISTS data_completeness INTEGER DEFAULT 0 CHECK (data_completeness BETWEEN 0 AND 100),
|
||
ADD COLUMN IF NOT EXISTS enrichment_needed BOOLEAN DEFAULT FALSE,
|
||
ADD COLUMN IF NOT EXISTS enrichment_fields TEXT[] DEFAULT '{}'; -- welche Felder fehlen noch
|
||
|
||
-- 2. Indices für Performance
|
||
CREATE INDEX IF NOT EXISTS idx_tx_wavelength_tx ON transceivers (wavelength_tx_nm) WHERE wavelength_tx_nm IS NOT NULL;
|
||
CREATE INDEX IF NOT EXISTS idx_tx_wavelength_rx ON transceivers (wavelength_rx_nm) WHERE wavelength_rx_nm IS NOT NULL;
|
||
CREATE INDEX IF NOT EXISTS idx_tx_completeness ON transceivers (data_completeness);
|
||
CREATE INDEX IF NOT EXISTS idx_tx_enrichment ON transceivers (enrichment_needed) WHERE enrichment_needed = TRUE;
|
||
|
||
-- 3. Completeness-Berechnungsfunktion
|
||
CREATE OR REPLACE FUNCTION calc_data_completeness(
|
||
p_form_factor TEXT, p_speed_gbps NUMERIC, p_fiber_type TEXT,
|
||
p_reach_meters INTEGER, p_wavelength_tx INTEGER, p_connector TEXT
|
||
) RETURNS INTEGER AS $$
|
||
DECLARE
|
||
score INTEGER := 0;
|
||
BEGIN
|
||
IF p_form_factor IS NOT NULL AND p_form_factor != '' THEN score := score + 20; END IF;
|
||
IF p_speed_gbps IS NOT NULL AND p_speed_gbps > 0 THEN score := score + 20; END IF;
|
||
IF p_fiber_type IS NOT NULL AND p_fiber_type != '' THEN score := score + 20; END IF;
|
||
IF p_reach_meters IS NOT NULL AND p_reach_meters > 0 THEN score := score + 20; END IF;
|
||
IF p_wavelength_tx IS NOT NULL AND p_wavelength_tx > 0 THEN score := score + 10; END IF;
|
||
IF p_connector IS NOT NULL AND p_connector != '' THEN score := score + 10; END IF;
|
||
RETURN score;
|
||
END;
|
||
$$ LANGUAGE plpgsql IMMUTABLE;
|
||
|
||
-- 4. Alle bestehenden Transceivers: Completeness initial berechnen
|
||
UPDATE transceivers SET
|
||
data_completeness = calc_data_completeness(
|
||
form_factor, speed_gbps, fiber_type,
|
||
reach_meters, wavelength_tx_nm, connector_type
|
||
),
|
||
enrichment_needed = (
|
||
form_factor IS NULL OR speed_gbps IS NULL OR
|
||
fiber_type IS NULL OR reach_meters IS NULL OR
|
||
wavelength_tx_nm IS NULL OR connector_type IS NULL
|
||
);
|
||
|
||
-- 5. Trigger: Completeness automatisch aktualisieren
|
||
CREATE OR REPLACE FUNCTION trg_update_completeness()
|
||
RETURNS TRIGGER AS $$
|
||
BEGIN
|
||
NEW.data_completeness := calc_data_completeness(
|
||
NEW.form_factor, NEW.speed_gbps, NEW.fiber_type,
|
||
NEW.reach_meters, NEW.wavelength_tx_nm, NEW.connector_type
|
||
);
|
||
NEW.enrichment_needed := (
|
||
NEW.form_factor IS NULL OR NEW.speed_gbps IS NULL OR
|
||
NEW.fiber_type IS NULL OR NEW.reach_meters IS NULL OR
|
||
NEW.wavelength_tx_nm IS NULL OR NEW.connector_type IS NULL
|
||
);
|
||
-- Fehlende Felder dokumentieren
|
||
NEW.enrichment_fields := ARRAY_REMOVE(ARRAY[
|
||
CASE WHEN NEW.form_factor IS NULL THEN 'form_factor' END,
|
||
CASE WHEN NEW.speed_gbps IS NULL THEN 'speed_gbps' END,
|
||
CASE WHEN NEW.fiber_type IS NULL THEN 'fiber_type' END,
|
||
CASE WHEN NEW.reach_meters IS NULL THEN 'reach_meters' END,
|
||
CASE WHEN NEW.wavelength_tx_nm IS NULL THEN 'wavelength_tx_nm' END,
|
||
CASE WHEN NEW.connector_type IS NULL THEN 'connector_type' END
|
||
], NULL);
|
||
RETURN NEW;
|
||
END;
|
||
$$ LANGUAGE plpgsql;
|
||
|
||
DROP TRIGGER IF EXISTS trg_completeness ON transceivers;
|
||
CREATE TRIGGER trg_completeness
|
||
BEFORE INSERT OR UPDATE ON transceivers
|
||
FOR EACH ROW EXECUTE FUNCTION trg_update_completeness();
|
||
|
||
COMMENT ON COLUMN transceivers.wavelength_tx_nm IS 'TX wavelength in nm. For BiDi: TX side. For duplex: both TX=RX.';
|
||
COMMENT ON COLUMN transceivers.wavelength_rx_nm IS 'RX wavelength in nm. Only set for BiDi. NULL = same as TX.';
|
||
COMMENT ON COLUMN transceivers.connector_type IS 'Physical connector: LC, SC, MPO-12, MPO-16, RJ45, CS, SN';
|
||
COMMENT ON COLUMN transceivers.data_completeness IS '0-100: percentage of mandatory fields filled (6 fields × weight)';
|
||
COMMENT ON COLUMN transceivers.enrichment_needed IS 'TRUE = one or more mandatory fields missing, enrichment job needed';
|
||
COMMENT ON COLUMN transceivers.enrichment_fields IS 'Array of field names that still need enrichment';
|