@@ -133,12 +133,50 @@ void hSetAndHGetWithDatabase() throws Exception {
133133
134134 // Test HGET - retrieve by index (syntax: HGET <indexName> <key>)
135135 response = executeCommand (0 , "redis" , "HGET Person[id] 1" );
136- final String docJson = (String ) getResultValue (response );
137- final JSONObject doc = new JSONObject (docJson );
136+ final JSONArray results = response .getJSONArray ("result" );
137+ assertThat (results .length ()).isEqualTo (1 );
138+ final JSONObject doc = results .getJSONObject (0 );
138139 assertThat (doc .getInt ("id" )).isEqualTo (1 );
139140 assertThat (doc .getString ("name" )).isEqualTo ("John" );
140141 }
141142
143+ @ Test
144+ void hGetReturnsConsistentFormatWithSQL () throws Exception {
145+ // Issue #3470: Redis HGET should return documents in the same format as SQL/OpenCypher
146+ // i.e. {"result": [{"@rid":"...","@type":"...","id":1}]}
147+ // NOT {"result": [{"value": "{\"@rid\":\"...\",\"id\":1}"}]}
148+ final Database database = getServerDatabase (0 , getDatabaseName ());
149+
150+ database .command ("sql" , "CREATE VERTEX TYPE doc" );
151+ database .command ("sql" , "CREATE PROPERTY doc.id LONG" );
152+ database .command ("sql" , "CREATE INDEX ON doc (id) UNIQUE" );
153+ database .command ("sql" , "INSERT INTO doc SET id = 1" );
154+
155+ // Query via SQL
156+ final JSONObject sqlResponse = executeQuery (0 , "sql" , "SELECT FROM doc WHERE id = 1" );
157+ final JSONArray sqlResults = sqlResponse .getJSONArray ("result" );
158+ assertThat (sqlResults .length ()).isEqualTo (1 );
159+ final JSONObject sqlDoc = sqlResults .getJSONObject (0 );
160+
161+ // Query via Redis HGET
162+ final JSONObject redisResponse = executeQuery (0 , "redis" , "HGET doc[id] 1" );
163+ final JSONArray redisResults = redisResponse .getJSONArray ("result" );
164+ assertThat (redisResults .length ()).isEqualTo (1 );
165+ final JSONObject redisDoc = redisResults .getJSONObject (0 );
166+
167+ // Both should have the same structure: document properties at the top level, not wrapped in "value"
168+ assertThat (redisDoc .has ("@rid" )).isTrue ();
169+ assertThat (redisDoc .has ("@type" )).isTrue ();
170+ assertThat (redisDoc .getLong ("id" )).isEqualTo (1L );
171+
172+ // Should NOT have a "value" wrapper
173+ assertThat (redisDoc .has ("value" )).isFalse ();
174+
175+ // Should match SQL result structure
176+ assertThat (redisDoc .getString ("@rid" )).isEqualTo (sqlDoc .getString ("@rid" ));
177+ assertThat (redisDoc .getString ("@type" )).isEqualTo (sqlDoc .getString ("@type" ));
178+ }
179+
142180 @ Test
143181 void hExistsCommand () throws Exception {
144182 final Database database = getServerDatabase (0 , getDatabaseName ());
@@ -409,7 +447,8 @@ void nonIdempotentCommandsRejectedOnQueryEndpoint() throws Exception {
409447 assertThat (getResultValue (response )).isEqualTo ("PONG" );
410448
411449 response = executeQuery (0 , "redis" , "HGET doc[id] 1" );
412- assertThat (getResultValue (response )).isNotNull ();
450+ assertThat (response .getJSONArray ("result" ).length ()).isEqualTo (1 );
451+ assertThat (response .getJSONArray ("result" ).getJSONObject (0 ).has ("@rid" )).isTrue ();
413452
414453 response = executeQuery (0 , "redis" , "HEXISTS doc[id] 1" );
415454 assertThat (getResultValueAsInt (response )).isEqualTo (1 );
0 commit comments