@@ -9,9 +9,11 @@ function makeColumnIDsMap() {
99 const columns = [ ] ;
1010 for ( const colKey in configs [ key ] . columns ) {
1111 columns . push (
12- { name : configs [ key ] . columns [ colKey ] . displayName . toLowerCase ( ) ,
13- id : configs [ key ] . columns [ colKey ] . id ,
14- entityId : configs [ key ] . columns [ colKey ] . entityId }
12+ {
13+ name : configs [ key ] . columns [ colKey ] . displayName . toLowerCase ( ) ,
14+ id : configs [ key ] . columns [ colKey ] . id ,
15+ entityId : configs [ key ] . columns [ colKey ] . entityId
16+ }
1517 ) ;
1618 }
1719 map [ key ] = columns ;
@@ -25,7 +27,7 @@ function getEntityId(subjectEntity, colName) {
2527 if ( ! ( subjectEntity in COLUMN_IDS_MAP ) ) {
2628 throw new Error ( `${ subjectEntity } is not a valid subjectEntity` ) ;
2729 }
28- for ( const m of COLUMN_IDS_MAP [ subjectEntity ] ) {
30+ for ( const m of COLUMN_IDS_MAP [ subjectEntity ] ) {
2931 if ( colName === m . name || colName === m . value ) return m . entityId ;
3032 }
3133 return null ;
@@ -80,7 +82,7 @@ function parseCondition(condition, subjectEntity) {
8082
8183 value = parsePrimitive ( value ) ;
8284 let entityId = getEntityId ( subjectEntity , columnName ) ;
83- if ( typeof value === "string" && entityId !== null && ! value . includes ( `${ entityId } /` ) ) value = `${ entityId } /${ value } ` ;
85+ if ( typeof value === "string" && entityId !== null && entityId !== "works" && ! value . includes ( `${ entityId } /` ) ) value = `${ entityId } /${ value } ` ;
8486
8587 return {
8688 id : generateId ( ) ,
@@ -163,7 +165,7 @@ function parseFilters(oql) {
163165 let worksOperator = "and" ;
164166 let summarizeByOperator = "and" ;
165167
166- const worksMatch = oql . match ( / w h e r e ( .+ ?) ( ; | $ ) / ) ;
168+ const worksMatch = oql . match ( / (?< ! s u m m a r i z e b y . * ) w h e r e ( .+ ?) ( ; | $ ) / ) ;
167169 if ( worksMatch ) {
168170 const worksClause = worksMatch [ 1 ] ;
169171 if ( worksClause . includes ( "(" ) ) {
@@ -172,8 +174,7 @@ function parseFilters(oql) {
172174 condition . subjectEntity = 'works' ;
173175 }
174176 filters . push ( ...nestedConditions ) ;
175- }
176- else if ( worksClause . includes ( " or " ) ) {
177+ } else if ( worksClause . includes ( " or " ) ) {
177178 worksOperator = "or" ;
178179 worksConditions . push ( ...worksClause . split ( " or " ) ) ;
179180 } else {
@@ -329,66 +330,68 @@ function oqlToQuery(oql) {
329330}
330331
331332function queryToOQL ( query ) {
332- if ( ! query . filters || query . filters . length === 0 ) {
333- return "get works" ;
334- }
333+ let oql = "get works" ;
334+
335+ if ( Array . isArray ( query . filters ) && query . filters . length > 0 ) {
336+ const worksFilters = query . filters . filter ( filter => filter . subjectEntity === "works" ) ;
337+ if ( worksFilters . length > 0 ) {
338+ oql += ` where ${ generateFilters ( worksFilters , "works" ) } ` ;
339+ }
340+ }
335341
336- const rootFilter = findRootFilter ( query . filters ) ;
337- let oql = `get ${ rootFilter . subjectEntity } where ` ;
338- oql += generateFilters ( query . filters ) ;
339342
340- if ( query . summarize_by ) {
341- oql += `; summarize by ${ query . summarize_by } ` ;
343+ if ( query . summarize_by ) {
344+ oql += `; summarize by ${ query . summarize_by } ` ;
342345
343- const summaryFilters = query . filters . filter ( filter => filter . subjectEntity === query . summarize_by ) ;
344- if ( summaryFilters . length > 0 ) {
345- oql += ` where ${ generateFilters ( summaryFilters ) } ` ;
346+ const summaryFilters = ( query . filters || [ ] ) . filter ( filter => filter . subjectEntity === query . summarize_by ) ;
347+ if ( summaryFilters . length > 0 ) {
348+ oql += ` where ${ generateFilters ( summaryFilters , query . summarize_by ) } ` ;
349+ }
346350 }
347- }
348351
349- if ( query . sort_by ) {
350- oql += `; sort by ${ query . sort_by . column_id } ${ query . sort_by . direction } ` ;
351- }
352+ if ( query . sort_by ) {
353+ oql += `; sort by ${ query . sort_by . column_id } ${ query . sort_by . direction } ` ;
354+ }
352355
353- if ( query . return_columns && query . return_columns . length > 0 ) {
354- oql += `; return ${ query . return_columns . join ( ', ' ) } ` ;
355- }
356+ if ( query . return_columns && query . return_columns . length > 0 ) {
357+ oql += `; return ${ query . return_columns . join ( ', ' ) } ` ;
358+ }
356359
357- return oql ;
360+ return oql ;
358361}
359362
360- function findRootFilter ( filters ) {
361- const childIds = new Set ( filters . flatMap ( filter => filter . children || [ ] ) ) ;
362- return filters . find ( filter => ! childIds . has ( filter . id ) ) ;
363+ function findRootFilter ( filters , subjEntity ) {
364+ const childIds = new Set ( filters . flatMap ( filter => filter . children || [ ] ) ) ;
365+ return filters . find ( filter => ! childIds . has ( filter . id ) && filter . subjectEntity === subjEntity ) ;
363366}
364367
365- function generateFilters ( filters ) {
366- const rootFilter = findRootFilter ( filters ) ;
367- return generateFilterString ( rootFilter , filters ) ;
368+ function generateFilters ( filters , subjEntity ) {
369+ const rootFilter = findRootFilter ( filters , subjEntity ) ;
370+ return generateFilterString ( rootFilter , filters ) ;
368371}
369372
370373function generateFilterString ( filter , allFilters ) {
371- if ( filter . type === 'leaf' ) {
372- return `${ filter . column_id } ${ filter . operator || 'is' } ${ filter . value } ` ;
373- } else if ( filter . type === 'branch' ) {
374- const childFilters = filter . children . map ( childId => {
375- const childFilter = allFilters . find ( f => f . id === childId ) ;
376- return generateFilterString ( childFilter , allFilters ) ;
377- } ) ;
374+ if ( filter . type === 'leaf' ) {
375+ return `${ filter . column_id } ${ filter . operator || 'is' } ${ filter . value } ` ;
376+ } else if ( filter . type === 'branch' ) {
377+ const childFilters = filter . children . map ( childId => {
378+ const childFilter = allFilters . find ( f => f . id === childId ) ;
379+ return generateFilterString ( childFilter , allFilters ) ;
380+ } ) ;
378381
379- const needsParentheses = filter . children . length > 1 &&
380- allFilters . some ( f => f . type === 'branch' && f . id !== filter . id && f . subjectEntity === filter . subjectEntity ) ;
382+ const needsParentheses = filter . children . length > 1 &&
383+ allFilters . some ( f => f . type === 'branch' && f . id !== filter . id && f . subjectEntity === filter . subjectEntity ) ;
381384
382- const joinedFilters = childFilters . join ( ` ${ filter . operator } ` ) ;
383- return needsParentheses ? `(${ joinedFilters } )` : joinedFilters ;
384- }
385+ const joinedFilters = childFilters . join ( ` ${ filter . operator } ` ) ;
386+ return needsParentheses ? `(${ joinedFilters } )` : joinedFilters ;
387+ }
385388}
386389
387390function formatValue ( value ) {
388- if ( typeof value === 'string' ) {
389- return `"${ value } "` ;
390- }
391- return value ;
391+ if ( typeof value === 'string' ) {
392+ return `"${ value } "` ;
393+ }
394+ return value ;
392395}
393396
394397export {
0 commit comments