js類定義(翻出的js代碼)
/*類機制定義*/
window.Class = function(name, src) {
src.constructor.prototype = src;
window[name] = src.constructor;
};
/*自定義類*/
Class("ArrayUtils", {
constructor: function() {
},
toArray : function(iterable) {
var length = iterable.length, results = new Array(length);
while (length--) { results[length] = iterable[length] };
return results;
},
camelize : function(s) {
return s.replace(/\-(.)/g, function(m, l){return l.toUpperCase()});
},
inArray : function(arr,item) {
return (this.search(arr,item) != null);
},
search : function(arr,itm) {
for(var i=0; i 100000){
this.items.shift();
}
},
remove : function(item){
var s = [];
//移除item,然後遍歷,把剩下發的賦值給items
for(var i = 0, len = this.items.length; i =,,between and
* SQL:= TB2.REF_CITY_CODE = '1' AND TB3.REF_REGION_CODE IN (select * from aaa)
* 【建議把in的用括號包含】 TB2.REF_CITY_CODE = '1' AND (TB3.REF_REGION_CODE IN (select * from aaa) )
*
* HAVING和WHERE的處理方式是一樣的HAVING SUM(TB1.PAY_MONEY)0
* where中有聚合函數TB2.REF_CITY_CODE = '1' and sum(TB2.REF_CITY_CODE)
*
* 【建議把between and用括號包含,要不然就拆成2個大於小於】
* TB2.REF_CITY_CODE between 21 and 44可以改成2個TB2.REF_CITY_CODE> 21 and TB2.REF_CITY_CODE200-----建議使用別名,不要把聚合函數放到where裏面
*
* select a,b from (select a,b, sum(aa) as c from table1 where c > 100 )
*
*
*
* 目前還不支持一個長括號裏面有評級的,能取出來,但是不能替換
*
*
*
* minCell--minCellCopy[相同的()的已被替換成'@',],然後對minCellCopy[i]進行分詞即可
*
*
*/
Class("WhereParser", {
constructor: function() {
// this.key = key;//可能處理類型,key:[where|having]
this.items = [];
this.myStack = new Stack();//上面有定義
this.inputString = '';//需要解析的字符串
this.logicOperatorKey = ['and','or','in'];//邏輯運算符,報表中where的關鍵字分隔符:and ,or 和 in
this.argoOperatorKey = ['=',''];//算數運算符=,>=,
this.exceptOperatorKey = ['between'];//特殊處理between and
this.dataObject =new Array();//對象數組,準備放對象的 {field , op , value}
this.logicOpArray = [];
this.opArray = [];
this.typeArray = [];
},
getDataObject:function(){
return this.dataObject;
},
getLogicOpArray:function(){
return this.logicOpArray;
},
getOpArray:function(){
return this.opArray;
},
getTypeArray:function(){
return this.typeArray;
},
trim: function( text ) {
var rtrim = /^(\s|\u00A0)+|(\s|\u00A0)+$/g;
return (text || "").replace( rtrim, "" );
},
/*判斷是否存在此關鍵字key,type取值{l是邏輯運算符,a是算數運算符}*/
hasKey : function(type,key){
var arrayUtils = new ArrayUtils();
if(type == 'l'){
return arrayUtils.inArray(this.logicOperatorKey,key);
}
if(type == 'a'){
return arrayUtils.inArray(this.argoOperatorKey,key);
}
},
/*設置要解析的字符串*/
setParseString : function(inputString){
this.inputString = inputString;
//document.write( "輸入字符串:"+this.inputString+"
"); return this;//鏈式操作 }, /* */ process : function(){ var myString = this.inputString; //document.write("匹對過程
"); //最小計算單元內的左括號個數,當棧的總和爲0,此數歸0 var leftCount=0; //傀儡,只爲存放一個char,其實可以不用 var dummy = new Array(); //this.msg(this.inputString.length); var stackString = "";//只存放棧中完整的字符 var stackStartFlag = false; var wordString = ""; var wordChar = ""; for(var i =0;i<mystring.length i count dummy if>0){ //遇到空格,分詞 -------下一個字符不是算數運算符 if(dummy[i-1]==' '&&this.hasKey('a',dummy[i])==false){ //遇空則清 wordString = ""; } wordString = wordString + dummy[i]; if(dummy[i]==' '&&wordString.length>1&&this.myStack.getCount()==0){ var wordString = this.trim(wordString); if(wordString=='AND' || wordString=='OR'){ this.logicOpArray.push(wordString); }else{ //顯示不是and和or的 //alert(wordString); this.dataObject.push(wordString); } } } if(stackStartFlag){ stackString = stackString+dummy[i]; } //當'('的時候入棧,記下位置 if(dummy[i]=='('){ this.myStack.add(i); if(leftCount==0){ //alert("開始啦"); stackString = "("; stackStartFlag = true; } leftCount++; this.count++; } //當')'的時候出棧 if(dummy[i]==')'){ var before = this.myStack.next(); var current = i+1; var str = myString.substring(before,current); leftCount--; if(leftCount==0){ //alert("結束啦"); //this.dataObject.push(stackString); stackStartFlag = false; } if(this.myStack.getCount()==0){ wordString = stackString; //recureProcessing(wordString); } document.write("leftCount:="+leftCount+" result="+str+"<hr>"); var bStr = myString.substring(0,before); var aStr = myString.substring(current,myString.length); var finalStr = bStr + "@" + aStr; //alert(aStr.length); if(leftCount>0){ //myStr=myStr.replace(me+'',' '); if(aStr.length"); // document.write( "<font color="red">this.dataObject:"+this.dataObject.length+"個</font><br>"); // document.write("<br>"+this.inputString+"<br>"+"<br>"); var op =""; for(var i =0;i ")>-1){ op=">"; } if(s.indexOf("-1){ op="-1){ op="="; } if(s.indexOf(">=")>-1){ op=">="; } if(s.indexOf("-1){ op="")>-1){ op=""; } var type = "number" ; if(s.indexOf("'")>-1){ type="string"; } // if(s.indexOf(" OR ")>-1){ // logicOp="and"; // } // this.typeArray.push(type); this.opArray.push(op); //document.write( "第"+i+"個 "+s+" op="+op+" type="+type+" logicOp="+this.logicOpArray[i]+" <br>"); } // document.write("<br>"); // document.write("<br>"); // document.write("<br>"); return this;//鏈式操作 }, msg:function(msg){ alert(msg); } }); //(f=3) and (a=1 and (b=2 or (c=4 and e=5) or (c1=4 and e=5) and ( d=3 ) //var a = new WhereParser(); // a.setParseString(" a>='2' or (a in(20)) and b=3 and ( (c in(1,2,3,4)) and (a in(2,3,4) )) or (a=23) and e=3 "); //a.setParseString(" A>='2' OR C>33 AND B3 AND E</mystring.length>
"); return this;//鏈式操作 }, /* */ process : function(){ var myString = this.inputString; //document.write("匹對過程
"); //最小計算單元內的左括號個數,當棧的總和爲0,此數歸0 var leftCount=0; //傀儡,只爲存放一個char,其實可以不用 var dummy = new Array(); //this.msg(this.inputString.length); var stackString = "";//只存放棧中完整的字符 var stackStartFlag = false; var wordString = ""; var wordChar = ""; for(var i =0;i<mystring.length i count dummy if>0){ //遇到空格,分詞 -------下一個字符不是算數運算符 if(dummy[i-1]==' '&&this.hasKey('a',dummy[i])==false){ //遇空則清 wordString = ""; } wordString = wordString + dummy[i]; if(dummy[i]==' '&&wordString.length>1&&this.myStack.getCount()==0){ var wordString = this.trim(wordString); if(wordString=='AND' || wordString=='OR'){ this.logicOpArray.push(wordString); }else{ //顯示不是and和or的 //alert(wordString); this.dataObject.push(wordString); } } } if(stackStartFlag){ stackString = stackString+dummy[i]; } //當'('的時候入棧,記下位置 if(dummy[i]=='('){ this.myStack.add(i); if(leftCount==0){ //alert("開始啦"); stackString = "("; stackStartFlag = true; } leftCount++; this.count++; } //當')'的時候出棧 if(dummy[i]==')'){ var before = this.myStack.next(); var current = i+1; var str = myString.substring(before,current); leftCount--; if(leftCount==0){ //alert("結束啦"); //this.dataObject.push(stackString); stackStartFlag = false; } if(this.myStack.getCount()==0){ wordString = stackString; //recureProcessing(wordString); } document.write("leftCount:="+leftCount+" result="+str+"<hr>"); var bStr = myString.substring(0,before); var aStr = myString.substring(current,myString.length); var finalStr = bStr + "@" + aStr; //alert(aStr.length); if(leftCount>0){ //myStr=myStr.replace(me+'',' '); if(aStr.length"); // document.write( "<font color="red">this.dataObject:"+this.dataObject.length+"個</font><br>"); // document.write("<br>"+this.inputString+"<br>"+"<br>"); var op =""; for(var i =0;i ")>-1){ op=">"; } if(s.indexOf("-1){ op="-1){ op="="; } if(s.indexOf(">=")>-1){ op=">="; } if(s.indexOf("-1){ op="")>-1){ op=""; } var type = "number" ; if(s.indexOf("'")>-1){ type="string"; } // if(s.indexOf(" OR ")>-1){ // logicOp="and"; // } // this.typeArray.push(type); this.opArray.push(op); //document.write( "第"+i+"個 "+s+" op="+op+" type="+type+" logicOp="+this.logicOpArray[i]+" <br>"); } // document.write("<br>"); // document.write("<br>"); // document.write("<br>"); return this;//鏈式操作 }, msg:function(msg){ alert(msg); } }); //(f=3) and (a=1 and (b=2 or (c=4 and e=5) or (c1=4 and e=5) and ( d=3 ) //var a = new WhereParser(); // a.setParseString(" a>='2' or (a in(20)) and b=3 and ( (c in(1,2,3,4)) and (a in(2,3,4) )) or (a=23) and e=3 "); //a.setParseString(" A>='2' OR C>33 AND B3 AND E</mystring.length>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.