From 5fb2fb7ab93cc54c4e46ebc0133e9260fae13851 Mon Sep 17 00:00:00 2001 From: Javier Hernandez Date: Tue, 10 Mar 2026 13:27:50 +0100 Subject: [PATCH] Fix #585: Remove extra datasets validation Reverts the validation added in #570 that raised InputValidationException 0-1-3-9 when data_structures contained datasets not referenced by the script. --- src/vtlengine/API/__init__.py | 16 --------------- src/vtlengine/Exceptions/messages.py | 6 ------ tests/API/test_api.py | 30 ---------------------------- 3 files changed, 52 deletions(-) diff --git a/src/vtlengine/API/__init__.py b/src/vtlengine/API/__init__.py index fc83a060..33dce44f 100644 --- a/src/vtlengine/API/__init__.py +++ b/src/vtlengine/API/__init__.py @@ -25,7 +25,6 @@ from vtlengine.AST.ASTConstructor import ASTVisitor from vtlengine.AST.ASTString import ASTString from vtlengine.AST.DAG import DAGAnalyzer -from vtlengine.AST.DAG._models import DatasetSchedule from vtlengine.AST.Grammar.lexer import Lexer from vtlengine.AST.Grammar.parser import Parser from vtlengine.Exceptions import InputValidationException @@ -94,14 +93,6 @@ def _extract_input_datasets(script: Union[str, TransformationScheme, Path]) -> L return dag_inputs -def _validate_extra_datasets(datasets: Dict[str, Any], ds_analysis: DatasetSchedule) -> None: - """Raise if data_structures contains datasets not referenced by the script.""" - script_datasets = set(ds_analysis.global_inputs) | set(ds_analysis.all_outputs) - extra_datasets = set(datasets.keys()) - script_datasets - if extra_datasets: - raise InputValidationException(code="0-1-3-9", datasets=sorted(extra_datasets)) - - def prettify(script: Union[str, TransformationScheme, Path]) -> str: """ Function that prettifies the VTL script given. @@ -270,10 +261,6 @@ def semantic_analysis( # Loading datasets from file/dict/pysdmx objects/URLs datasets, scalars = load_datasets(data_structures, sdmx_mappings=mapping_dict) - # Validate that all provided datasets are required by the script - ds_analysis = DAGAnalyzer.ds_structure(ast) - _validate_extra_datasets(datasets, ds_analysis) - # Handling of library items vd = None if value_domains is not None: @@ -447,9 +434,6 @@ def run( # VTL Efficient analysis ds_analysis = DAGAnalyzer.ds_structure(ast) - # Validate that all provided datasets are required by the script - _validate_extra_datasets(datasets, ds_analysis) - # Checking the output path to be a Path object to a directory if output_folder is not None: _check_output_folder(output_folder) diff --git a/src/vtlengine/Exceptions/messages.py b/src/vtlengine/Exceptions/messages.py index f2cc4a78..7a27891b 100644 --- a/src/vtlengine/Exceptions/messages.py +++ b/src/vtlengine/Exceptions/messages.py @@ -224,12 +224,6 @@ "description": "Raised when URL datapoints are provided but data_structures is not a " "file path or URL for fetching the SDMX structure definition.", }, - "0-1-3-9": { - "message": "Dataset(s) {datasets} defined in data structures " - "but not required by the script.", - "description": "Raised when the provided data structures contain datasets " - "that are not used as inputs in the VTL script.", - }, # ------------Operators------------- # General Semantic errors "1-1-1-1": { diff --git a/tests/API/test_api.py b/tests/API/test_api.py index 1d462018..d2763261 100644 --- a/tests/API/test_api.py +++ b/tests/API/test_api.py @@ -2084,33 +2084,3 @@ def test_validate_dataset(ds_input, dp_input, is_valid, message): else: with pytest.raises(Exception, match=message): validate_dataset(ds_data, dp_input) - - -def test_extra_dataset_in_data_structures(): - """run() and semantic_analysis() should fail when data_structures has unused datasets.""" - script = "DS_A <- DS_1 * 10;" - data_structures = { - "datasets": [ - { - "name": "DS_1", - "DataStructure": [ - {"name": "Id_1", "type": "Integer", "role": "Identifier", "nullable": False}, - {"name": "Me_1", "type": "Number", "role": "Measure", "nullable": True}, - ], - }, - { - "name": "DS_2", - "DataStructure": [ - {"name": "Id_1", "type": "Integer", "role": "Identifier", "nullable": False}, - {"name": "Me_1", "type": "Number", "role": "Measure", "nullable": True}, - ], - }, - ] - } - datapoints = {"DS_1": pd.DataFrame({"Id_1": [1], "Me_1": [10]})} - - with pytest.raises(InputValidationException, match="0-1-3-9"): - semantic_analysis(script=script, data_structures=data_structures) - - with pytest.raises(InputValidationException, match="0-1-3-9"): - run(script=script, data_structures=data_structures, datapoints=datapoints)