@@ -17,7 +17,9 @@ async function createSimpleOrders(db) {
1717 const { source } = SimpleOrderSchema ;
1818 const exists = await db . table ( source ) . existsAsync ( ) ;
1919 if ( ! exists ) {
20- await db . table ( source ) . createAsync ( SimpleOrderSchema . fields ) ;
20+ await db . table ( source ) . createAsync ( SimpleOrderSchema . fields ) ;
21+ } else {
22+ return ;
2123 }
2224 // get some orders
2325 const orders = await db . executeAsync (
@@ -61,7 +63,19 @@ async function createSimpleOrders(db) {
6163 return { id, streetAddress, postalCode, addressLocality, addressCountry, telephone } ;
6264 } ) , [ ]
6365 ) ;
64- // get
66+
67+ const shuffleArray = ( array ) => {
68+ for ( let i = array . length - 1 ; i > 0 ; i -- ) {
69+ const j = Math . floor ( Math . random ( ) * ( i + 1 ) ) ;
70+ [ array [ i ] , array [ j ] ] = [ array [ j ] , array [ i ] ] ;
71+ }
72+ return array ;
73+ } ;
74+
75+ const getRandomItems = ( array , numItems ) => {
76+ const shuffledArray = shuffleArray ( [ ...array ] ) ;
77+ return shuffledArray . slice ( 0 , numItems ) ;
78+ } ;
6579 const items = orders . map ( ( order ) => {
6680 const { orderDate, discount, discountCode, orderNumber, paymentDue,
6781 dateCreated, dateModified, createdBy, modifiedBy } = order ;
@@ -73,6 +87,8 @@ async function createSimpleOrders(db) {
7387 customer . address = postalAddresses . find ( ( x ) => x . id === customer . address ) ;
7488 delete customer . address ?. id ;
7589 }
90+ // get 2 random payment methods
91+ const additionalPaymentMethods = getRandomItems ( paymentMethods , 2 ) ;
7692 return {
7793 orderDate,
7894 discount,
@@ -82,6 +98,7 @@ async function createSimpleOrders(db) {
8298 orderStatus,
8399 orderedItem,
84100 paymentMethod,
101+ additionalPaymentMethods,
85102 customer,
86103 dateCreated,
87104 dateModified,
@@ -601,4 +618,98 @@ describe('SqlFormatter', () => {
601618 }
602619 } ) ;
603620
621+
622+ it ( 'should return json arrays' , async ( ) => {
623+ // set context user
624+ context . user = {
625+ name : 'alexis.rees@example.com'
626+ } ;
627+
628+ const queryPeople = context . model ( 'Person' ) . asQueryable ( ) . select (
629+ 'id' , 'familyName' , 'givenName' , 'jobTitle' , 'email'
630+ ) . flatten ( ) ;
631+ await beforeExecuteAsync ( {
632+ model : queryPeople . model ,
633+ emitter : queryPeople ,
634+ query : queryPeople . query ,
635+ } ) ;
636+ const { viewAdapter : People } = queryPeople . model ;
637+ const queryOrders = context . model ( 'Order' ) . asQueryable ( ) . select (
638+ 'id' , 'orderDate' , 'orderStatus' , 'orderedItem' , 'customer'
639+ ) . flatten ( ) ;
640+ const { viewAdapter : Orders } = queryOrders . model ;
641+ // prepare query for each customer
642+ queryOrders . query . where (
643+ new QueryField ( 'customer' ) . from ( Orders )
644+ ) . equal (
645+ new QueryField ( 'id' ) . from ( People )
646+ ) ;
647+ const selectPeople = queryPeople . query . $select [ People ] ;
648+ // add orders as json array
649+ selectPeople . push ( {
650+ orders : {
651+ $jsonArray : [
652+ queryOrders . query
653+ ]
654+ }
655+ } ) ;
656+ const start = new Date ( ) . getTime ( ) ;
657+ const items = await queryPeople . take ( 50 ) . getItems ( ) ;
658+ const end = new Date ( ) . getTime ( ) ;
659+ TraceUtils . log ( 'Elapsed time: ' + ( end - start ) + 'ms' ) ;
660+ expect ( items . length ) . toBeTruthy ( ) ;
661+ for ( const item of items ) {
662+ expect ( Array . isArray ( item . orders ) ) . toBeTruthy ( ) ;
663+ for ( const order of item . orders ) {
664+ expect ( order . customer ) . toEqual ( item . id ) ;
665+ }
666+
667+ }
668+ } ) ;
669+
670+ it ( 'should parse string as json array' , async ( ) => {
671+ // set context user
672+ context . user = {
673+ name : 'alexis.rees@example.com'
674+ } ;
675+ const { viewAdapter : People } = context . model ( 'Person' ) ;
676+ const query = new QueryExpression ( ) . select (
677+ 'id' , 'familyName' , 'givenName' , 'jobTitle' , 'email' ,
678+ new QueryField ( {
679+ tags : {
680+ $jsonArray : [
681+ new QueryField ( {
682+ $value : '[ "user", "customer", "admin" ]'
683+ } )
684+ ]
685+ }
686+ } )
687+ ) . from ( People ) . where ( 'email' ) . equal ( context . user . name ) ;
688+ const [ item ] = await context . db . executeAsync ( query ) ;
689+ expect ( item ) . toBeTruthy ( ) ;
690+ } ) ;
691+
692+ it ( 'should parse array as json array' , async ( ) => {
693+ // set context user
694+ context . user = {
695+ name : 'alexis.rees@example.com'
696+ } ;
697+ const { viewAdapter : People } = context . model ( 'Person' ) ;
698+ const query = new QueryExpression ( ) . select (
699+ 'id' , 'familyName' , 'givenName' , 'jobTitle' , 'email' ,
700+ new QueryField ( {
701+ tags : {
702+ $jsonArray : [
703+ {
704+ $value : [ 'user' , 'customer' , 'admin' ]
705+ }
706+ ]
707+ }
708+ } )
709+ ) . from ( People ) . where ( 'email' ) . equal ( context . user . name ) ;
710+ const [ item ] = await context . db . executeAsync ( query ) ;
711+ expect ( item ) . toBeTruthy ( ) ;
712+ expect ( Array . isArray ( item . tags ) ) . toBeTruthy ( ) ;
713+ expect ( item . tags ) . toEqual ( [ 'user' , 'customer' , 'admin' ] ) ;
714+ } ) ;
604715} ) ;
0 commit comments