11import {
2- ColumnDefinitionBuilder ,
3- type JSONColumnType ,
4- ParseJSONResultsPlugin ,
5- type SqlBool ,
6- sql ,
7- } from '../../../dist/index.js'
8- import {
9- type DialectDescriptor ,
102 DIALECTS ,
11- type JSONTestContext ,
123 NOT_SUPPORTED ,
134 clearJSONDatabase ,
145 destroyJSONTest ,
@@ -58,12 +49,12 @@ for (const dialect of DIALECTS) {
5849 postgres : NOT_SUPPORTED ,
5950 mysql : {
6051 parameters : [ ] ,
61- sql : " select `website`->'$.url' as `website_url` from `person_metadata`" ,
52+ sql : ' select `website`->\ '$." url"\ ' as `website_url` from `person_metadata`' ,
6253 } ,
6354 mssql : NOT_SUPPORTED ,
6455 sqlite : {
6556 parameters : [ ] ,
66- sql : `select "website"->>'$.url' as "website_url" from "person_metadata"` ,
57+ sql : `select "website"->>'$." url" ' as "website_url" from "person_metadata"` ,
6758 } ,
6859 } )
6960
@@ -120,12 +111,12 @@ for (const dialect of DIALECTS) {
120111 postgres : NOT_SUPPORTED ,
121112 mysql : {
122113 parameters : [ ] ,
123- sql : " select `profile`->'$.auth. roles' as `roles` from `person_metadata`" ,
114+ sql : ' select `profile`->\ '$." auth"." roles"\ ' as `roles` from `person_metadata`' ,
124115 } ,
125116 mssql : NOT_SUPPORTED ,
126117 sqlite : {
127118 parameters : [ ] ,
128- sql : `select "profile"->>'$.auth. roles' as "roles" from "person_metadata"` ,
119+ sql : `select "profile"->>'$." auth"." roles" ' as "roles" from "person_metadata"` ,
129120 } ,
130121 } )
131122
@@ -153,12 +144,12 @@ for (const dialect of DIALECTS) {
153144 postgres : NOT_SUPPORTED ,
154145 mysql : {
155146 parameters : [ ] ,
156- sql : " select `profile`->'$.tags[0]' as `main_tag` from `person_metadata`" ,
147+ sql : ' select `profile`->\ '$." tags" [0]\ ' as `main_tag` from `person_metadata`' ,
157148 } ,
158149 mssql : NOT_SUPPORTED ,
159150 sqlite : {
160151 parameters : [ ] ,
161- sql : `select "profile"->>'$.tags[0]' as "main_tag" from "person_metadata"` ,
152+ sql : `select "profile"->>'$." tags" [0]' as "main_tag" from "person_metadata"` ,
162153 } ,
163154 } )
164155
@@ -186,12 +177,12 @@ for (const dialect of DIALECTS) {
186177 postgres : NOT_SUPPORTED ,
187178 mysql : {
188179 parameters : [ ] ,
189- sql : " select `experience`->'$[0].establishment' as `establishment` from `person_metadata`" ,
180+ sql : ' select `experience`->\ '$[0]." establishment"\ ' as `establishment` from `person_metadata`' ,
190181 } ,
191182 mssql : NOT_SUPPORTED ,
192183 sqlite : {
193184 parameters : [ ] ,
194- sql : `select "experience"->>'$[0].establishment' as "establishment" from "person_metadata"` ,
185+ sql : `select "experience"->>'$[0]." establishment" ' as "establishment" from "person_metadata"` ,
195186 } ,
196187 } )
197188
@@ -342,12 +333,12 @@ for (const dialect of DIALECTS) {
342333 postgres : NOT_SUPPORTED ,
343334 mysql : {
344335 parameters : [ 12 ] ,
345- sql : " select * from `person_metadata` where `profile`->'$.auth. login_count' = ?" ,
336+ sql : ' select * from `person_metadata` where `profile`->\ '$." auth"." login_count"\ ' = ?' ,
346337 } ,
347338 mssql : NOT_SUPPORTED ,
348339 sqlite : {
349340 parameters : [ 12 ] ,
350- sql : `select * from "person_metadata" where "profile"->>'$.auth. login_count' = ?` ,
341+ sql : `select * from "person_metadata" where "profile"->>'$." auth"." login_count" ' = ?` ,
351342 } ,
352343 } )
353344
@@ -374,12 +365,12 @@ for (const dialect of DIALECTS) {
374365 postgres : NOT_SUPPORTED ,
375366 mysql : {
376367 parameters : [ ] ,
377- sql : " select * from `person_metadata` order by `profile`->'$.auth. login_count' desc" ,
368+ sql : ' select * from `person_metadata` order by `profile`->\ '$." auth"." login_count"\ ' desc' ,
378369 } ,
379370 mssql : NOT_SUPPORTED ,
380371 sqlite : {
381372 parameters : [ ] ,
382- sql : `select * from "person_metadata" order by "profile"->>'$.auth. login_count' desc` ,
373+ sql : `select * from "person_metadata" order by "profile"->>'$." auth"." login_count" ' desc` ,
383374 } ,
384375 } )
385376
@@ -411,12 +402,12 @@ for (const dialect of DIALECTS) {
411402 postgres : NOT_SUPPORTED ,
412403 mysql : {
413404 parameters : [ 'Papa Johns' , 911 ] ,
414- sql : " update `person_metadata` set `experience` = json_set(`experience`, '$[last].establishment', ?) where `person_id` = ?" ,
405+ sql : ' update `person_metadata` set `experience` = json_set(`experience`, \ '$[last]." establishment"\ ', ?) where `person_id` = ?' ,
415406 } ,
416407 mssql : NOT_SUPPORTED ,
417408 sqlite : {
418409 parameters : [ 'Papa Johns' , 911 ] ,
419- sql : `update "person_metadata" set "experience" = json_set("experience", '$[#-1].establishment', ?) where "person_id" = ?` ,
410+ sql : `update "person_metadata" set "experience" = json_set("experience", '$[#-1]." establishment" ', ?) where "person_id" = ?` ,
420411 } ,
421412 } )
422413
@@ -747,123 +738,3 @@ for (const dialect of DIALECTS) {
747738 } )
748739 }
749740}
750- async function initJSONTest < D extends DialectDescriptor > (
751- ctx : Mocha . Context ,
752- dialect : D ,
753- ) {
754- const testContext = await initTest ( ctx , dialect )
755-
756- let db = testContext . db . withTables < {
757- person_metadata : {
758- person_id : number
759- website : JSONColumnType < { url : string } >
760- nicknames : JSONColumnType < string [ ] >
761- profile : JSONColumnType < {
762- auth : {
763- roles : string [ ]
764- last_login ?: { device : string }
765- is_verified : SqlBool
766- login_count : number
767- }
768- avatar : string | null
769- tags : string [ ]
770- } >
771- experience : JSONColumnType <
772- {
773- establishment : string
774- } [ ]
775- >
776- schedule : JSONColumnType < { name : string ; time : string } [ ] [ ] [ ] >
777- }
778- } > ( )
779-
780- if ( dialect . sqlSpec === 'sqlite' ) {
781- db = db . withPlugin ( new ParseJSONResultsPlugin ( ) )
782- }
783-
784- const jsonColumnDataType = resolveJSONColumnDataType ( dialect )
785- const notNull = ( cb : ColumnDefinitionBuilder ) => cb . notNull ( )
786-
787- await db . schema
788- . createTable ( 'person_metadata' )
789- . addColumn ( 'person_id' , 'integer' , ( cb ) =>
790- cb . primaryKey ( ) . references ( 'person.id' ) ,
791- )
792- . addColumn ( 'website' , jsonColumnDataType , notNull )
793- . addColumn ( 'nicknames' , jsonColumnDataType , notNull )
794- . addColumn ( 'profile' , jsonColumnDataType , notNull )
795- . addColumn ( 'experience' , jsonColumnDataType , notNull )
796- . addColumn ( 'schedule' , jsonColumnDataType , notNull )
797- . execute ( )
798-
799- return { ...testContext , db }
800- }
801-
802- function resolveJSONColumnDataType ( dialect : DialectDescriptor ) {
803- switch ( dialect . sqlSpec ) {
804- case 'postgres' :
805- return 'jsonb'
806- case 'mysql' :
807- return 'json'
808- case 'mssql' :
809- return sql `nvarchar(max)`
810- case 'sqlite' :
811- return 'text'
812- }
813- }
814-
815- async function insertDefaultJSONDataSet ( ctx : TestContext ) {
816- await insertDefaultDataSet ( ctx as any )
817-
818- const people = await ctx . db
819- . selectFrom ( 'person' )
820- . select ( [ 'id' , 'first_name' , 'last_name' ] )
821- . execute ( )
822-
823- await ctx . db
824- . insertInto ( 'person_metadata' )
825- . values (
826- people
827- . filter ( ( person ) => person . first_name && person . last_name )
828- . map ( ( person , index ) => ( {
829- person_id : person . id ,
830- website : JSON . stringify ( {
831- url : `https://www.${ person . first_name ! . toLowerCase ( ) } ${ person . last_name ! . toLowerCase ( ) } .com` ,
832- } ) ,
833- nicknames : JSON . stringify ( [
834- `${ person . first_name ! [ 0 ] } .${ person . last_name ! [ 0 ] } .` ,
835- `${ person . first_name } the Great` ,
836- `${ person . last_name } the Magnificent` ,
837- ] ) ,
838- profile : JSON . stringify ( {
839- tags : [ 'awesome' ] ,
840- auth : {
841- roles : [ 'contributor' , 'moderator' ] ,
842- last_login : {
843- device : 'android' ,
844- } ,
845- login_count : 12 + index ,
846- is_verified : true ,
847- } ,
848- avatar : null ,
849- } ) ,
850- experience : JSON . stringify ( [
851- {
852- establishment : 'The University of Life' ,
853- } ,
854- ] ) ,
855- schedule : JSON . stringify ( [ [ [ { name : 'Gym' , time : '12:15' } ] ] ] ) ,
856- } ) ) ,
857- )
858- . execute ( )
859- }
860-
861- async function clearJSONDatabase ( ctx : TestContext ) {
862- await ctx . db . deleteFrom ( 'person_metadata' ) . execute ( )
863- await clearDatabase ( ctx as any )
864- }
865-
866- async function destroyJSONTest ( ctx : TestContext ) {
867- await ctx . db . schema . dropTable ( 'person_metadata' ) . execute ( )
868- await destroyTest ( ctx as any )
869- }
0 commit comments