Skip to content

Commit e8daf52

Browse files
author
Robert Mosolgo
authored
Merge pull request rmosolgo#2572 from rmosolgo/parser-tuning
Tune parser for query with lots of nested fields
2 parents a803b83 + 1703638 commit e8daf52

File tree

6 files changed

+117
-106
lines changed

6 files changed

+117
-106
lines changed

lib/graphql/language/lexer.rb

Lines changed: 49 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -314,7 +314,7 @@ def self.run_lexer(query_string)
314314
begin
315315
te = p+1;
316316
begin
317-
emit(:RCURLY, ts, te, meta)
317+
emit(:RCURLY, ts, te, meta, "}")
318318
end
319319
320320
end
@@ -328,7 +328,7 @@ def self.run_lexer(query_string)
328328
begin
329329
te = p+1;
330330
begin
331-
emit(:LCURLY, ts, te, meta)
331+
emit(:LCURLY, ts, te, meta, "{")
332332
end
333333
334334
end
@@ -342,7 +342,7 @@ def self.run_lexer(query_string)
342342
begin
343343
te = p+1;
344344
begin
345-
emit(:RPAREN, ts, te, meta)
345+
emit(:RPAREN, ts, te, meta, ")")
346346
end
347347
348348
end
@@ -356,7 +356,7 @@ def self.run_lexer(query_string)
356356
begin
357357
te = p+1;
358358
begin
359-
emit(:LPAREN, ts, te, meta)
359+
emit(:LPAREN, ts, te, meta, "(")
360360
end
361361
362362
end
@@ -370,7 +370,7 @@ def self.run_lexer(query_string)
370370
begin
371371
te = p+1;
372372
begin
373-
emit(:RBRACKET, ts, te, meta)
373+
emit(:RBRACKET, ts, te, meta, "]")
374374
end
375375
376376
end
@@ -384,7 +384,7 @@ def self.run_lexer(query_string)
384384
begin
385385
te = p+1;
386386
begin
387-
emit(:LBRACKET, ts, te, meta)
387+
emit(:LBRACKET, ts, te, meta, "[")
388388
end
389389
390390
end
@@ -398,7 +398,7 @@ def self.run_lexer(query_string)
398398
begin
399399
te = p+1;
400400
begin
401-
emit(:COLON, ts, te, meta)
401+
emit(:COLON, ts, te, meta, ":")
402402
end
403403
404404
end
@@ -440,7 +440,7 @@ def self.run_lexer(query_string)
440440
begin
441441
te = p+1;
442442
begin
443-
emit(:VAR_SIGN, ts, te, meta)
443+
emit(:VAR_SIGN, ts, te, meta, "$")
444444
end
445445
446446
end
@@ -454,7 +454,7 @@ def self.run_lexer(query_string)
454454
begin
455455
te = p+1;
456456
begin
457-
emit(:DIR_SIGN, ts, te, meta)
457+
emit(:DIR_SIGN, ts, te, meta, "@")
458458
end
459459
460460
end
@@ -468,7 +468,7 @@ def self.run_lexer(query_string)
468468
begin
469469
te = p+1;
470470
begin
471-
emit(:ELLIPSIS, ts, te, meta)
471+
emit(:ELLIPSIS, ts, te, meta, "...")
472472
end
473473
474474
end
@@ -482,7 +482,7 @@ def self.run_lexer(query_string)
482482
begin
483483
te = p+1;
484484
begin
485-
emit(:EQUALS, ts, te, meta)
485+
emit(:EQUALS, ts, te, meta, "=")
486486
end
487487
488488
end
@@ -496,7 +496,7 @@ def self.run_lexer(query_string)
496496
begin
497497
te = p+1;
498498
begin
499-
emit(:BANG, ts, te, meta)
499+
emit(:BANG, ts, te, meta, "!")
500500
end
501501
502502
end
@@ -510,7 +510,7 @@ def self.run_lexer(query_string)
510510
begin
511511
te = p+1;
512512
begin
513-
emit(:PIPE, ts, te, meta)
513+
emit(:PIPE, ts, te, meta, "|")
514514
end
515515
516516
end
@@ -524,7 +524,7 @@ def self.run_lexer(query_string)
524524
begin
525525
te = p+1;
526526
begin
527-
emit(:AMP, ts, te, meta)
527+
emit(:AMP, ts, te, meta, "&")
528528
end
529529
530530
end
@@ -738,63 +738,63 @@ def self.run_lexer(query_string)
738738
begin
739739
p = ((te))-1;
740740
begin
741-
emit(:ON, ts, te, meta)
741+
emit(:ON, ts, te, meta, "on")
742742
end
743743
744744
end
745745
when 5 then
746746
begin
747747
p = ((te))-1;
748748
begin
749-
emit(:FRAGMENT, ts, te, meta)
749+
emit(:FRAGMENT, ts, te, meta, "fragment")
750750
end
751751
752752
end
753753
when 6 then
754754
begin
755755
p = ((te))-1;
756756
begin
757-
emit(:TRUE, ts, te, meta)
757+
emit(:TRUE, ts, te, meta, "true")
758758
end
759759
760760
end
761761
when 7 then
762762
begin
763763
p = ((te))-1;
764764
begin
765-
emit(:FALSE, ts, te, meta)
765+
emit(:FALSE, ts, te, meta, "false")
766766
end
767767
768768
end
769769
when 8 then
770770
begin
771771
p = ((te))-1;
772772
begin
773-
emit(:NULL, ts, te, meta)
773+
emit(:NULL, ts, te, meta, "null")
774774
end
775775
776776
end
777777
when 9 then
778778
begin
779779
p = ((te))-1;
780780
begin
781-
emit(:QUERY, ts, te, meta)
781+
emit(:QUERY, ts, te, meta, "query")
782782
end
783783
784784
end
785785
when 10 then
786786
begin
787787
p = ((te))-1;
788788
begin
789-
emit(:MUTATION, ts, te, meta)
789+
emit(:MUTATION, ts, te, meta, "mutation")
790790
end
791791
792792
end
793793
when 11 then
794794
begin
795795
p = ((te))-1;
796796
begin
797-
emit(:SUBSCRIPTION, ts, te, meta)
797+
emit(:SUBSCRIPTION, ts, te, meta, "subscription")
798798
end
799799
800800
end
@@ -1371,25 +1371,26 @@ def self.run_lexer(query_string)
13711371
13721372
def self.record_comment(ts, te, meta)
13731373
token = GraphQL::Language::Token.new(
1374-
name: :COMMENT,
1375-
value: meta[:data][ts, te - ts].pack(PACK_DIRECTIVE).force_encoding(UTF_8_ENCODING),
1376-
line: meta[:line],
1377-
col: meta[:col],
1378-
prev_token: meta[:previous_token],
1374+
:COMMENT,
1375+
meta[:data][ts, te - ts].pack(PACK_DIRECTIVE).force_encoding(UTF_8_ENCODING),
1376+
meta[:line],
1377+
meta[:col],
1378+
meta[:previous_token],
13791379
)
13801380
13811381
meta[:previous_token] = token
13821382
13831383
meta[:col] += te - ts
13841384
end
13851385
1386-
def self.emit(token_name, ts, te, meta)
1386+
def self.emit(token_name, ts, te, meta, token_value = nil)
1387+
token_value ||= meta[:data][ts, te - ts].pack(PACK_DIRECTIVE).force_encoding(UTF_8_ENCODING)
13871388
meta[:tokens] << token = GraphQL::Language::Token.new(
1388-
name: token_name,
1389-
value: meta[:data][ts, te - ts].pack(PACK_DIRECTIVE).force_encoding(UTF_8_ENCODING),
1390-
line: meta[:line],
1391-
col: meta[:col],
1392-
prev_token: meta[:previous_token],
1389+
token_name,
1390+
token_value,
1391+
meta[:line],
1392+
meta[:col],
1393+
meta[:previous_token],
13931394
)
13941395
meta[:previous_token] = token
13951396
# Bump the column counter for the next token
@@ -1428,30 +1429,30 @@ def self.emit_string(ts, te, meta, block:)
14281429
# (It's faster: https://bugs.ruby-lang.org/issues/8110)
14291430
if !value.valid_encoding? || value !~ VALID_STRING
14301431
meta[:tokens] << token = GraphQL::Language::Token.new(
1431-
name: :BAD_UNICODE_ESCAPE,
1432-
value: value,
1433-
line: meta[:line],
1434-
col: meta[:col],
1435-
prev_token: meta[:previous_token],
1432+
:BAD_UNICODE_ESCAPE,
1433+
value,
1434+
meta[:line],
1435+
meta[:col],
1436+
meta[:previous_token],
14361437
)
14371438
else
14381439
replace_escaped_characters_in_place(value)
14391440
14401441
if !value.valid_encoding?
14411442
meta[:tokens] << token = GraphQL::Language::Token.new(
1442-
name: :BAD_UNICODE_ESCAPE,
1443-
value: value,
1444-
line: meta[:line],
1445-
col: meta[:col],
1446-
prev_token: meta[:previous_token],
1443+
:BAD_UNICODE_ESCAPE,
1444+
value,
1445+
meta[:line],
1446+
meta[:col],
1447+
meta[:previous_token],
14471448
)
14481449
else
14491450
meta[:tokens] << token = GraphQL::Language::Token.new(
1450-
name: :STRING,
1451-
value: value,
1452-
line: meta[:line],
1453-
col: meta[:col],
1454-
prev_token: meta[:previous_token],
1451+
:STRING,
1452+
value,
1453+
meta[:line],
1454+
meta[:col],
1455+
meta[:previous_token],
14551456
)
14561457
end
14571458
end

0 commit comments

Comments
 (0)