「SqlParser」の編集履歴(バックアップ)一覧はこちら

SqlParser」(2008/04/14 (月) 07:12:06) の最新版変更点

追加された行は緑色になります。

削除された行は赤色になります。

var ll = new Array(); var Sql = ReadFile('','XXX'); var ro = new RegExpOperator(); ro.AddKey( {Name:'Select' , RegExp:/Select/i} ); ro.AddKey( {Name:'From' , RegExp:/From/i} ); ro.AddKey( {Name:'Left Outer Join', RegExp:/Left +Outer +Join/i} ); ro.AddKey( {Name:'Inner Join' , RegExp:/Inner +Join/i} ); ro.AddKey( {Name:'On' , RegExp:/On/i} ); ro.AddKey( {Name:'Where' , RegExp:/Where/i} ); ro.AddKey( {Name:'Order By' , RegExp:/Order +By/i} ); ro.AddKey( {Name:'Group By' , RegExp:/Group +By/i} ); ro.AddKey( {Name:'Bracket.From' , RegExp:/\(/i} ); ro.AddKey( {Name:'Bracket.To' , RegExp:/\)/i} ); //JsAlert( Sql.match(/Group +BYp|From/i) ); //JsAlert( Serialize( ro.Search(Sql) ) ); //JsQuit(); var sn = new SqlNode( null ); sn.Read( Sql ); //WriteFile( ll.join('\r\n') ); WriteFile( DumpSqlNode( sn ) ); //WriteFile(ja.Sto.Tree.GetXmlRep()); function DumpSqlNode( Sn, indent ){ var indent = IsGiven(indent) ? indent+' ' : ''; var yy = new Array(); var ee = Sn.Elements; for( var i=0; i<ee.length; i++ ){ yy.push( toStringElement( ee[i], indent ) ); } if( Sn.Type=='Bracket' ){ yy.unshift(indent + '('); yy.push (indent + ')'); } else if( Sn.Type=='Select' ){ var yy = new Array( indent + yy.join(', ').Rmv(indent) ); yy.unshift( indent + Sn.Type ); return yy.join('\r\n'); } else if( Sn.Type!=null ){ yy.unshift( indent + Sn.Type ); } if( !Sn.HasSqlNode() ){ return indent+yy.join(' ').Rmv(indent); } return yy.join('\r\n'); function toStringElement(e, indent){ if( e instanceof SqlNode ){ return DumpSqlNode( e, indent ); }else{ return indent + TrimLeft(e) ; } } } function SqlNode(Type_, Parent_){ //Select, From, Where, OrderBy, GroupBy, Bracket this.Type = Type_; this.Parent = null; this.Elements = []; function Read( Sql ){ Sql = Sql.replace(/ +/g, ' '); var r = ro.Search(Sql); var rn = r.Name; if( rn!=null ){ // --------sqlPrev--------r.From xxx r.To--------sqlNext-------- var t = this.Type; var sn = new SqlNode( rn.split('.')[0] ); var sqlPrev = Sql.substring( 0, r.From ); var sqlNext = Sql.substring( r.To ); this.AddElement( sqlPrev ); if( rn=='Bracket.From' ){ this.AddElement( sn ); } else if( rn=='Bracket.To' ){ sn = this.GetUpperContext(); } else{ if( t!=null && t!='Bracket' ){ this.Parent.AddElement( sn ); }else{ this.AddElement( sn ); } } sn.Read( sqlNext ); }else{ this.AddElement( Sql ); } } function AddElement( e ){ if( e!='' && (e+'').Rmv(' ')!='' ){ if( e instanceof SqlNode ){ e.Parent = this; } this.Elements.push( e ); //ll.push( this.GetPath() +': '+ e.Type ); } } function GetPath(){ if( this.Parent!=null ){ return this.Parent.GetPath() +'.'+ this.Type; } return this.Type; } function GetUpperContext(){ var p = this.Parent; return (this.Type=='Bracket') ? p : p.GetUpperContext(); } function HasSqlNode(){ for( var i=0; i<this.Elements.length; i++ ){ if( this.Elements[i] instanceof SqlNode ){ return true; } } return false; } SqlNode.prototype.GetUpperContext = GetUpperContext; SqlNode.prototype.GetPath = GetPath; SqlNode.prototype.Read = Read; SqlNode.prototype.AddElement = AddElement; SqlNode.prototype.HasSqlNode = HasSqlNode; } function TrimLeft(xxx){ if( xxx.charAt(0)==' ' ){ return TrimLeft(xxx.substring(1)); } return xxx; } function RegExpOperator(){ this.RegExps = [];//{Name,RegExp} function AddKey( key ){ this.RegExps.push(key); } function Search(text){ var rn = null;//Name var rpFrom = -1;//Position var rpTo = -1;//Position for( var i=0; i<this.RegExps.length; i++ ){ var r = this.RegExps[i] var p = text.search( r.RegExp ); if( 0<=p ){ if( rpFrom==-1 || p<rpFrom ){ rn = r.Name; rpFrom = RegExp.index; rpTo = RegExp.lastIndex; } } } return { Name:rn, From:rpFrom, To:rpTo }; } RegExpOperator.prototype.AddKey = AddKey; RegExpOperator.prototype.Search = Search; }
var sn = new SqlNode(); sn.Read( Sql ); //WriteFile( ll.join('\r\n') ); WriteFile( DumpSqlNode( sn ) ); function DumpSqlNode( Sn, indent ){ var indent = IsGiven(indent) ? indent+' ' : ''; if( Sn.Type=='Bracket' ){ return DumpBracket( Sn, indent ); } else{ return DumpElement( Sn, indent ); } function toStringElement(e, indent){ if( e instanceof SqlNode ){ return DumpSqlNode( e, indent ); }else{ return indent + TrimLeft(e) ; } } function DumpElement( Sn, indent ){ var yy = []; var ee = Sn.Elements; if( Sn.Type!=null ){ yy.push( indent + Sn.Type ); } if( !Sn.HasSqlNode() ){ var zz = []; for( var i=0; i<ee.length; i++ ){ zz.push( toStringElement( ee[i], '' ) ); } yy.push( zz.join(' ') ); }else{ for( var i=0; i<ee.length; i++ ){ yy.push( toStringElement( ee[i], indent ) ); } } return yy.join( !Sn.HasSqlNode() ? ' ' : '\r\n' ); } function DumpBracket( Sn, indent ){ var yy = []; var ee = Sn.Elements; if( !Sn.HasSqlNode() ){ yy.push( '(' ); yy.push( ee.join(' ') ); yy.push( ')' ); }else{ yy.push(indent + '('); for( var i=0; i<ee.length; i++ ){ yy.push( toStringElement( ee[i], indent ) ); } yy.push(indent + ')'); } return yy.join( !Sn.HasSqlNode() ? ' ' : '\r\n' ); } } function SqlNode(Type_, Parent_){ //Select, From, Where, OrderBy, GroupBy, Bracket this.Type = Type_; this.Parent = null; this.Elements = []; var ro; if(ro==null){ ro = new RegExpOperator(); ro.AddKey( {Name:'Select' , RegExp:/Select /i} ); ro.AddKey( {Name:'From' , RegExp:/ From /i} ); ro.AddKey( {Name:'Left Outer Join', RegExp:/Left +Outer +Join/i} ); ro.AddKey( {Name:'Inner Join' , RegExp:/Inner +Join/i} ); ro.AddKey( {Name:'On' , RegExp:/ On /i} ); ro.AddKey( {Name:'Where' , RegExp:/ Where /i} ); ro.AddKey( {Name:'Order By' , RegExp:/Order +By/i} ); ro.AddKey( {Name:'Group By' , RegExp:/Group +By/i} ); ro.AddKey( {Name:'Bracket.From' , RegExp:/\(/i} ); ro.AddKey( {Name:'Bracket.To' , RegExp:/\)/i} ); } function Read( Sql ){ Sql = Sql.replace(/ +/g, ' '); var r = ro.Search(Sql); var rn = r.Name; if( rn!=null ){ // --------sqlPrev--------r.From xxx r.To--------sqlNext-------- var t = this.Type; var sn = new SqlNode( rn.split('.')[0] ); var sqlPrev = Sql.substring( 0, r.From ); var sqlNext = Sql.substring( r.To ); this.AddElement( sqlPrev ); if( rn=='Bracket.From' ){ this.AddElement( sn ); } else if( rn=='Bracket.To' ){ sn = this.GetUpperContext(); } else{ if( t!=null && t!='Bracket' ){ this.Parent.AddElement( sn ); }else{ this.AddElement( sn ); } } sn.Read( sqlNext ); }else{ this.AddElement( Sql ); } } function AddElement( e ){ if( e!='' && (e+'').Rmv(' ')!='' ){ if( e instanceof SqlNode ){ e.Parent = this; } this.Elements.push( e ); //ll.push( this.GetPath() +': '+ e.Type ); } } function GetPath(){ if( this.Parent!=null ){ return this.Parent.GetPath() +'.'+ this.Type; } return this.Type; } function GetUpperContext(){ var p = this.Parent; return (this.Type=='Bracket') ? p : p.GetUpperContext(); } function HasSqlNode(){ var b = false; for( var i=0; i<this.Elements.length; i++ ){ var e = this.Elements[i]; if( e instanceof SqlNode ){ b = b || ( e.Type=='Bracket' ? e.HasSqlNode() : true ); } } //ll.push( this.GetPath() +': '+ b ); return b; } SqlNode.prototype.GetUpperContext = GetUpperContext; SqlNode.prototype.GetPath = GetPath; SqlNode.prototype.Read = Read; SqlNode.prototype.AddElement = AddElement; SqlNode.prototype.HasSqlNode = HasSqlNode; } function TrimLeft(xxx){ if( xxx.charAt(0)==' ' ){ return TrimLeft(xxx.substring(1)); } return xxx; } function RegExpOperator(){ this.RegExps = [];//{Name,RegExp} function AddKey( key ){ this.RegExps.push(key); } function Search(text){ var rn = null;//Name var rpFrom = -1;//Position var rpTo = -1;//Position for( var i=0; i<this.RegExps.length; i++ ){ var r = this.RegExps[i] var p = text.search( r.RegExp ); if( 0<=p ){ if( rpFrom==-1 || p<rpFrom ){ rn = r.Name; rpFrom = RegExp.index; rpTo = RegExp.lastIndex; } } } return { Name:rn, From:rpFrom, To:rpTo }; } RegExpOperator.prototype.AddKey = AddKey; RegExpOperator.prototype.Search = Search; }

表示オプション

横に並べて表示:
変化行の前後のみ表示:
記事メニュー
目安箱バナー