diff --git a/pom.xml b/pom.xml
index 8d6a5f789..2324c041e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -353,7 +353,7 @@
com.graphql-java
graphql-java
- 4.2
+ 11.0
diff --git a/src/main/java/com/conveyal/gtfs/error/NewGTFSErrorType.java b/src/main/java/com/conveyal/gtfs/error/NewGTFSErrorType.java
index 8fa452d46..02fc5075d 100644
--- a/src/main/java/com/conveyal/gtfs/error/NewGTFSErrorType.java
+++ b/src/main/java/com/conveyal/gtfs/error/NewGTFSErrorType.java
@@ -36,6 +36,7 @@ public enum NewGTFSErrorType {
TABLE_TOO_LONG(Priority.MEDIUM, "Table is too long to record line numbers with a 32-bit integer, overflow will occur."),
TIME_ZONE_FORMAT(Priority.MEDIUM, "Time zone format should be X."),
REQUIRED_TABLE_EMPTY(Priority.MEDIUM, "This table is required by the GTFS specification but is empty."),
+ FEED_TRAVEL_TIMES_ROUNDED(Priority.LOW, "All travel times in the feed are rounded to the minute, which may cause unexpected results in routing applications where travel times are zero."),
ROUTE_DESCRIPTION_SAME_AS_NAME(Priority.LOW, "The description of a route is identical to its name, so does not add any information."),
ROUTE_LONG_NAME_CONTAINS_SHORT_NAME(Priority.LOW, "The long name of a route should complement the short name, not include it."),
ROUTE_SHORT_AND_LONG_NAME_MISSING(Priority.MEDIUM, "A route has neither a long nor a short name."),
diff --git a/src/main/java/com/conveyal/gtfs/error/SQLErrorStorage.java b/src/main/java/com/conveyal/gtfs/error/SQLErrorStorage.java
index be42d2504..eea55f3a2 100644
--- a/src/main/java/com/conveyal/gtfs/error/SQLErrorStorage.java
+++ b/src/main/java/com/conveyal/gtfs/error/SQLErrorStorage.java
@@ -11,6 +11,7 @@
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Map;
+import java.util.Set;
import static com.conveyal.gtfs.util.Util.ensureValidNamespace;
@@ -86,6 +87,12 @@ public void storeError (NewGTFSError error) {
}
}
+ public void storeErrors (Set errors) {
+ for (NewGTFSError error : errors) {
+ storeError(error);
+ }
+ }
+
/**
* Commits any outstanding error inserts and returns the error count via a SQL query.
*/
diff --git a/src/main/java/com/conveyal/gtfs/graphql/GraphQLGtfsSchema.java b/src/main/java/com/conveyal/gtfs/graphql/GraphQLGtfsSchema.java
index 76999ca11..b5702b85e 100644
--- a/src/main/java/com/conveyal/gtfs/graphql/GraphQLGtfsSchema.java
+++ b/src/main/java/com/conveyal/gtfs/graphql/GraphQLGtfsSchema.java
@@ -349,6 +349,7 @@ public class GraphQLGtfsSchema {
.type(new GraphQLList(routeType))
.argument(stringArg("namespace"))
.argument(stringArg(SEARCH_ARG))
+ .argument(intArg(LIMIT_ARG))
.dataFetcher(new NestedJDBCFetcher(
new JDBCFetcher("pattern_stops", "stop_id", null, false),
new JDBCFetcher("patterns", "pattern_id", null, false),
diff --git a/src/main/java/com/conveyal/gtfs/graphql/GraphQLUtil.java b/src/main/java/com/conveyal/gtfs/graphql/GraphQLUtil.java
index d74180a82..5002e5ccc 100644
--- a/src/main/java/com/conveyal/gtfs/graphql/GraphQLUtil.java
+++ b/src/main/java/com/conveyal/gtfs/graphql/GraphQLUtil.java
@@ -1,9 +1,9 @@
package com.conveyal.gtfs.graphql;
-import graphql.schema.FieldDataFetcher;
import graphql.schema.GraphQLArgument;
import graphql.schema.GraphQLFieldDefinition;
import graphql.schema.GraphQLList;
+import graphql.schema.PropertyDataFetcher;
import static graphql.Scalars.GraphQLFloat;
import static graphql.Scalars.GraphQLInt;
@@ -17,7 +17,7 @@ public static GraphQLFieldDefinition string (String name) {
return newFieldDefinition()
.name(name)
.type(GraphQLString)
- .dataFetcher(new FieldDataFetcher(name))
+ .dataFetcher(new PropertyDataFetcher(name))
.build();
}
@@ -25,7 +25,7 @@ public static GraphQLFieldDefinition intt (String name) {
return newFieldDefinition()
.name(name)
.type(GraphQLInt)
- .dataFetcher(new FieldDataFetcher(name))
+ .dataFetcher(new PropertyDataFetcher(name))
.build();
}
diff --git a/src/main/java/com/conveyal/gtfs/graphql/fetchers/FeedFetcher.java b/src/main/java/com/conveyal/gtfs/graphql/fetchers/FeedFetcher.java
index 4e505315b..5b5386529 100644
--- a/src/main/java/com/conveyal/gtfs/graphql/fetchers/FeedFetcher.java
+++ b/src/main/java/com/conveyal/gtfs/graphql/fetchers/FeedFetcher.java
@@ -14,6 +14,8 @@
import java.util.HashMap;
import java.util.Map;
+import static com.conveyal.gtfs.graphql.fetchers.JDBCFetcher.validateNamespace;
+
/**
* Fetch the summary row for a particular loaded feed, based on its namespace.
* This essentially gets the row from the top-level summary table of all feeds that have been loaded into the database.
@@ -25,6 +27,7 @@ public class FeedFetcher implements DataFetcher {
@Override
public Map get (DataFetchingEnvironment environment) {
String namespace = environment.getArgument("namespace"); // This is the unique table prefix (the "schema").
+ validateNamespace(namespace);
StringBuilder sqlBuilder = new StringBuilder();
sqlBuilder.append(String.format("select * from feeds where namespace = '%s'", namespace));
Connection connection = null;
diff --git a/src/main/java/com/conveyal/gtfs/graphql/fetchers/JDBCFetcher.java b/src/main/java/com/conveyal/gtfs/graphql/fetchers/JDBCFetcher.java
index 6ab6c90e9..3eac44404 100644
--- a/src/main/java/com/conveyal/gtfs/graphql/fetchers/JDBCFetcher.java
+++ b/src/main/java/com/conveyal/gtfs/graphql/fetchers/JDBCFetcher.java
@@ -167,12 +167,16 @@ public List