src/main/java/com/conveyal/gtfs/loader/JdbcTableWriter.java
private void updateLinkedFields(
        Table referenceTable,
        ObjectNode exemplarEntity,
        String linkedTableName,
        String keyField,
        String ...linkedFieldsToUpdate
    ) throws SQLException {
        boolean updatingStopTimes = "stop_times".equals(linkedTableName);
        // Collect fields, the JSON values for these fields, and the strings to add to the prepared statement into Lists.
        List<Field> fields = new ArrayList<>();
        List<JsonNode> values = new ArrayList<>();
        List<String> fieldStrings = new ArrayList<>();
        for (String field : linkedFieldsToUpdate) {
            fields.add(referenceTable.getFieldForName(field));
            values.add(exemplarEntity.get(field));
            fieldStrings.add(String.format("%s = ?", field));
        }
        String setFields = String.join(", ", fieldStrings);
        // If updating stop_times, use a more complex query that joins trips to stop_times in order to match on pattern_id
        Field orderField = updatingStopTimes ? referenceTable.getFieldForName(referenceTable.getOrderFieldName()) : null;
        String sql = updatingStopTimes
            ? String.format(
                "update %s.stop_times st set %s from %s.trips t " +
                    "where st.trip_id = t.trip_id AND t.%s = ? AND st.%s = ?",
                tablePrefix,
                setFields,
                tablePrefix,
                keyField,
                orderField.name
            )
            : String.format("update %s.%s set %s where %s = ?", tablePrefix, linkedTableName, setFields, keyField);
        // Prepare the statement and set statement parameters
        PreparedStatement statement = connection.prepareStatement(sql);
        int oneBasedIndex = 1;
        // Iterate over list of fields that need to be updated and set params.
        for (int i = 0; i < fields.size(); i++) {
            Field field = fields.get(i);
            String newValue = values.get(i).isNull() ? null : values.get(i).asText();
            if (newValue == null) field.setNull(statement, oneBasedIndex++);
            else field.setParameter(statement, oneBasedIndex++, newValue);
        }
        // Set "where clause" with value for key field (e.g., set values where pattern_id = '3')
        statement.setString(oneBasedIndex++, exemplarEntity.get(keyField).asText());
        if (updatingStopTimes) {
            // If updating stop times set the order field parameter (stop_sequence)
            String orderValue = exemplarEntity.get(orderField.name).asText();
            orderField.setParameter(statement, oneBasedIndex++, orderValue);
        }
        // Log query, execute statement, and log result.
        LOG.debug(statement.toString());
        int entitiesUpdated = statement.executeUpdate();
        LOG.debug("{} {} linked fields updated", entitiesUpdated, linkedTableName);
    }
private void updateLinkedFields(
        Table referenceTable,
        ObjectNode exemplarEntity,
        String linkedTableName,
        String keyField,
        String ...linkedFieldsToUpdate
    ) throws SQLException {
        boolean updatingStopTimes = "stop_times".equals(linkedTableName);
        // Collect fields, the JSON values for these fields, and the strings to add to the prepared statement into Lists.
        List<Field> fields = new ArrayList<>();
        List<JsonNode> values = new ArrayList<>();
        List<String> fieldStrings = new ArrayList<>();
        for (String field : linkedFieldsToUpdate) {
            fields.add(referenceTable.getFieldForName(field));
            values.add(exemplarEntity.get(field));
            fieldStrings.add(String.format("%s = ?", field));
        }
        String setFields = String.join(", ", fieldStrings);
        // If updating stop_times, use a more complex query that joins trips to stop_times in order to match on pattern_id
        Field orderField = updatingStopTimes ? referenceTable.getFieldForName(referenceTable.getOrderFieldName()) : null;
        String sql = updatingStopTimes
            ? String.format(
                "update %s.stop_times st set %s from %s.trips t " +
                    "where st.trip_id = t.trip_id AND t.%s = ? AND st.%s = ?",
                tablePrefix,
                setFields,
                tablePrefix,
                keyField,
                orderField.name
            )
            : String.format("update %s.%s set %s where %s = ?", tablePrefix, linkedTableName, setFields, keyField);
        // Prepare the statement and set statement parameters
        PreparedStatement statement = connection.prepareStatement(sql);
        int oneBasedIndex = 1;
        // Iterate over list of fields that need to be updated and set params.
        for (int i = 0; i < fields.size(); i++) {
            Field field = fields.get(i);
            String newValue = values.get(i).isNull() ? null : values.get(i).asText();
            if (newValue == null) field.setNull(statement, oneBasedIndex++);
            else field.setParameter(statement, oneBasedIndex++, newValue);
        }
        // Set "where clause" with value for key field (e.g., set values where pattern_id = '3')
        statement.setString(oneBasedIndex++, exemplarEntity.get(keyField).asText());
        if (updatingStopTimes) {
            // If updating stop times set the order field parameter (stop_sequence)
            String orderValue = exemplarEntity.get(orderField.name).asText();
            orderField.setParameter(statement, oneBasedIndex++, orderValue);
        }
        // Log query, execute statement, and log result.
        LOG.debug(statement.toString());
        int entitiesUpdated = statement.executeUpdate();
        LOG.debug("{} {} linked fields updated", entitiesUpdated, linkedTableName);
    }
private void updateLinkedFields ( Table referenceTable , ObjectNode exemplarEntity , String linkedTableName , String keyField , String ... linkedFieldsToUpdate ) throws SQLException { boolean updatingStopTimes = "stop_times" . equals ( linkedTableName ) ; // Collect fields, the JSON values for these fields, and the strings to add to the prepared statement into Lists. List < Field > fields = new ArrayList <> ( ) ; List < JsonNode > values = new ArrayList <> ( ) ; List < String > fieldStrings = new ArrayList <> ( ) ; for ( String field : linkedFieldsToUpdate ) { fields . add ( referenceTable . getFieldForName ( field ) ) ; values . add ( exemplarEntity . get ( field ) ) ; fieldStrings . add ( String . format ( "%s = ?" , field ) ) ; } String setFields = String . join ( ", " , fieldStrings ) ; // If updating stop_times, use a more complex query that joins trips to stop_times in order to match on pattern_id Field orderField = updatingStopTimes ? referenceTable . getFieldForName ( referenceTable . getOrderFieldName ( ) ) : null ; String sql = updatingStopTimes ? String . format ( "update %s.stop_times st set %s from %s.trips t " + "where st.trip_id = t.trip_id AND t.%s = ? AND st.%s = ?" , tablePrefix , setFields , tablePrefix , keyField , orderField . name ) : String . format ( "update %s.%s set %s where %s = ?" , tablePrefix , linkedTableName , setFields , keyField ) ; // Prepare the statement and set statement parameters PreparedStatement statement = connection . prepareStatement ( sql ) ; int oneBasedIndex = 1 ; // Iterate over list of fields that need to be updated and set params. for ( int i = 0 ; i < fields . size ( ) ; i ++ ) { Field field = fields . get ( i ) ; String newValue = values . get ( i ) . isNull ( ) ? null : values . get ( i ) . asText ( ) ; if ( newValue == null ) field . setNull ( statement , oneBasedIndex ++ ) ; else field . setParameter ( statement , oneBasedIndex ++ , newValue ) ; } // Set "where clause" with value for key field (e.g., set values where pattern_id = '3') statement . setString ( oneBasedIndex ++ , exemplarEntity . get ( keyField ) . asText ( ) ) ; if ( updatingStopTimes ) { // If updating stop times set the order field parameter (stop_sequence) String orderValue = exemplarEntity . get ( orderField . name ) . asText ( ) ; orderField . setParameter ( statement , oneBasedIndex ++ , orderValue ) ; } // Log query, execute statement, and log result. LOG . debug ( statement . toString ( ) ) ; int entitiesUpdated = statement . executeUpdate ( ) ; LOG . debug ( "{} {} linked fields updated" , entitiesUpdated , linkedTableName ) ; }
Updates linked fields with values from entity being updated. This is used to update identical fields in related
tables (for now just fields in trips and stop_times) where the reference table's value should take precedence over
the related table (e.g., pattern_stop#timepoint should update all of its related stop_times).
Updates linked fields with values from entity being updated . This is used to update identical fields in related tables ( for now just fields in trips and stop_times ) where the reference table s value should take precedence over the related table ( e . g . pattern_stop#timepoint should update all of its related stop_times ) .