UNPKG

genesis-core

Version:

the core module that cordinates everything inside the genesis server, cannpt be used alone...still work in progress

136 lines (113 loc) 4.35 kB
// Todo // extend the query lang for ranges to include sorting order module.exports = { parse:function(QueryString){ return root(tokenize(QueryString)) } } var queryMeta = {} function root(tokens) { // querytype checks // check if its a single value or a range being asked by the query if(tokens[0].split(":")[0].split("(")[1] === "range"){ // inclide that it contains a range queryMeta.QueryType="Range" queryMeta.rangeStart=tokens[0].split(":")[1].split(")")[0].split("-")[0]; queryMeta.rangeEnd=tokens[0].split(":")[1].split(")")[0].split("-")[1]; }else{ // does not contain a range so include that its a singe query queryMeta.QueryType="Unary" // check if param has been provided in the first place if(tokens[0].split(":")[0].split("(")[1]){ queryMeta.ParamKey = tokens[0].split(":")[0].split("(")[1]; queryMeta.ParamValue = tokens[0].split(":")[1].split(")")[0]; } } // ObjectType checks var OriginalObjectType = tokens[0].split(":")[0].split("(")[0]; // check if mutation styntax has been used if(OriginalObjectType.split("[")[1]){ queryMeta.QueryType="Mutation" queryMeta.QueryTarget = OriginalObjectType.split("[")[0].split("]")[0] queryMeta.MutationType = tokens[0].split(":")[0].split("(")[0].split("[")[1].split("]")[0] }else{ //mutation syntax was not used hence its a normal query queryMeta.QueryTarget = OriginalObjectType; } queryMeta.QueryFields = fields(tokens, {index:2}) // console.log("Parsing--Complete") return queryMeta; } function fields(tokens, state) { var ObjectType = tokens[0].split(":")[0].split("(")[0]; // check if mutation styntax has been used if(ObjectType.split("[")[1]){ var queryType="mutation" }else{ var queryType="normal" } var res = [] //look for relation //look for other route thats not a while loop while (tokens[state.index] !== '}') { if (tokens[state.index + 1] === '{') { res.push(relation(tokens, state)) } else { // dig out the params per feild if present var paramsArray =[]; if(tokens[state.index].split("(")[1]){ //extract them var params = tokens[state.index].split("(")[1].split(",") params.map(function(param){ var paramFull = param.split(")")[0] ParamKey = paramFull.split(":")[0] ParamValue = paramFull.split(":")[1] var paramsSet = { key:ParamKey, value:ParamValue } paramsArray.push(paramsSet) // console.log(paramName + " -> " + ParamValue) }) //store them res.push({ type: 'field', value: tokens[state.index].split("(")[0], params:paramsArray }) }else{ if(queryType === "normal"){ res.push({ type: 'field', value: tokens[state.index].split("(")[0], }) }else{ var statement = tokens[state.index].split("(")[0]; var key = statement.split(":")[0]; var value = statement.split(":")[1]; res.push({ type: 'field', key: key, value: value }) } } state.index++ } } state.index++ return res } function relation(tokens, state) { return { type:'relation', name: tokens[(state.index++)], fields: (state.index++ && fields(tokens, state)) } } var re = /\{|\}|[^{}\s]+/g function tokenize(query) { var res = [], match while (match = re.exec(query)) res.push(match[0]) return res }