forked from phcode-dev/staging.phcode.dev
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathsql-hint.js
More file actions
1 lines (1 loc) · 6.38 KB
/
Copy pathsql-hint.js
File metadata and controls
1 lines (1 loc) · 6.38 KB
1
!function(mod){"object"==typeof exports&&"object"==typeof module?mod(require("../../lib/codemirror"),require("../../mode/sql/sql")):"function"==typeof define&&define.amd?define(["../../lib/codemirror","../../mode/sql/sql"],mod):mod(CodeMirror)}(function(CodeMirror){"use strict";var tables,defaultTable,keywords,identifierQuote,CONS={QUERY_DIV:";",ALIAS_KEYWORD:"AS"},Pos=CodeMirror.Pos,cmpPos=CodeMirror.cmpPos;function isArray(val){return"[object Array]"==Object.prototype.toString.call(val)}function getModeConf(editor,field){return editor.getModeAt(editor.getCursor()).config[field]||CodeMirror.resolveMode("text/x-sql")[field]}function getKeywords(editor){return getModeConf(editor,"keywords")||[]}function getIdentifierQuote(editor){return getModeConf(editor,"identifierQuote")||"`"}function getText(item){return"string"==typeof item?item:item.text}function wrapTable(name,value){return isArray(value)&&(value={columns:value}),value.text||(value.text=name),value}function parseTables(input){var result={};if(isArray(input))for(var i=input.length-1;i>=0;i--){var item=input[i];result[getText(item).toUpperCase()]=wrapTable(getText(item),item)}else if(input)for(var name in input)result[name.toUpperCase()]=wrapTable(name,input[name]);return result}function getTable(name){return tables[name.toUpperCase()]}function shallowClone(object){var result={};for(var key in object)object.hasOwnProperty(key)&&(result[key]=object[key]);return result}function match(string,word){var len=string.length,sub=getText(word).substr(0,len);return string.toUpperCase()===sub.toUpperCase()}function addMatches(result,search,wordlist,formatter){if(isArray(wordlist))for(var i=0;i<wordlist.length;i++)match(search,wordlist[i])&&result.push(formatter(wordlist[i]));else for(var word in wordlist)if(wordlist.hasOwnProperty(word)){var val=wordlist[word];match(search,val=val&&!0!==val?val.displayText?{text:val.text,displayText:val.displayText}:val.text:word)&&result.push(formatter(val))}}function cleanName(name){"."==name.charAt(0)&&(name=name.substr(1));for(var nameParts=name.split(identifierQuote+identifierQuote),i=0;i<nameParts.length;i++)nameParts[i]=nameParts[i].replace(new RegExp(identifierQuote,"g"),"");return nameParts.join(identifierQuote)}function insertIdentifierQuotes(name){for(var nameParts=getText(name).split("."),i=0;i<nameParts.length;i++)nameParts[i]=identifierQuote+nameParts[i].replace(new RegExp(identifierQuote,"g"),identifierQuote+identifierQuote)+identifierQuote;var escaped=nameParts.join(".");return"string"==typeof name?escaped:((name=shallowClone(name)).text=escaped,name)}function nameCompletion(cur,token,result,editor){for(var useIdentifierQuotes=!1,nameParts=[],start=token.start,cont=!0;cont;)cont="."==token.string.charAt(0),useIdentifierQuotes=useIdentifierQuotes||token.string.charAt(0)==identifierQuote,start=token.start,nameParts.unshift(cleanName(token.string)),"."==(token=editor.getTokenAt(Pos(cur.line,token.start))).string&&(cont=!0,token=editor.getTokenAt(Pos(cur.line,token.start)));var string=nameParts.join(".");addMatches(result,string,tables,function(w){return useIdentifierQuotes?insertIdentifierQuotes(w):w}),addMatches(result,string,defaultTable,function(w){return useIdentifierQuotes?insertIdentifierQuotes(w):w}),string=nameParts.pop();var table=nameParts.join("."),alias=!1,aliasTable=table;if(!getTable(table)){var oldTable=table;(table=findTableByAlias(table,editor))!==oldTable&&(alias=!0)}var columns=getTable(table);return columns&&columns.columns&&(columns=columns.columns),columns&&addMatches(result,string,columns,function(w){var tableInsert=table;return 1==alias&&(tableInsert=aliasTable),"string"==typeof w?w=tableInsert+"."+w:(w=shallowClone(w)).text=tableInsert+"."+w.text,useIdentifierQuotes?insertIdentifierQuotes(w):w}),start}function eachWord(lineText,f){for(var words=lineText.split(/\s+/),i=0;i<words.length;i++)words[i]&&f(words[i].replace(/[`,;]/g,""))}function findTableByAlias(alias,editor){for(var doc=editor.doc,fullQuery=doc.getValue(),aliasUpperCase=alias.toUpperCase(),previousWord="",table="",separator=[],validRange={start:Pos(0,0),end:Pos(editor.lastLine(),editor.getLineHandle(editor.lastLine()).length)},indexOfSeparator=fullQuery.indexOf(CONS.QUERY_DIV);-1!=indexOfSeparator;)separator.push(doc.posFromIndex(indexOfSeparator)),indexOfSeparator=fullQuery.indexOf(CONS.QUERY_DIV,indexOfSeparator+1);separator.unshift(Pos(0,0)),separator.push(Pos(editor.lastLine(),editor.getLineHandle(editor.lastLine()).text.length));for(var prevItem=null,current=editor.getCursor(),i=0;i<separator.length;i++){if((null==prevItem||cmpPos(current,prevItem)>0)&&cmpPos(current,separator[i])<=0){validRange={start:prevItem,end:separator[i]};break}prevItem=separator[i]}if(validRange.start)for(var query=doc.getRange(validRange.start,validRange.end,!1),i=0;i<query.length;i++){var lineText;if(eachWord(query[i],function(word){var wordUpperCase=word.toUpperCase();wordUpperCase===aliasUpperCase&&getTable(previousWord)&&(table=previousWord),wordUpperCase!==CONS.ALIAS_KEYWORD&&(previousWord=word)}),table)break}return table}CodeMirror.registerHelper("hint","sql",function(editor,options){tables=parseTables(options&&options.tables);var defaultTableName=options&&options.defaultTable,disableKeywords=options&&options.disableKeywords;defaultTable=defaultTableName&&getTable(defaultTableName),keywords=getKeywords(editor),identifierQuote=getIdentifierQuote(editor),defaultTableName&&!defaultTable&&(defaultTable=findTableByAlias(defaultTableName,editor)),(defaultTable=defaultTable||[]).columns&&(defaultTable=defaultTable.columns);var cur=editor.getCursor(),result=[],token=editor.getTokenAt(cur),start,end,search;if(token.end>cur.ch&&(token.end=cur.ch,token.string=token.string.slice(0,cur.ch-token.start)),token.string.match(/^[.`"'\w@][\w$#]*$/g)?(search=token.string,start=token.start,end=token.end):(start=end=cur.ch,search=""),"."==search.charAt(0)||search.charAt(0)==identifierQuote)start=nameCompletion(cur,token,result,editor);else{var objectOrClass=function(w,className){return"object"==typeof w?w.className=className:w={text:w,className:className},w};addMatches(result,search,defaultTable,function(w){return objectOrClass(w,"CodeMirror-hint-table CodeMirror-hint-default-table")}),addMatches(result,search,tables,function(w){return objectOrClass(w,"CodeMirror-hint-table")}),disableKeywords||addMatches(result,search,keywords,function(w){return objectOrClass(w.toUpperCase(),"CodeMirror-hint-keyword")})}return{list:result,from:Pos(cur.line,start),to:Pos(cur.line,end)}})});