diff --git a/apps/interpreter/test/assets/broken-model.jv b/apps/interpreter/test/assets/broken-model.jv index ff20db91d..f33bf4339 100644 --- a/apps/interpreter/test/assets/broken-model.jv +++ b/apps/interpreter/test/assets/broken-model.jv @@ -44,22 +44,22 @@ pipeline CarsPipeline { } transform CarParser { - from r oftype Collection; + from r oftype SheetRow; to car oftype Car; car: { - name: asText (r cellInColumn "name"), - mpg: asDecimal (r cellInColumn "mpg"), - cyl: asInteger (r cellInColumn 2), - disp: asDecimal (r cellInColumn 3), - hp: asInteger (r cellInColumn "hp"), - drat: asDecimal (r cellInColumn "drat"), - wt: asDecimal (r cellInColumn "wt"), - qsec: asDecimal (r cellInColumn "qsec"), - vs: asInteger (r cellInColumn "vs"), - am: asInteger (r cellInColumn "am"), - gear: asInteger (r cellInColumn "gear"), - carb: asInteger (r cellInColumn "carb") + name: asText (r . "name"), + mpg: asDecimal (r . "mpg"), + cyl: asInteger (r . 2), + disp: asDecimal (r . 3), + hp: asInteger (r . "hp"), + drat: asDecimal (r . "drat"), + wt: asDecimal (r . "wt"), + qsec: asDecimal (r . "qsec"), + vs: asInteger (r . "vs"), + am: asInteger (r . "am"), + gear: asInteger (r . "gear"), + carb: asInteger (r . "carb") }; } diff --git a/example/cars.jv b/example/cars.jv index 4b28eefa4..a16f29d29 100644 --- a/example/cars.jv +++ b/example/cars.jv @@ -89,22 +89,22 @@ pipeline CarsPipeline { } transform CarParser { - from r oftype Collection; + from r oftype SheetRow; to car oftype Car; car: { - name: asText (r cellInColumn "name"), - mpg: asDecimal (r cellInColumn "mpg"), - cyl: asInteger (r cellInColumn 2), - disp: asDecimal (r cellInColumn 3), - hp: asInteger (r cellInColumn "hp"), - drat: asDecimal (r cellInColumn "drat"), - wt: asDecimal (r cellInColumn "wt"), - qsec: asDecimal (r cellInColumn "qsec"), - vs: asInteger (r cellInColumn "vs"), - am: asInteger (r cellInColumn "am"), - gear: asInteger (r cellInColumn "gear"), - carb: asInteger (r cellInColumn "carb") + name: asText (r."name"), + mpg: asDecimal (r . "mpg"), + cyl: asInteger (r.2), + disp: asDecimal (r . 3), + hp: asInteger (r . "hp"), + drat: asDecimal (r . "drat"), + wt: asDecimal (r . "wt"), + qsec: asDecimal (r . "qsec"), + vs: asInteger (r . "vs"), + am: asInteger (r . "am"), + gear: asInteger (r . "gear"), + carb: asInteger (r . "carb") }; } diff --git a/example/electric-vehicles.jv b/example/electric-vehicles.jv index 91b05ff75..dc8e4c609 100644 --- a/example/electric-vehicles.jv +++ b/example/electric-vehicles.jv @@ -70,27 +70,27 @@ pipeline ElectricVehiclesPipeline { } transform ElectricVehicleParser { - from r oftype Collection; + from r oftype SheetRow; to ev oftype ElectricVehicle; ev: { - vin: r cellInColumn "VIN (1-10)", - county: asText (r cellInColumn "County"), - city: asText (r cellInColumn "City"), - state: asText (r cellInColumn "State"), - postal: asText (r cellInColumn "Postal Code"), - modelYear: asInteger (r cellInColumn "Model Year"), - make: asText (r cellInColumn "Make"), - model: asText (r cellInColumn "Model"), - evType: asText (r cellInColumn "Electric Vehicle Type"), - cafvEligibility: asText (r cellInColumn "Clean Alternative Fuel Vehicle (CAFV) Eligibility"), - electricRange: asInteger (r cellInColumn "Electric Range"), - baseMSRP: asInteger (r cellInColumn "Base MSRP"), - legislativeDistrict: asText (r cellInColumn "LegislativeDistrict"), - dolID: asInteger (r cellInColumn "DOL Vehicle ID"), - location: asText (r cellInColumn "Vehicle Location"), - utility: asText (r cellInColumn "Electric Utility"), - censusTract: asText (r cellInColumn "2020 Census Tract"), + vin: r . "VIN (1-10)", + county: asText (r . "County"), + city: asText (r . "City"), + state: asText (r . "State"), + postal: asText (r . "Postal Code"), + modelYear: asInteger (r . "Model Year"), + make: asText (r . "Make"), + model: asText (r . "Model"), + evType: asText (r . "Electric Vehicle Type"), + cafvEligibility: asText (r . "Clean Alternative Fuel Vehicle (CAFV) Eligibility"), + electricRange: asInteger (r . "Electric Range"), + baseMSRP: asInteger (r . "Base MSRP"), + legislativeDistrict: asText (r . "LegislativeDistrict"), + dolID: asInteger (r . "DOL Vehicle ID"), + location: asText (r . "Vehicle Location"), + utility: asText (r . "Electric Utility"), + censusTract: asText (r . "2020 Census Tract"), }; } diff --git a/example/gtfs-rt.jv b/example/gtfs-rt.jv index faa496a8d..67f35ef9c 100644 --- a/example/gtfs-rt.jv +++ b/example/gtfs-rt.jv @@ -71,20 +71,20 @@ pipeline GtfsRTSimplePipeline { property entityTripUpdateStopTimeUpdateDepartureTime oftype text; } transform TripUpdateParser { - from r oftype Collection; + from r oftype SheetRow; to tripUpdate oftype TripUpdate; tripUpdate: { - headerGtfsRealtimeVersion: r cellInColumn "header.gtfs_realtime_version", - headerTimestamp: r cellInColumn "header.timestamp", - headerIncrementality: r cellInColumn "header.incrementality", - entityId: r cellInColumn "entity.id", - entityTripUpdateTripTripId: r cellInColumn "entity.trip_update.trip.trip_id", - entityTripUpdateTripRouteId: r cellInColumn "entity.trip_update.trip.route_id", - entityTripUpdateStopTimeUpdateStopSequence: r cellInColumn "entity.trip_update.stop_time_update.stop_sequence", - entityTripUpdateStopTimeUpdateStopId: r cellInColumn "entity.trip_update.stop_time_update.stop_id", - entityTripUpdateStopTimeUpdateArrivalTime: r cellInColumn "entity.trip_update.stop_time_update.arrival.time", - entityTripUpdateStopTimeUpdateDepartureTime: r cellInColumn "entity.trip_update.stop_time_update.departure.time", + headerGtfsRealtimeVersion: r . "header.gtfs_realtime_version", + headerTimestamp: r . "header.timestamp", + headerIncrementality: r . "header.incrementality", + entityId: r . "entity.id", + entityTripUpdateTripTripId: r . "entity.trip_update.trip.trip_id", + entityTripUpdateTripRouteId: r . "entity.trip_update.trip.route_id", + entityTripUpdateStopTimeUpdateStopSequence: r . "entity.trip_update.stop_time_update.stop_sequence", + entityTripUpdateStopTimeUpdateStopId: r . "entity.trip_update.stop_time_update.stop_id", + entityTripUpdateStopTimeUpdateArrivalTime: r . "entity.trip_update.stop_time_update.arrival.time", + entityTripUpdateStopTimeUpdateDepartureTime: r . "entity.trip_update.stop_time_update.departure.time", }; } block TripUpdateTableInterpreter oftype TableInterpreter { @@ -107,20 +107,20 @@ pipeline GtfsRTSimplePipeline { property entityVehiclePositionTimestamp oftype text; } transform VehiclePositionParser { - from r oftype Collection; + from r oftype SheetRow; to vehiclePosition oftype VehiclePosition; vehiclePosition: { - headerGtfsRealtimeVersion: r cellInColumn "header.gtfs_realtime_version", - headerTimestamp: r cellInColumn "header.timestamp", - headerIncrementality: r cellInColumn "header.incrementality", - entityId: r cellInColumn "entity.id", - entityVehiclePositionVehicleDescriptorId: r cellInColumn "entity.vehicle_position.vehicle_descriptor.id", - entityVehiclePositionTripTripId: r cellInColumn "entity.vehicle_position.trip.trip_id", - entityVehiclePositionTripRouteId: r cellInColumn "entity.vehicle_position.trip.route_id", - entityVehiclePositionPositionLatitude: r cellInColumn "entity.vehicle_position.position.latitude", - entityVehiclePositionPositionLongitude: r cellInColumn "entity.vehicle_position.position.longitude", - entityVehiclePositionTimestamp: r cellInColumn "entity.vehicle_position.timestamp", + headerGtfsRealtimeVersion: r . "header.gtfs_realtime_version", + headerTimestamp: r . "header.timestamp", + headerIncrementality: r . "header.incrementality", + entityId: r . "entity.id", + entityVehiclePositionVehicleDescriptorId: r . "entity.vehicle_position.vehicle_descriptor.id", + entityVehiclePositionTripTripId: r . "entity.vehicle_position.trip.trip_id", + entityVehiclePositionTripRouteId: r . "entity.vehicle_position.trip.route_id", + entityVehiclePositionPositionLatitude: r . "entity.vehicle_position.position.latitude", + entityVehiclePositionPositionLongitude: r . "entity.vehicle_position.position.longitude", + entityVehiclePositionTimestamp: r . "entity.vehicle_position.timestamp", }; } block VehiclePositionTableInterpreter oftype TableInterpreter { @@ -140,17 +140,17 @@ pipeline GtfsRTSimplePipeline { property entityAlertDescriptionText oftype text; } transform AlertParser { - from r oftype Collection; + from r oftype SheetRow; to alert oftype Alert; alert: { - headerGtfsRealtimeVersion: r cellInColumn "header.gtfs_realtime_version", - headerTimestamp: r cellInColumn "header.timestamp", - headerIncrementality: r cellInColumn "header.incrementality", - entityId: r cellInColumn "entity.id", - entityAlertInformedEntityRouteId: r cellInColumn "entity.alert.informed_entity.route_id", - entityAlertHeaderText: r cellInColumn "entity.alert.header_text", - entityAlertDescriptionText: r cellInColumn "entity.alert.description_text", + headerGtfsRealtimeVersion: r . "header.gtfs_realtime_version", + headerTimestamp: r . "header.timestamp", + headerIncrementality: r . "header.incrementality", + entityId: r . "entity.id", + entityAlertInformedEntityRouteId: r . "entity.alert.informed_entity.route_id", + entityAlertHeaderText: r . "entity.alert.header_text", + entityAlertDescriptionText: r . "entity.alert.description_text", }; } block AlertTableInterpreter oftype TableInterpreter { diff --git a/libs/execution/src/lib/transforms/transform-executor.ts b/libs/execution/src/lib/transforms/transform-executor.ts index 955ff63d0..2bbbff8ba 100644 --- a/libs/execution/src/lib/transforms/transform-executor.ts +++ b/libs/execution/src/lib/transforms/transform-executor.ts @@ -7,6 +7,7 @@ import { strict as assert } from 'assert'; import { ERROR_TYPEGUARD, + onlyElementOrUndefined, type InternalErrorValueRepresentation, type InternalValidValueRepresentation, InvalidValue, @@ -64,9 +65,9 @@ export class TransformExecutor { getOutputAssignment(): TransformOutputAssignment { const outputAssignments = this.transform.body.outputAssignments; - assert(outputAssignments.length === 1); - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - return outputAssignments[0]!; + const outputAssignment = onlyElementOrUndefined(outputAssignments); + assert(outputAssignment !== undefined); + return outputAssignment; } executeTransform( diff --git a/libs/execution/src/lib/types/value-types/internal-representation-parsing.ts b/libs/execution/src/lib/types/value-types/internal-representation-parsing.ts index 464da9f32..45d0d321b 100644 --- a/libs/execution/src/lib/types/value-types/internal-representation-parsing.ts +++ b/libs/execution/src/lib/types/value-types/internal-representation-parsing.ts @@ -147,4 +147,8 @@ class InternalRepresentationParserVisitor extends ValueTypeVisitor< `Cannot parse valuetype definitions into internal values`, ); } + + override visitSheetRow(): InvalidValue { + return new InvalidValue(`Cannot parse sheet rows into internal values`); + } } diff --git a/libs/execution/src/lib/types/value-types/value-representation-validity.ts b/libs/execution/src/lib/types/value-types/value-representation-validity.ts index c6b87d8d9..add6957d1 100644 --- a/libs/execution/src/lib/types/value-types/value-representation-validity.ts +++ b/libs/execution/src/lib/types/value-types/value-representation-validity.ts @@ -6,6 +6,7 @@ import { strict as assert } from 'assert'; import { + type SheetRowValueType, type AtomicValueType, type BooleanValuetype, type CellRangeValuetype, @@ -130,6 +131,10 @@ class ValueRepresentationValidityVisitor extends ValueTypeVisitor { return this.isValidForPrimitiveValuetype(valueType); } + override visitSheetRow(valueType: SheetRowValueType): boolean { + return this.isValidForPrimitiveValuetype(valueType); + } + override visitTransform(valueType: TransformValuetype): boolean { return this.isValidForPrimitiveValuetype(valueType); } diff --git a/libs/execution/src/lib/types/value-types/visitors/sql-column-type-visitor.ts b/libs/execution/src/lib/types/value-types/visitors/sql-column-type-visitor.ts index f47a92e3e..8257f5685 100644 --- a/libs/execution/src/lib/types/value-types/visitors/sql-column-type-visitor.ts +++ b/libs/execution/src/lib/types/value-types/visitors/sql-column-type-visitor.ts @@ -76,6 +76,12 @@ export class SQLColumnTypeVisitor extends ValueTypeVisitor { ); } + override visitSheetRow(): string { + throw new Error( + 'No visit implementation given for sheet rows. Cannot be the type of a column.', + ); + } + override visitTransform(): string { throw new Error( 'No visit implementation given for transforms. Cannot be the type of a column.', diff --git a/libs/execution/src/lib/types/value-types/visitors/sql-value-representation-visitor.ts b/libs/execution/src/lib/types/value-types/visitors/sql-value-representation-visitor.ts index 9b6bdba78..a44111932 100644 --- a/libs/execution/src/lib/types/value-types/visitors/sql-value-representation-visitor.ts +++ b/libs/execution/src/lib/types/value-types/visitors/sql-value-representation-visitor.ts @@ -130,6 +130,14 @@ export class SQLValueRepresentationVisitor extends ValueTypeVisitor< ); } + override visitSheetRow(): ( + value: InternalValidValueRepresentation | InternalErrorValueRepresentation, + ) => string { + throw new Error( + 'No visit implementation given for sheet row. Cannot be the type of a column.', + ); + } + override visitTransform(): ( value: InternalValidValueRepresentation | InternalErrorValueRepresentation, ) => string { diff --git a/libs/extensions/tabular/exec/test/assets/table-interpreter-executor/valid-empty-columns-with-header.jv b/libs/extensions/tabular/exec/test/assets/table-interpreter-executor/valid-empty-columns-with-header.jv index d3c3189cd..51f173643 100644 --- a/libs/extensions/tabular/exec/test/assets/table-interpreter-executor/valid-empty-columns-with-header.jv +++ b/libs/extensions/tabular/exec/test/assets/table-interpreter-executor/valid-empty-columns-with-header.jv @@ -12,7 +12,7 @@ pipeline TestPipeline { transform Parser { - from r oftype Collection; + from r oftype SheetRow; to t oftype TestValueType; t: { }; diff --git a/libs/extensions/tabular/exec/test/assets/table-interpreter-executor/valid-with-capitalized-header.jv b/libs/extensions/tabular/exec/test/assets/table-interpreter-executor/valid-with-capitalized-header.jv index 08fc9db23..f867f43a0 100644 --- a/libs/extensions/tabular/exec/test/assets/table-interpreter-executor/valid-with-capitalized-header.jv +++ b/libs/extensions/tabular/exec/test/assets/table-interpreter-executor/valid-with-capitalized-header.jv @@ -14,10 +14,10 @@ pipeline TestPipeline { } transform Parser { - from r oftype Collection; + from r oftype SheetRow; to t oftype TestValueType; - t: { Index: asInteger (r cellInColumn "Index"), Name: r cellInColumn "Name", Flag: asBoolean (r cellInColumn "Flag") }; + t: { Index: asInteger (r . "Index"), Name: r . "Name", Flag: asBoolean (r . "Flag") }; } block TestBlock oftype TableInterpreter { diff --git a/libs/extensions/tabular/exec/test/assets/table-interpreter-executor/valid-with-header.jv b/libs/extensions/tabular/exec/test/assets/table-interpreter-executor/valid-with-header.jv index 4d46a854d..547d3427b 100644 --- a/libs/extensions/tabular/exec/test/assets/table-interpreter-executor/valid-with-header.jv +++ b/libs/extensions/tabular/exec/test/assets/table-interpreter-executor/valid-with-header.jv @@ -14,10 +14,10 @@ pipeline TestPipeline { } transform Parser { - from r oftype Collection; + from r oftype SheetRow; to t oftype TestValueType; - t: { index: asInteger (r cellInColumn "index"), name: r cellInColumn "name", flag: asBoolean (r cellInColumn "flag") }; + t: { index: asInteger (r . "index"), name: r . "name", flag: asBoolean (r . "flag") }; } block TestBlock oftype TableInterpreter { diff --git a/libs/extensions/tabular/exec/test/assets/table-interpreter-executor/valid-without-header.jv b/libs/extensions/tabular/exec/test/assets/table-interpreter-executor/valid-without-header.jv index 9925fd6a0..d3bb3357f 100644 --- a/libs/extensions/tabular/exec/test/assets/table-interpreter-executor/valid-without-header.jv +++ b/libs/extensions/tabular/exec/test/assets/table-interpreter-executor/valid-without-header.jv @@ -14,11 +14,11 @@ pipeline TestPipeline { } transform Parser { - from r oftype Collection; + from r oftype SheetRow; to t oftype TestValueType; - t: { index: asInteger (r cellInColumn 0), name: r cellInColumn 1, flag: - asBoolean (r cellInColumn 2) }; + t: { index: asInteger (r . 0), name: r . 1, flag: + asBoolean (r . 2) }; } block TestBlock oftype TableInterpreter { diff --git a/libs/extensions/tabular/exec/test/assets/table-interpreter-executor/valid-wrong-value-type-with-header.jv b/libs/extensions/tabular/exec/test/assets/table-interpreter-executor/valid-wrong-value-type-with-header.jv index 1c480af72..e72e8bb25 100644 --- a/libs/extensions/tabular/exec/test/assets/table-interpreter-executor/valid-wrong-value-type-with-header.jv +++ b/libs/extensions/tabular/exec/test/assets/table-interpreter-executor/valid-wrong-value-type-with-header.jv @@ -14,10 +14,10 @@ pipeline TestPipeline { } transform Parser { - from r oftype Collection; + from r oftype SheetRow; to t oftype TestValueType; - t: { index: asInteger (r cellInColumn "index"), name: r cellInColumn "name", flag: asBoolean (r cellInColumn "flag") }; + t: { index: asInteger (r . "index"), name: r . "name", flag: asBoolean (r . "flag") }; } block TestBlock oftype TableInterpreter { diff --git a/libs/extensions/tabular/exec/test/assets/table-interpreter-executor/valid-wrong-value-type-without-header.jv b/libs/extensions/tabular/exec/test/assets/table-interpreter-executor/valid-wrong-value-type-without-header.jv index 20d65adf8..4f24f35e7 100644 --- a/libs/extensions/tabular/exec/test/assets/table-interpreter-executor/valid-wrong-value-type-without-header.jv +++ b/libs/extensions/tabular/exec/test/assets/table-interpreter-executor/valid-wrong-value-type-without-header.jv @@ -14,11 +14,11 @@ pipeline TestPipeline { } transform Parser { - from r oftype Collection; + from r oftype SheetRow; to t oftype TestValueType; - t: { index: asInteger (r cellInColumn 0), name: r cellInColumn 1, flag: - asBoolean (r cellInColumn 2) }; + t: { index: asInteger (r . 0), name: r . 1, flag: + asBoolean (r . 2) }; } block TestBlock oftype TableInterpreter { diff --git a/libs/interpreter-lib/test/assets/graph/composite-block.jv b/libs/interpreter-lib/test/assets/graph/composite-block.jv index 8ba0df960..6e2ac599d 100644 --- a/libs/interpreter-lib/test/assets/graph/composite-block.jv +++ b/libs/interpreter-lib/test/assets/graph/composite-block.jv @@ -20,9 +20,9 @@ pipeline CarsPipeline { } transform parser { - from r oftype Collection; + from r oftype SheetRow; to y oftype CarName; - y: { name: asText (r cellInColumn "name") }; + y: { name: asText (r . "name") }; } block CarsTableInterpreter oftype TableInterpreter { diff --git a/libs/interpreter-lib/test/assets/graph/two-pipelines.jv b/libs/interpreter-lib/test/assets/graph/two-pipelines.jv index c31ce3229..15ed3d7b3 100644 --- a/libs/interpreter-lib/test/assets/graph/two-pipelines.jv +++ b/libs/interpreter-lib/test/assets/graph/two-pipelines.jv @@ -47,22 +47,22 @@ pipeline CarsPipeline { } transform CarParser { - from r oftype Collection; + from r oftype SheetRow; to car oftype Car; car: { - name: asText (r cellInColumn "name"), - mpg: asDecimal (r cellInColumn "mpg"), - cyl: asInteger (r cellInColumn 2), - disp: asDecimal (r cellInColumn 3), - hp: asInteger (r cellInColumn "hp"), - drat: asDecimal (r cellInColumn "drat"), - wt: asDecimal (r cellInColumn "wt"), - qsec: asDecimal (r cellInColumn "qsec"), - vs: asInteger (r cellInColumn "vs"), - am: asInteger (r cellInColumn "am"), - gear: asInteger (r cellInColumn "gear"), - carb: asInteger (r cellInColumn "carb") + name: asText (r . "name"), + mpg: asDecimal (r . "mpg"), + cyl: asInteger (r . 2), + disp: asDecimal (r . 3), + hp: asInteger (r . "hp"), + drat: asDecimal (r . "drat"), + wt: asDecimal (r . "wt"), + qsec: asDecimal (r . "qsec"), + vs: asInteger (r . "vs"), + am: asInteger (r . "am"), + gear: asInteger (r . "gear"), + carb: asInteger (r . "carb") }; } @@ -127,27 +127,27 @@ pipeline ElectricVehiclesPipeline { } transform ElectricVehicleParser { - from r oftype Collection; + from r oftype SheetRow; to ev oftype ElectricVehicle; ev: { - vin: r cellInColumn "VIN (1-10)", - county: asText (r cellInColumn "County"), - city: asText (r cellInColumn "City"), - state: asText (r cellInColumn "State"), - postal: asText (r cellInColumn "Postal Code"), - modelYear: asInteger (r cellInColumn "Model Year"), - make: asText (r cellInColumn "Make"), - model: asText (r cellInColumn "Model"), - evType: asText (r cellInColumn "Electric Vehicle Type"), - cafvEligibility: asText (r cellInColumn "Clean Alternative Fuel Vehicle (CAFV) Eligibility"), - electricRange: asInteger (r cellInColumn "Electric Range"), - baseMSRP: asInteger (r cellInColumn "Base MSRP"), - legislativeDistrict: asText (r cellInColumn "Legislative District"), - dolID: asInteger (r cellInColumn "DOL Vehicle ID"), - location: asText (r cellInColumn "Vehicle Location"), - utility: asText (r cellInColumn "Electric Utility"), - censusTract: asText (r cellInColumn "2020 Census Tract"), + vin: r . "VIN (1-10)", + county: asText (r . "County"), + city: asText (r . "City"), + state: asText (r . "State"), + postal: asText (r . "Postal Code"), + modelYear: asInteger (r . "Model Year"), + make: asText (r . "Make"), + model: asText (r . "Model"), + evType: asText (r . "Electric Vehicle Type"), + cafvEligibility: asText (r . "Clean Alternative Fuel Vehicle (CAFV) Eligibility"), + electricRange: asInteger (r . "Electric Range"), + baseMSRP: asInteger (r . "Base MSRP"), + legislativeDistrict: asText (r . "Legislative District"), + dolID: asInteger (r . "DOL Vehicle ID"), + location: asText (r . "Vehicle Location"), + utility: asText (r . "Electric Utility"), + censusTract: asText (r . "2020 Census Tract"), }; } diff --git a/libs/interpreter-lib/test/assets/hooks/valid-builtin-and-composite-blocks.jv b/libs/interpreter-lib/test/assets/hooks/valid-builtin-and-composite-blocks.jv index 115a62157..1417ff405 100644 --- a/libs/interpreter-lib/test/assets/hooks/valid-builtin-and-composite-blocks.jv +++ b/libs/interpreter-lib/test/assets/hooks/valid-builtin-and-composite-blocks.jv @@ -44,22 +44,22 @@ pipeline CarsPipeline { } transform CarParser { - from r oftype Collection; + from r oftype SheetRow; to car oftype Car; car: { - name: asText (r cellInColumn "name"), - mpg: asDecimal (r cellInColumn "mpg"), - cyl: asInteger (r cellInColumn 2), - disp: asDecimal (r cellInColumn 3), - hp: asInteger (r cellInColumn "hp"), - drat: asDecimal (r cellInColumn "drat"), - wt: asDecimal (r cellInColumn "wt"), - qsec: asDecimal (r cellInColumn "qsec"), - vs: asInteger (r cellInColumn "vs"), - am: asInteger (r cellInColumn "am"), - gear: asInteger (r cellInColumn "gear"), - carb: asInteger (r cellInColumn "carb") + name: asText (r . "name"), + mpg: asDecimal (r . "mpg"), + cyl: asInteger (r . 2), + disp: asDecimal (r . 3), + hp: asInteger (r . "hp"), + drat: asDecimal (r . "drat"), + wt: asDecimal (r . "wt"), + qsec: asDecimal (r . "qsec"), + vs: asInteger (r . "vs"), + am: asInteger (r . "am"), + gear: asInteger (r . "gear"), + carb: asInteger (r . "carb") }; } diff --git a/libs/language-server/src/grammar/expression.langium b/libs/language-server/src/grammar/expression.langium index aa490cf54..14261af25 100644 --- a/libs/language-server/src/grammar/expression.langium +++ b/libs/language-server/src/grammar/expression.langium @@ -22,7 +22,7 @@ ReplaceExpression infers Expression: second=BinaryExpression 'with' third=BinaryExpression)*; infix BinaryExpression on PrimaryExpression: - 'cellInColumn' // Higher precedence + '.' // Higher precedence > 'pow' | 'root' > '*' | '/' | '%' > '+' | '-' diff --git a/libs/language-server/src/lib/ast/expressions/evaluators/cell-in-column-operator-evaluator.ts b/libs/language-server/src/lib/ast/expressions/evaluators/dot-operator-evaluator.ts similarity index 96% rename from libs/language-server/src/lib/ast/expressions/evaluators/cell-in-column-operator-evaluator.ts rename to libs/language-server/src/lib/ast/expressions/evaluators/dot-operator-evaluator.ts index 237c687db..9c401191c 100644 --- a/libs/language-server/src/lib/ast/expressions/evaluators/cell-in-column-operator-evaluator.ts +++ b/libs/language-server/src/lib/ast/expressions/evaluators/dot-operator-evaluator.ts @@ -25,10 +25,10 @@ import { STRING_TYPEGUARD, } from '../typeguards'; -export class CellInColumnOperatorEvaluator +export class DotOperatorEvaluator implements OperatorEvaluator { - public readonly operator = 'cellInColumn' as const; + public readonly operator = '.' as const; evaluate( expression: BinaryExpression, diff --git a/libs/language-server/src/lib/ast/expressions/operator-registry.ts b/libs/language-server/src/lib/ast/expressions/operator-registry.ts index d541c18b6..ca6083acf 100644 --- a/libs/language-server/src/lib/ast/expressions/operator-registry.ts +++ b/libs/language-server/src/lib/ast/expressions/operator-registry.ts @@ -15,7 +15,7 @@ import { import { AdditionOperatorEvaluator } from './evaluators/addition-operator-evaluator'; import { AndOperatorEvaluator } from './evaluators/and-operator-evaluator'; import { CeilOperatorEvaluator } from './evaluators/ceil-operator-evaluator'; -import { CellInColumnOperatorEvaluator } from './evaluators/cell-in-column-operator-evaluator'; +import { DotOperatorEvaluator } from './evaluators/dot-operator-evaluator'; import { DivisionOperatorEvaluator } from './evaluators/division-operator-evaluator'; import { EqualityOperatorEvaluator } from './evaluators/equality-operator-evaluator'; import { FloorOperatorEvaluator } from './evaluators/floor-operator-evaluator'; @@ -61,7 +61,7 @@ import { type UnaryExpressionOperator, } from './operator-types'; import { BasicArithmeticOperatorTypeComputer } from './type-computers/basic-arithmetic-operator-type-computer'; -import { CellInColumnOperatorTypeComputer } from './type-computers/cell-in-column-operator-type-computer'; +import { DotOperatorTypeComputer } from './type-computers/dot-operator-type-computer'; import { DivisionOperatorTypeComputer } from './type-computers/division-operator-type-computer'; import { EqualityOperatorTypeComputer } from './type-computers/equality-operator-type-computer'; import { ExponentialOperatorTypeComputer } from './type-computers/exponential-operator-type-computer'; @@ -119,7 +119,7 @@ export class DefaultOperatorEvaluatorRegistry lengthof: new LengthofOperatorEvaluator(), }; binary = { - cellInColumn: new CellInColumnOperatorEvaluator(), + '.': new DotOperatorEvaluator(), pow: new PowOperatorEvaluator(), root: new RootOperatorEvaluator(), '*': new MultiplicationOperatorEvaluator(), @@ -167,7 +167,7 @@ export class DefaultOperatorTypeComputerRegistry lengthof: new LengthofOperatorTypeComputer(this.valueTypeProvider), }; binary = { - cellInColumn: new CellInColumnOperatorTypeComputer(this.valueTypeProvider), + '.': new DotOperatorTypeComputer(this.valueTypeProvider), pow: new ExponentialOperatorTypeComputer(this.valueTypeProvider), root: new ExponentialOperatorTypeComputer(this.valueTypeProvider), '*': new BasicArithmeticOperatorTypeComputer(this.valueTypeProvider), diff --git a/libs/language-server/src/lib/ast/expressions/type-computers/cell-in-column-operator-type-computer.ts b/libs/language-server/src/lib/ast/expressions/type-computers/dot-operator-type-computer.ts similarity index 84% rename from libs/language-server/src/lib/ast/expressions/type-computers/cell-in-column-operator-type-computer.ts rename to libs/language-server/src/lib/ast/expressions/type-computers/dot-operator-type-computer.ts index 95408757b..ed55c61cd 100644 --- a/libs/language-server/src/lib/ast/expressions/type-computers/cell-in-column-operator-type-computer.ts +++ b/libs/language-server/src/lib/ast/expressions/type-computers/dot-operator-type-computer.ts @@ -7,13 +7,10 @@ import { type BinaryExpression } from '../../generated/ast'; import { type ValueType, type ValueTypeProvider, - isCollectionValueType, } from '../../wrappers/value-type'; import { type BinaryOperatorTypeComputer } from '../operator-type-computer'; -export class CellInColumnOperatorTypeComputer - implements BinaryOperatorTypeComputer -{ +export class DotOperatorTypeComputer implements BinaryOperatorTypeComputer { constructor(protected readonly valueTypeProvider: ValueTypeProvider) {} computeType( @@ -22,12 +19,7 @@ export class CellInColumnOperatorTypeComputer expression: BinaryExpression, context: ValidationContext | undefined, ): ValueType | undefined { - if ( - !isCollectionValueType( - leftOperandType, - this.valueTypeProvider.Primitives.Text, - ) - ) { + if (!leftOperandType.equals(this.valueTypeProvider.Primitives.SheetRow)) { context?.accept( 'error', `Operator does not support type ${leftOperandType.getName()}`, diff --git a/libs/language-server/src/lib/ast/wrappers/value-type/primitive/collection/abstract-collection-value-type.ts b/libs/language-server/src/lib/ast/wrappers/value-type/primitive/collection/abstract-collection-value-type.ts index 468c38901..b4ea4d4b5 100644 --- a/libs/language-server/src/lib/ast/wrappers/value-type/primitive/collection/abstract-collection-value-type.ts +++ b/libs/language-server/src/lib/ast/wrappers/value-type/primitive/collection/abstract-collection-value-type.ts @@ -14,8 +14,4 @@ export abstract class AbstractCollectionValueType< override isAllowedAsRuntimeParameter(): boolean { return false; } - - override isReferenceableByUser(): boolean { - return true; - } } diff --git a/libs/language-server/src/lib/ast/wrappers/value-type/primitive/index.ts b/libs/language-server/src/lib/ast/wrappers/value-type/primitive/index.ts index 103301814..65cf9e8b5 100644 --- a/libs/language-server/src/lib/ast/wrappers/value-type/primitive/index.ts +++ b/libs/language-server/src/lib/ast/wrappers/value-type/primitive/index.ts @@ -22,6 +22,7 @@ export { type TextValuetype } from './text-value-type'; export { type TransformValuetype } from './transform-value-type'; export { type ValuetypeAssignmentValuetype } from './value-type-assignment-value-type'; export { type ValuetypeDefinitionValuetype } from './value-type-definition-value-type'; +export { type SheetRowValueType } from './sheetrow-value-type'; export { ValueTypeProvider, diff --git a/libs/language-server/src/lib/ast/wrappers/value-type/primitive/primitive-value-type-provider.ts b/libs/language-server/src/lib/ast/wrappers/value-type/primitive/primitive-value-type-provider.ts index 3563b78a0..42a6ecdfb 100644 --- a/libs/language-server/src/lib/ast/wrappers/value-type/primitive/primitive-value-type-provider.ts +++ b/libs/language-server/src/lib/ast/wrappers/value-type/primitive/primitive-value-type-provider.ts @@ -16,6 +16,7 @@ import { type PrimitiveValueType } from './primitive-value-type'; import { RegexValuetype } from './regex-value-type'; import { TextValuetype } from './text-value-type'; import { TransformValuetype } from './transform-value-type'; +import { SheetRowValueType } from './sheetrow-value-type'; import { ValuetypeAssignmentValuetype } from './value-type-assignment-value-type'; import { ValuetypeDefinitionValuetype } from './value-type-definition-value-type'; @@ -48,6 +49,8 @@ export class PrimitiveValueTypeProvider { Transform = new TransformValuetype(); + SheetRow = new SheetRowValueType(); + getAll(): PrimitiveValueType[] { return [ this.Boolean, @@ -60,6 +63,7 @@ export class PrimitiveValueTypeProvider { this.ValuetypeAssignment, this.ValuetypeDefinition, this.Transform, + this.SheetRow, ]; } } diff --git a/libs/language-server/src/lib/ast/wrappers/value-type/primitive/sheetrow-value-type.ts b/libs/language-server/src/lib/ast/wrappers/value-type/primitive/sheetrow-value-type.ts new file mode 100644 index 000000000..84cdee0bf --- /dev/null +++ b/libs/language-server/src/lib/ast/wrappers/value-type/primitive/sheetrow-value-type.ts @@ -0,0 +1,34 @@ +// SPDX-FileCopyrightText: 2023 Friedrich-Alexander-Universitat Erlangen-Nurnberg +// +// SPDX-License-Identifier: AGPL-3.0-only + +import { PrimitiveValueType } from './primitive-value-type'; +import { type ValueTypeVisitor } from '../value-type'; +import { type InternalValidValueRepresentation } from '../../../expressions'; + +export class SheetRowValueType extends PrimitiveValueType { + acceptVisitor(visitor: ValueTypeVisitor): R { + return visitor.visitSheetRow(this); + } + + override isAllowedAsRuntimeParameter(): false { + return false; + } + + override getName(): 'SheetRow' { + return 'SheetRow'; + } + + override isInternalValidValueRepresentation( + operandValue: InternalValidValueRepresentation, + ): operandValue is string[] { + return ( + Array.isArray(operandValue) && + operandValue.every((element) => typeof element === 'string') + ); + } + + override isReferenceableByUser(): true { + return true; + } +} diff --git a/libs/language-server/src/lib/ast/wrappers/value-type/value-type.ts b/libs/language-server/src/lib/ast/wrappers/value-type/value-type.ts index dab5cf62a..bdd0f6908 100644 --- a/libs/language-server/src/lib/ast/wrappers/value-type/value-type.ts +++ b/libs/language-server/src/lib/ast/wrappers/value-type/value-type.ts @@ -20,6 +20,7 @@ import { type RegexValuetype, type TextValuetype, type TransformValuetype, + type SheetRowValueType, type ValuetypeAssignmentValuetype, } from './primitive'; @@ -93,4 +94,6 @@ export abstract class ValueTypeVisitor { abstract visitTransform(valueType: TransformValuetype): R; abstract visitAtomicValueType(valueType: AtomicValueType): R; + + abstract visitSheetRow(valueType: SheetRowValueType): R; } diff --git a/libs/language-server/src/lib/validation/checks/transform-body.ts b/libs/language-server/src/lib/validation/checks/transform-body.ts index d52eff947..21dcf0c1d 100644 --- a/libs/language-server/src/lib/validation/checks/transform-body.ts +++ b/libs/language-server/src/lib/validation/checks/transform-body.ts @@ -133,10 +133,6 @@ function checkInputForTableRowTransform( return; } - const textCollection = props.valueTypeProvider.createCollectionValueTypeOf( - props.valueTypeProvider.Primitives.Text, - ); - const input = onlyElementOrUndefined(inputs); const inputValueType = props.wrapperFactories.ValueType.wrap( input?.valueType, @@ -154,10 +150,10 @@ function checkInputForTableRowTransform( return; } - if (!inputValueType.equals(textCollection)) { + if (!inputValueType.equals(props.valueTypeProvider.Primitives.SheetRow)) { props.validationContext.accept( 'error', - 'This input must be of type `Collection', + 'This input must be of type `SheetRow`', { node: input.valueType, }, diff --git a/libs/language-server/src/stdlib/domain/mobility/GTFSAgencyInterpreter.jv b/libs/language-server/src/stdlib/domain/mobility/GTFSAgencyInterpreter.jv index 7a9fafe83..fd3087efc 100644 --- a/libs/language-server/src/stdlib/domain/mobility/GTFSAgencyInterpreter.jv +++ b/libs/language-server/src/stdlib/domain/mobility/GTFSAgencyInterpreter.jv @@ -9,14 +9,14 @@ valuetype Agency { property agencyTimezone oftype text; } transform AgencyParser { - from r oftype Collection; + from r oftype SheetRow; to agency oftype Agency; agency: { - agencyId: r cellInColumn "agency_id", - agencyName: r cellInColumn "agency_name", - agencyUrl: r cellInColumn "agency_url", - agencyTimezone: r cellInColumn "agency_timezone", + agencyId: r . "agency_id", + agencyName: r . "agency_name", + agencyUrl: r . "agency_url", + agencyTimezone: r . "agency_timezone", }; } diff --git a/libs/language-server/src/stdlib/domain/mobility/GTFSCalendarDatesInterpreter.jv b/libs/language-server/src/stdlib/domain/mobility/GTFSCalendarDatesInterpreter.jv index d1b10a125..8d79f9764 100644 --- a/libs/language-server/src/stdlib/domain/mobility/GTFSCalendarDatesInterpreter.jv +++ b/libs/language-server/src/stdlib/domain/mobility/GTFSCalendarDatesInterpreter.jv @@ -9,13 +9,13 @@ valuetype CalendarDates { // 2 - Service has been removed for the specified date. } transform CalendarDatesParser { - from r oftype Collection; + from r oftype SheetRow; to dates oftype CalendarDates; dates: { - serviceId: r cellInColumn "service_id", - date: r cellInColumn "date", - exceptionType: r cellInColumn "exception_type", + serviceId: r . "service_id", + date: r . "date", + exceptionType: r . "exception_type", }; } diff --git a/libs/language-server/src/stdlib/domain/mobility/GTFSCalendarInterpreter.jv b/libs/language-server/src/stdlib/domain/mobility/GTFSCalendarInterpreter.jv index 29614539f..e072ce00c 100644 --- a/libs/language-server/src/stdlib/domain/mobility/GTFSCalendarInterpreter.jv +++ b/libs/language-server/src/stdlib/domain/mobility/GTFSCalendarInterpreter.jv @@ -16,20 +16,20 @@ valuetype Calendar { property endDate oftype GTFSDate; } transform CalendarParser { - from r oftype Collection; + from r oftype SheetRow; to calendar oftype Calendar; calendar: { - serviceId: r cellInColumn 0, - monday: r cellInColumn 1, - tuesday: r cellInColumn 2, - wednesday: r cellInColumn 3, - thursday: r cellInColumn 4, - friday: r cellInColumn 5, - saturday: r cellInColumn 6, - sunday: r cellInColumn 7, - startDate: r cellInColumn 8, - endDate: r cellInColumn 9, + serviceId: r . 0, + monday: r . 1, + tuesday: r . 2, + wednesday: r . 3, + thursday: r . 4, + friday: r . 5, + saturday: r . 6, + sunday: r . 7, + startDate: r . 8, + endDate: r . 9, }; } diff --git a/libs/language-server/src/stdlib/domain/mobility/GTFSFareAttributesInterpreter.jv b/libs/language-server/src/stdlib/domain/mobility/GTFSFareAttributesInterpreter.jv index 7b8f0d995..c569dfea9 100644 --- a/libs/language-server/src/stdlib/domain/mobility/GTFSFareAttributesInterpreter.jv +++ b/libs/language-server/src/stdlib/domain/mobility/GTFSFareAttributesInterpreter.jv @@ -12,16 +12,16 @@ valuetype FareAttributes { property transferDuration oftype text; } transform FareAttributesParser { - from r oftype Collection; + from r oftype SheetRow; to fareAttributes oftype FareAttributes; fareAttributes: { - fareId: r cellInColumn 0, - price: r cellInColumn 1, - currencyType: r cellInColumn 2, - paymentMethod: r cellInColumn 3, - transfers: r cellInColumn 4, - transferDuration: r cellInColumn 5, + fareId: r . 0, + price: r . 1, + currencyType: r . 2, + paymentMethod: r . 3, + transfers: r . 4, + transferDuration: r . 5, }; } diff --git a/libs/language-server/src/stdlib/domain/mobility/GTFSFareRulesInterpreter.jv b/libs/language-server/src/stdlib/domain/mobility/GTFSFareRulesInterpreter.jv index 3f7c3af98..03b2c6184 100644 --- a/libs/language-server/src/stdlib/domain/mobility/GTFSFareRulesInterpreter.jv +++ b/libs/language-server/src/stdlib/domain/mobility/GTFSFareRulesInterpreter.jv @@ -10,15 +10,15 @@ valuetype FareRules { property containsId oftype text; } transform FareRulesParser { - from r oftype Collection; + from r oftype SheetRow; to fareRules oftype FareRules; fareRules: { - fareId: r cellInColumn 0, - routeId: r cellInColumn 1, - originId: r cellInColumn 2, - destinationId: r cellInColumn 3, - containsId: r cellInColumn 4, + fareId: r . 0, + routeId: r . 1, + originId: r . 2, + destinationId: r . 3, + containsId: r . 4, }; } diff --git a/libs/language-server/src/stdlib/domain/mobility/GTFSFrequenciesInterpreter.jv b/libs/language-server/src/stdlib/domain/mobility/GTFSFrequenciesInterpreter.jv index d12e6c087..5e767c543 100644 --- a/libs/language-server/src/stdlib/domain/mobility/GTFSFrequenciesInterpreter.jv +++ b/libs/language-server/src/stdlib/domain/mobility/GTFSFrequenciesInterpreter.jv @@ -9,14 +9,14 @@ valuetype Frequencies { property headwaySecs oftype GTFSNonNegativeInteger; } transform FrequenciesParser { - from r oftype Collection; + from r oftype SheetRow; to frequencies oftype Frequencies; frequencies: { - tripId: r cellInColumn 0, - startTime: r cellInColumn 1, - endTime: r cellInColumn 2, - headwaySecs: r cellInColumn 3, + tripId: r . 0, + startTime: r . 1, + endTime: r . 2, + headwaySecs: r . 3, }; } diff --git a/libs/language-server/src/stdlib/domain/mobility/GTFSRoutesInterpreter.jv b/libs/language-server/src/stdlib/domain/mobility/GTFSRoutesInterpreter.jv index 2d5a6b187..2b2a43525 100644 --- a/libs/language-server/src/stdlib/domain/mobility/GTFSRoutesInterpreter.jv +++ b/libs/language-server/src/stdlib/domain/mobility/GTFSRoutesInterpreter.jv @@ -14,19 +14,19 @@ valuetype Route { property routeTextColor oftype text; } transform RouteParser { - from r oftype Collection; + from r oftype SheetRow; to route oftype Route; route: { - routeId: r cellInColumn 0, - agencyId: r cellInColumn 1, - routeShortName: r cellInColumn 2, - routeLongName: r cellInColumn 3, - routeDesc: r cellInColumn 4, - routeType: r cellInColumn 5, - routeUrl: r cellInColumn 6, - routeColor: r cellInColumn 7, - routeTextColor: r cellInColumn 8, + routeId: r . 0, + agencyId: r . 1, + routeShortName: r . 2, + routeLongName: r . 3, + routeDesc: r . 4, + routeType: r . 5, + routeUrl: r . 6, + routeColor: r . 7, + routeTextColor: r . 8, }; } diff --git a/libs/language-server/src/stdlib/domain/mobility/GTFSShapesInterpreter.jv b/libs/language-server/src/stdlib/domain/mobility/GTFSShapesInterpreter.jv index 2f0ce1e64..c3916a25b 100644 --- a/libs/language-server/src/stdlib/domain/mobility/GTFSShapesInterpreter.jv +++ b/libs/language-server/src/stdlib/domain/mobility/GTFSShapesInterpreter.jv @@ -10,15 +10,15 @@ valuetype Shape { property shapeDistTraveled oftype text; } transform ShapeParser { - from r oftype Collection; + from r oftype SheetRow; to shape oftype Shape; shape: { - shapeId: r cellInColumn 0, - shapePtLat: r cellInColumn 1, - shapePtLon: r cellInColumn 2, - shapePtSequence: r cellInColumn 3, - shapeDistTraveled: r cellInColumn 4, + shapeId: r . 0, + shapePtLat: r . 1, + shapePtLon: r . 2, + shapePtSequence: r . 3, + shapeDistTraveled: r . 4, }; } diff --git a/libs/language-server/src/stdlib/domain/mobility/GTFSStopTimesInterpreter.jv b/libs/language-server/src/stdlib/domain/mobility/GTFSStopTimesInterpreter.jv index a0e894cad..33b8cae3c 100644 --- a/libs/language-server/src/stdlib/domain/mobility/GTFSStopTimesInterpreter.jv +++ b/libs/language-server/src/stdlib/domain/mobility/GTFSStopTimesInterpreter.jv @@ -14,19 +14,19 @@ valuetype StopTime { property shapeDistTraveled oftype text; } transform StopTimeParser { - from r oftype Collection; + from r oftype SheetRow; to stopTime oftype StopTime; stopTime: { - tripId: r cellInColumn 0, - arrivalId: r cellInColumn 1, - departureTime: r cellInColumn 2, - stopId: r cellInColumn 3, - stopSequence: r cellInColumn 4, - stopHeadsign: r cellInColumn 5, - pickupType: r cellInColumn 6, - dropOffTime: r cellInColumn 7, - shapeDistTraveled: r cellInColumn 8, + tripId: r . 0, + arrivalId: r . 1, + departureTime: r . 2, + stopId: r . 3, + stopSequence: r . 4, + stopHeadsign: r . 5, + pickupType: r . 6, + dropOffTime: r . 7, + shapeDistTraveled: r . 8, }; } diff --git a/libs/language-server/src/stdlib/domain/mobility/GTFSStopsInterpreter.jv b/libs/language-server/src/stdlib/domain/mobility/GTFSStopsInterpreter.jv index ec37aa87f..58cb5a0b5 100644 --- a/libs/language-server/src/stdlib/domain/mobility/GTFSStopsInterpreter.jv +++ b/libs/language-server/src/stdlib/domain/mobility/GTFSStopsInterpreter.jv @@ -12,17 +12,17 @@ valuetype Stop { property stopUrl oftype text; } transform StopParser { - from r oftype Collection; + from r oftype SheetRow; to stop oftype Stop; stop: { - stopId: r cellInColumn 0, - stopName: r cellInColumn 1, - stopDesc: r cellInColumn 2, - stopLat: r cellInColumn 3, - stopLon: r cellInColumn 4, - zoneId: r cellInColumn 5, - stopUrl: r cellInColumn 6, + stopId: r . 0, + stopName: r . 1, + stopDesc: r . 2, + stopLat: r . 3, + stopLon: r . 4, + zoneId: r . 5, + stopUrl: r . 6, }; } diff --git a/libs/language-server/src/stdlib/domain/mobility/GTFSTripsInterpreter.jv b/libs/language-server/src/stdlib/domain/mobility/GTFSTripsInterpreter.jv index 549a12b27..62018c9b9 100644 --- a/libs/language-server/src/stdlib/domain/mobility/GTFSTripsInterpreter.jv +++ b/libs/language-server/src/stdlib/domain/mobility/GTFSTripsInterpreter.jv @@ -12,17 +12,17 @@ valuetype Trip { property shapeId oftype text; } transform TripParser { - from r oftype Collection; + from r oftype SheetRow; to trip oftype Trip; trip: { - routeId: r cellInColumn 0, - serviceId: r cellInColumn 1, - tripId: r cellInColumn 2, - tripHeadsign: r cellInColumn 3, - directionId: r cellInColumn 4, - blockId: r cellInColumn 5, - shapeId: r cellInColumn 6, + routeId: r . 0, + serviceId: r . 1, + tripId: r . 2, + tripHeadsign: r . 3, + directionId: r . 4, + blockId: r . 5, + shapeId: r . 6, }; }