PageRenderTime 51ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 0ms

/test/unit/http/test-http-schema.rb

https://github.com/darashi/groonga
Ruby | 801 lines | 727 code | 58 blank | 16 comment | 1 complexity | bf325c3f7776a73660ce4e043cdb58d9 MD5 | raw file
Possible License(s): LGPL-2.1
  1. # -*- coding: utf-8 -*-
  2. #
  3. # Copyright (C) 2009-2011 Kouhei Sutou <kou@clear-code.com>
  4. #
  5. # This library is free software; you can redistribute it and/or
  6. # modify it under the terms of the GNU Lesser General Public
  7. # License version 2.1 as published by the Free Software Foundation.
  8. #
  9. # This library is distributed in the hope that it will be useful,
  10. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  12. # Lesser General Public License for more details.
  13. #
  14. # You should have received a copy of the GNU Lesser General Public
  15. # License along with this library; if not, write to the Free Software
  16. # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  17. class HTTPSchemaTest < Test::Unit::TestCase
  18. module Utils
  19. include GroongaHTTPTestUtils
  20. def setup
  21. setup_server
  22. end
  23. def teardown
  24. teardown_server
  25. end
  26. private
  27. def create_bookmarks_table
  28. @bookmarks_table_id = table_create("bookmarks",
  29. :flags => Table::PAT_KEY,
  30. :key_type => "ShortText",
  31. :value_type => "Object",
  32. :default_tokenizer => "")
  33. end
  34. def create_bookmark_title_column
  35. @bookmarks_title_column_id = column_create("bookmarks",
  36. "title",
  37. Column::SCALAR,
  38. "ShortText")
  39. end
  40. def assert_table_list(expected)
  41. response = get(command_path(:table_list))
  42. expected = expected.collect do |values|
  43. id, name, flags, domain, range = values
  44. [id, name, nil, flags, domain, range]
  45. end
  46. assert_response_body([[["id", "UInt32"],
  47. ["name", "ShortText"],
  48. ["path", "ShortText"],
  49. ["flags", "ShortText"],
  50. ["domain", "ShortText"],
  51. ["range", "ShortText"]],
  52. *expected],
  53. response,
  54. :content_type => "application/json") do |actual|
  55. status, result = actual
  56. header, *values = result
  57. values = values.collect do |value|
  58. id, name, path, flags, domain, range = value
  59. [id, name, nil, flags, domain, range]
  60. end
  61. [status, [header, *values]]
  62. end
  63. end
  64. def assert_column_list(expected, options)
  65. response = get(command_path(:column_list, options))
  66. expected = expected.collect do |values|
  67. id, name, type, flags, domain, range, source = values
  68. [id, name, nil, type, flags, domain, range, source]
  69. end
  70. assert_response_body([[["id", "UInt32"],
  71. ["name", "ShortText"],
  72. ["path", "ShortText"],
  73. ["type", "ShortText"],
  74. ["flags", "ShortText"],
  75. ["domain", "ShortText"],
  76. ["range", "ShortText"],
  77. ["source", "ShortText"]],
  78. *expected],
  79. response,
  80. :content_type => "application/json") do |actual|
  81. status, result = actual
  82. header, *values = result
  83. values = values.collect do |value|
  84. id, name, path, type, flags, domain, range, source = value
  85. [id, name, nil, type, flags, domain, range, source]
  86. end
  87. [status, [header, *values]]
  88. end
  89. end
  90. end
  91. include Utils
  92. def test_table_list_empty
  93. assert_table_list([])
  94. end
  95. def test_table_list_exist
  96. create_bookmarks_table
  97. assert_table_list([[@bookmarks_table_id,
  98. "bookmarks",
  99. "TABLE_PAT_KEY|PERSISTENT",
  100. "ShortText",
  101. "Object"]])
  102. end
  103. def test_table_list_with_invalid_output_type
  104. omit('now invalid output types are interpreted to json')
  105. response = get(command_path(:table_list,
  106. :output_type => "unknown"))
  107. assert_response([[Result::UNKNOWN_ERROR, "should be implemented"]],
  108. response,
  109. :content_type => "application/json")
  110. end
  111. def test_column_list_empty
  112. create_bookmarks_table
  113. assert_column_list([[@bookmarks_table_id,
  114. "_key",
  115. "",
  116. "COLUMN_SCALAR",
  117. "bookmarks",
  118. "ShortText",
  119. []]],
  120. :table => "bookmarks")
  121. end
  122. def test_column_list_exist
  123. create_bookmarks_table
  124. create_bookmark_title_column
  125. assert_column_list([[@bookmarks_table_id,
  126. "_key",
  127. "",
  128. "COLUMN_SCALAR",
  129. "bookmarks",
  130. "ShortText",
  131. []],
  132. [@bookmarks_title_column_id,
  133. "title",
  134. "var",
  135. "COLUMN_SCALAR|PERSISTENT",
  136. "bookmarks",
  137. "ShortText",
  138. []]],
  139. :table => "bookmarks")
  140. end
  141. def test_column_list_nonexistent
  142. response = get(command_path(:column_list,
  143. :table => "nonexistent"))
  144. assert_error_response(Result::INVALID_ARGUMENT,
  145. "table 'nonexistent' does not exist.",
  146. response,
  147. :content_type => "application/json")
  148. end
  149. def test_column_list_without_table
  150. response = get(command_path(:column_list))
  151. assert_error_response(Result::INVALID_ARGUMENT, "table '' does not exist.",
  152. response,
  153. :content_type => "application/json")
  154. end
  155. def test_column_list_with_invalid_output_type
  156. omit('now invalid output types are interpreted to json')
  157. create_bookmarks_table
  158. response = get(command_path(:column_list,
  159. :table => "bookmarks",
  160. :output_type => "unknown"))
  161. assert_error_response(Result::UNKNOWN_ERROR, "should be implemented",
  162. response,
  163. :content_type => "application/json")
  164. end
  165. def test_column_list_with_invalid_output_type_without_table
  166. omit('now invalid output types are interpreted to json')
  167. response = get(command_path(:column_list,
  168. :output_type => "unknown"))
  169. assert_error_response(Result::UNKNOWN_ERROR, "should be implemented",
  170. response,
  171. :content_type => "application/json")
  172. end
  173. def test_table_create_without_name
  174. response = get(command_path(:table_create))
  175. assert_error_response(Result::INVALID_ARGUMENT,
  176. "should not create anonymous table",
  177. response,
  178. :content_type => "application/json")
  179. end
  180. def test_table_create_with_dot_name
  181. response = get(command_path(:table_create, :name => "mori.daijiro"))
  182. assert_error_response(Result::INVALID_ARGUMENT,
  183. "[table][create]: " +
  184. "name can't start with '_' " +
  185. "and contains only 0-9, A-Z, a-z, #, - or _: " +
  186. "<mori.daijiro>",
  187. response,
  188. :content_type => "application/json")
  189. end
  190. def test_table_create_with_under_score_started_name
  191. response = get(command_path(:table_create, :name => "_mori"))
  192. assert_error_response(Result::INVALID_ARGUMENT,
  193. "[table][create]: " +
  194. "name can't start with '_' " +
  195. "and contains only 0-9, A-Z, a-z, #, - or _: " +
  196. "<_mori>",
  197. response,
  198. :content_type => "application/json")
  199. end
  200. def test_table_create_with_under_score_name
  201. response = get(command_path(:table_create, :name => "mori_daijiro"))
  202. assert_success_response(response, :content_type => "application/json")
  203. end
  204. def test_table_create_with_colon_name
  205. response = get(command_path(:table_create, :name => "daijiro:mori"))
  206. assert_error_response(Result::INVALID_ARGUMENT,
  207. "[table][create]: " +
  208. "name can't start with '_' " +
  209. "and contains only 0-9, A-Z, a-z, #, - or _: " +
  210. "<daijiro:mori>",
  211. response,
  212. :content_type => "application/json")
  213. end
  214. def test_table_create_with_duplicated_name
  215. response = get(command_path(:table_create, :name => "daijiro"))
  216. assert_success_response(response, :content_type => "application/json")
  217. response = get(command_path(:table_create, :name => "daijiro"))
  218. assert_error_response(Result::INVALID_ARGUMENT,
  219. "already used name was assigned: <daijiro>",
  220. response,
  221. :content_type => "application/json")
  222. end
  223. def test_full_text_search
  224. create_bookmarks_table
  225. create_bookmark_title_column
  226. table_create("terms",
  227. :flags => Table::PAT_KEY | Key::NORMALIZE,
  228. :key_type => "ShortText",
  229. :default_tokenizer => "TokenBigram")
  230. column_create("terms", "bookmarks_title",
  231. Column::INDEX | Flag::WITH_POSITION,
  232. "bookmarks",
  233. :source => "title")
  234. groonga_title = "groonga - an open-source fulltext search engine " +
  235. "and column store."
  236. senna_title = "Senna: An Embeddable Fulltext Search Engine"
  237. load("bookmarks",
  238. [{"_key" => "groonga", "title" => groonga_title},
  239. {"_key" => "senna", "title" => senna_title}])
  240. assert_select([["_key", "ShortText"],
  241. ["title", "ShortText"]],
  242. [["groonga", groonga_title]],
  243. :table => "bookmarks",
  244. :output_columns => "_key title",
  245. :query => "title:@column")
  246. end
  247. class HashCreateTest < Test::Unit::TestCase
  248. include Utils
  249. def test_simple
  250. table_id = table_create("users")
  251. assert_table_list([[table_id,
  252. "users",
  253. "TABLE_HASH_KEY|PERSISTENT",
  254. "null",
  255. "null"]])
  256. end
  257. def test_normalize_key
  258. table_id = table_create("users", :flags => Key::NORMALIZE)
  259. assert_table_list([[table_id,
  260. "users",
  261. "TABLE_HASH_KEY|KEY_NORMALIZE|PERSISTENT",
  262. "null",
  263. "null"]])
  264. end
  265. def test_normalized_string_key
  266. table_id = table_create("users",
  267. :flags => Key::NORMALIZE,
  268. :key_type => "ShortText")
  269. assert_table_list([[table_id,
  270. "users",
  271. "TABLE_HASH_KEY|KEY_NORMALIZE|PERSISTENT",
  272. "ShortText",
  273. "null"]])
  274. end
  275. def test_view_key
  276. users_table_id = table_create("users", :flags => Table::VIEW)
  277. sites_table_id = table_create("sites", :key_type => "users")
  278. assert_table_list([[sites_table_id,
  279. "sites",
  280. "TABLE_HASH_KEY|PERSISTENT",
  281. "users",
  282. "null"],
  283. [users_table_id,
  284. "users",
  285. "TABLE_VIEW|PERSISTENT",
  286. "null",
  287. "null"]])
  288. end
  289. def test_long_size_key
  290. response = get(command_path(:table_create,
  291. :name => "users",
  292. :key_type => "Text"))
  293. assert_error_response(Result::UNKNOWN_ERROR,
  294. "should implement error case",
  295. response,
  296. :content_type => "application/json")
  297. assert_table_list([])
  298. end
  299. def test_sis
  300. response = get(command_path(:table_create,
  301. :name => "users",
  302. :flags => Key::SIS,
  303. :key_type => "ShortText"))
  304. assert_error_response(Result::UNKNOWN_ERROR,
  305. "SIS is invalid flag for hash",
  306. response,
  307. :content_type => "application/json")
  308. assert_table_list([])
  309. end
  310. def test_nonexistent_key_type
  311. response = get(command_path(:table_create,
  312. :name => "users",
  313. :key_type => "nonexistent"))
  314. assert_error_response(Result::INVALID_ARGUMENT,
  315. "key type doesn't exist: <nonexistent>",
  316. response,
  317. :content_type => "application/json")
  318. assert_table_list([])
  319. end
  320. def test_invalid_key_type
  321. response = get(command_path(:table_create,
  322. :name => "users",
  323. :key_type => "table_create"))
  324. assert_error_response(Result::UNKNOWN_ERROR,
  325. "should implement error case",
  326. response,
  327. :content_type => "application/json")
  328. assert_table_list([])
  329. end
  330. def test_value_type
  331. table_id = table_create("users", :value_type => "Int32")
  332. assert_table_list([[table_id,
  333. "users",
  334. "TABLE_HASH_KEY|PERSISTENT",
  335. "null",
  336. "Int32"]])
  337. end
  338. def test_nonexistent_value_type
  339. response = get(command_path(:table_create,
  340. :name => "users",
  341. :value_type => "nonexistent"))
  342. assert_error_response(Result::INVALID_ARGUMENT,
  343. "value type doesn't exist: <nonexistent>",
  344. response,
  345. :content_type => "application/json")
  346. assert_table_list([])
  347. end
  348. end
  349. class PatriciaTrieCreateTest < Test::Unit::TestCase
  350. include Utils
  351. def test_simple
  352. table_id = table_create("users", :flags => Table::PAT_KEY)
  353. assert_table_list([[table_id,
  354. "users",
  355. "TABLE_PAT_KEY|PERSISTENT",
  356. "null",
  357. "null"]])
  358. end
  359. def test_normalize_key
  360. table_id = table_create("users",
  361. :flags => Table::PAT_KEY | Key::NORMALIZE)
  362. assert_table_list([[table_id,
  363. "users",
  364. "TABLE_PAT_KEY|KEY_NORMALIZE|PERSISTENT",
  365. "null",
  366. "null"]])
  367. end
  368. def test_normalized_string_key
  369. table_id = table_create("users",
  370. :flags => Table::PAT_KEY | Key::NORMALIZE,
  371. :key_type => "ShortText")
  372. assert_table_list([[table_id,
  373. "users",
  374. "TABLE_PAT_KEY|KEY_NORMALIZE|PERSISTENT",
  375. "ShortText",
  376. "null"]])
  377. end
  378. def test_view_key
  379. users_table_id = table_create("users", :flags => Table::VIEW)
  380. sites_table_id = table_create("sites",
  381. :flags => Table::PAT_KEY,
  382. :key_type => "users")
  383. assert_table_list([[sites_table_id,
  384. "sites",
  385. "TABLE_PAT_KEY|PERSISTENT",
  386. "users",
  387. "null"],
  388. [users_table_id,
  389. "users",
  390. "TABLE_VIEW|PERSISTENT",
  391. "null",
  392. "null"]])
  393. end
  394. def test_long_size_key
  395. response = get(command_path(:table_create,
  396. :name => "users",
  397. :flags => Table::PAT_KEY,
  398. :key_type => "Text"))
  399. assert_error_response(Result::UNKNOWN_ERROR,
  400. "should implement error case",
  401. response,
  402. :content_type => "application/json")
  403. assert_table_list([])
  404. end
  405. def test_sis
  406. table_id = table_create("users",
  407. :flags => Table::PAT_KEY | Key::SIS,
  408. :key_type => "ShortText")
  409. assert_table_list([[table_id,
  410. "users",
  411. "TABLE_PAT_KEY|KEY_WITH_SIS|PERSISTENT",
  412. "ShortText",
  413. "null"]])
  414. end
  415. def test_nonexistent_key_type
  416. response = get(command_path(:table_create,
  417. :name => "users",
  418. :flags => Table::PAT_KEY,
  419. :key_type => "nonexistent"))
  420. assert_error_response(Result::INVALID_ARGUMENT,
  421. "key type doesn't exist: <nonexistent>",
  422. response,
  423. :content_type => "application/json")
  424. assert_table_list([])
  425. end
  426. def test_invalid_key_type
  427. response = get(command_path(:table_create,
  428. :name => "users",
  429. :flags => Table::PAT_KEY,
  430. :key_type => "table_create"))
  431. assert_error_response(Result::UNKNOWN_ERROR,
  432. "should implement error case",
  433. response,
  434. :content_type => "application/json")
  435. assert_table_list([])
  436. end
  437. def test_value_type
  438. table_id = table_create("users",
  439. :flags => Table::PAT_KEY,
  440. :value_type => "Int32")
  441. assert_table_list([[table_id,
  442. "users",
  443. "TABLE_PAT_KEY|PERSISTENT",
  444. "null",
  445. "Int32"]])
  446. end
  447. def test_nonexistent_value_type
  448. response = get(command_path(:table_create,
  449. :name => "users",
  450. :flags => Table::PAT_KEY,
  451. :value_type => "nonexistent"))
  452. assert_error_response(Result::INVALID_ARGUMENT,
  453. "value type doesn't exist: <nonexistent>",
  454. response,
  455. :content_type => "application/json")
  456. assert_table_list([])
  457. end
  458. end
  459. class ArrayCreateTest < Test::Unit::TestCase
  460. include Utils
  461. def test_simple
  462. table_id = table_create("users", :flags => Table::NO_KEY)
  463. assert_table_list([[table_id,
  464. "users",
  465. "TABLE_NO_KEY|PERSISTENT",
  466. "null",
  467. "null"]])
  468. end
  469. def test_normalize_key
  470. response = get(command_path(:table_create,
  471. :name => "users",
  472. :flags => Table::NO_KEY | Key::NORMALIZE))
  473. assert_error_response(Result::UNKNOWN_ERROR,
  474. "key normalization isn't available",
  475. response,
  476. :content_type => "application/json")
  477. assert_table_list([])
  478. end
  479. def test_key_type
  480. response = get(command_path(:table_create,
  481. :name => "users",
  482. :flags => Table::NO_KEY,
  483. :key_type => "ShortText"))
  484. assert_error_response(Result::INVALID_ARGUMENT,
  485. "key_type assigned for no key table: <users>",
  486. response,
  487. :content_type => "application/json")
  488. assert_table_list([])
  489. end
  490. def test_sis
  491. response = get(command_path(:table_create,
  492. :name => "users",
  493. :flags => Table::NO_KEY | Key::SIS))
  494. assert_error_response(Result::UNKNOWN_ERROR,
  495. "SIS key isn't available",
  496. response,
  497. :content_type => "application/json")
  498. assert_table_list([])
  499. end
  500. def test_value_type
  501. table_id = table_create("users",
  502. :flags => Table::NO_KEY,
  503. :value_type => "Int32")
  504. assert_table_list([[table_id,
  505. "users",
  506. "TABLE_NO_KEY|PERSISTENT",
  507. "Int32",
  508. "Int32"]])
  509. end
  510. def test_view_value
  511. users_table_id = table_create("users", :flags => Table::VIEW)
  512. sites_table_id = table_create("sites",
  513. :flags => Table::NO_KEY,
  514. :value_type => "users")
  515. assert_table_list([[sites_table_id,
  516. "sites",
  517. "TABLE_NO_KEY|PERSISTENT",
  518. "null",
  519. "users"],
  520. [users_table_id,
  521. "users",
  522. "TABLE_VIEW|PERSISTENT",
  523. "null",
  524. "null"]])
  525. end
  526. def test_nonexistent_value_type
  527. response = get(command_path(:table_create,
  528. :name => "users",
  529. :flags => Table::NO_KEY,
  530. :value_type => "nonexistent"))
  531. assert_error_response(Result::INVALID_ARGUMENT,
  532. "value type doesn't exist: <nonexistent>",
  533. response,
  534. :content_type => "application/json")
  535. assert_table_list([])
  536. end
  537. end
  538. class ViewCreateTest < Test::Unit::TestCase
  539. include Utils
  540. def test_simple
  541. table_id = table_create("users", :flags => Table::VIEW)
  542. assert_table_list([[table_id,
  543. "users",
  544. "TABLE_VIEW|PERSISTENT",
  545. "null",
  546. "null"]])
  547. end
  548. def test_normalize_key
  549. response = get(command_path(:table_create,
  550. :name => "users",
  551. :flags => Table::VIEW | Key::NORMALIZE))
  552. assert_error_response(Result::UNKNOWN_ERROR,
  553. "key normalization isn't available",
  554. response,
  555. :content_type => "application/json")
  556. assert_table_list([])
  557. end
  558. def test_key_type
  559. response = get(command_path(:table_create,
  560. :name => "users",
  561. :flags => Table::VIEW,
  562. :key_type => "ShortText"))
  563. assert_error_response(Result::UNKNOWN_ERROR,
  564. "key isn't supported",
  565. response,
  566. :content_type => "application/json")
  567. assert_table_list([])
  568. end
  569. def test_sis
  570. response = get(command_path(:table_create,
  571. :name => "users",
  572. :flags => Table::VIEW | Key::SIS))
  573. assert_error_response(Result::UNKNOWN_ERROR,
  574. "SIS key isn't available",
  575. response,
  576. :content_type => "application/json")
  577. assert_table_list([])
  578. end
  579. def test_value_type
  580. response = get(command_path(:table_create,
  581. :name => "users",
  582. :flags => Table::VIEW,
  583. :value_type => "Int32"))
  584. assert_error_response(Result::UNKNOWN_ERROR,
  585. "value isn't available",
  586. response,
  587. :content_type => "application/json")
  588. assert_table_list([])
  589. end
  590. end
  591. class SymbolFlagsTest < Test::Unit::TestCase
  592. include Utils
  593. def test_table_create_single_symbol
  594. table_id = table_create("books", :flags => "KEY_NORMALIZE")
  595. assert_table_list([[table_id,
  596. "books",
  597. "TABLE_HASH_KEY|KEY_NORMALIZE|PERSISTENT",
  598. "null",
  599. "null"]])
  600. end
  601. def test_table_table_create_view
  602. table_id = table_create("books", :flags => "TABLE_VIEW")
  603. assert_table_list([[table_id,
  604. "books",
  605. "TABLE_VIEW|PERSISTENT",
  606. "null",
  607. "null"]])
  608. end
  609. def test_table_create_combined_symbols
  610. table_id = table_create("books",
  611. :flags => "TABLE_NO_KEY|KEY_NORMALIZE")
  612. assert_table_list([[table_id,
  613. "books",
  614. "TABLE_NO_KEY|KEY_NORMALIZE|PERSISTENT",
  615. "null",
  616. "null"]])
  617. end
  618. def test_table_create_combined_symbols_with_whitespaces
  619. table_id = table_create("books",
  620. :flags => " TABLE_NO_KEY | KEY_NORMALIZE ")
  621. assert_table_list([[table_id,
  622. "books",
  623. "TABLE_NO_KEY|KEY_NORMALIZE|PERSISTENT",
  624. "null",
  625. "null"]])
  626. end
  627. def test_table_create_invalid_symbol
  628. response = get(command_path(:table_create,
  629. :name => "books",
  630. :flags => "INVALID_SYMBOL"))
  631. assert_error_response(Result::INVALID_ARGUMENT,
  632. "invalid flags option: INVALID_SYMBOL",
  633. response,
  634. :content_type => "application/json")
  635. assert_table_list([])
  636. end
  637. def test_column_create_single_symbol
  638. create_books_table
  639. books_name_column_id = column_create("books",
  640. "name",
  641. "COLUMN_VECTOR",
  642. "ShortText")
  643. assert_column_list([[books_name_column_id,
  644. "name",
  645. "var",
  646. "COLUMN_VECTOR|PERSISTENT",
  647. "books",
  648. "ShortText",
  649. []]],
  650. :table => "books")
  651. end
  652. def test_column_create_combined_symbols
  653. create_books_table
  654. books_name_column_id = column_create("books",
  655. "name",
  656. "COLUMN_INDEX|WITH_WEIGHT",
  657. "ShortText")
  658. assert_column_list([[books_name_column_id,
  659. "name",
  660. "index",
  661. "COLUMN_INDEX|WITH_WEIGHT|PERSISTENT",
  662. "books",
  663. "ShortText",
  664. []]],
  665. :table => "books")
  666. end
  667. def test_column_create_combined_symbols_with_whitespaces
  668. create_books_table
  669. books_name_column_id = column_create("books",
  670. "name",
  671. " COLUMN_INDEX | WITH_WEIGHT ",
  672. "ShortText")
  673. assert_column_list([[books_name_column_id,
  674. "name",
  675. "index",
  676. "COLUMN_INDEX|WITH_WEIGHT|PERSISTENT",
  677. "books",
  678. "ShortText",
  679. []]],
  680. :table => "books")
  681. end
  682. def test_column_create_invalid_symbol
  683. create_books_table
  684. response = get(command_path(:column_create,
  685. :table => "books",
  686. :name => "name",
  687. :flags => "INVALID_SYMBOL",
  688. :type => "ShortText"))
  689. assert_error_response(Result::INVALID_ARGUMENT,
  690. "invalid flags option: INVALID_SYMBOL",
  691. response,
  692. :content_type => "application/json")
  693. assert_column_list([], :table => "books")
  694. end
  695. private
  696. def create_books_table
  697. @books_table_id = table_create("books")
  698. assert_table_list([[@books_table_id,
  699. "books",
  700. "TABLE_HASH_KEY|PERSISTENT",
  701. "null",
  702. "null"]])
  703. end
  704. end
  705. end