@@ -42,6 +42,88 @@ class GraphQL
4242
4343 expect ( datastore_body_of ( query ) [ :_source ] ) . to eq ( true )
4444 end
45+
46+ it "still requests doc values when requesting all fields" do
47+ graphql = build_graphql ( schema_definition : lambda do |schema |
48+ schema . object_type "Widget" do |t |
49+ t . field "id" , "ID!"
50+ t . field "name" , "String"
51+ t . field "internal_code" , "String" , retrieved_from : :doc_values
52+ t . index "widgets"
53+ end
54+ end )
55+ query = graphql . datastore_query_builder . new_query (
56+ search_index_definitions : graphql . datastore_core . index_definitions_by_graphql_type . fetch ( "Widget" ) ,
57+ request_all_fields : true
58+ )
59+
60+ expect ( datastore_body_of ( query ) [ :_source ] ) . to eq true
61+ expect ( datastore_body_of ( query ) [ :docvalue_fields ] ) . to contain_exactly ( "internal_code" )
62+ end
63+
64+ it "still requests doc values when requesting all fields from mixed index definitions" do
65+ graphql = build_graphql ( schema_definition : lambda do |schema |
66+ schema . object_type "Widget" do |t |
67+ t . field "id" , "ID!"
68+ t . field "internal_code" , "String" , retrieved_from : :doc_values
69+ t . index "widgets"
70+ end
71+ end )
72+ doc_values_index_def = graphql . datastore_core . index_definitions_by_name . fetch ( "widgets" )
73+ source_backed_index_def = doc_values_index_def . with (
74+ fields_by_path : doc_values_index_def . fields_by_path . merge (
75+ "internal_code" => doc_values_index_def . fields_by_path . fetch ( "internal_code" ) . with ( retrieved_from : nil )
76+ )
77+ )
78+ query = graphql . datastore_query_builder . new_query (
79+ search_index_definitions : [ doc_values_index_def , source_backed_index_def ] ,
80+ request_all_fields : true
81+ )
82+
83+ expect ( datastore_body_of ( query ) [ :_source ] ) . to eq true
84+ expect ( datastore_body_of ( query ) [ :docvalue_fields ] ) . to contain_exactly ( "internal_code" )
85+ end
86+
87+ it "requests doc values for fields marked `retrieved_from: :doc_values`" do
88+ graphql = build_graphql ( schema_definition : lambda do |schema |
89+ schema . object_type "Widget" do |t |
90+ t . field "id" , "ID!"
91+ t . field "name" , "String"
92+ t . field "internal_code" , "String" , retrieved_from : :doc_values
93+ t . index "widgets"
94+ end
95+ end )
96+ query = graphql . datastore_query_builder . new_query (
97+ search_index_definitions : graphql . datastore_core . index_definitions_by_graphql_type . fetch ( "Widget" ) ,
98+ requested_fields : [ "internal_code" , "name" ]
99+ )
100+
101+ expect ( datastore_body_of ( query ) [ :docvalue_fields ] ) . to contain_exactly ( "internal_code" )
102+ expect ( datastore_body_of ( query ) [ :_source ] [ :includes ] ) . to contain_exactly ( "name" )
103+ end
104+
105+ it "keeps requesting `_source` when index definitions disagree on how to retrieve a field" do
106+ graphql = build_graphql ( schema_definition : lambda do |schema |
107+ schema . object_type "Widget" do |t |
108+ t . field "id" , "ID!"
109+ t . field "internal_code" , "String" , retrieved_from : :doc_values
110+ t . index "widgets"
111+ end
112+ end )
113+ doc_values_index_def = graphql . datastore_core . index_definitions_by_name . fetch ( "widgets" )
114+ source_backed_index_def = doc_values_index_def . with (
115+ fields_by_path : doc_values_index_def . fields_by_path . merge (
116+ "internal_code" => doc_values_index_def . fields_by_path . fetch ( "internal_code" ) . with ( retrieved_from : nil )
117+ )
118+ )
119+ query = graphql . datastore_query_builder . new_query (
120+ search_index_definitions : [ doc_values_index_def , source_backed_index_def ] ,
121+ requested_fields : [ "internal_code" ]
122+ )
123+
124+ expect ( datastore_body_of ( query ) [ :docvalue_fields ] ) . to eq nil
125+ expect ( datastore_body_of ( query ) [ :_source ] [ :includes ] ) . to contain_exactly ( "internal_code" )
126+ end
45127 end
46128 end
47129end
0 commit comments