魔数Plus

给魔数添加一些便捷操作

目前為 2023-06-01 提交的版本,檢視 最新版本

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name         魔数Plus
// @namespace    http://tampermonkey.net/
// @version      0.12.70
// @description  给魔数添加一些便捷操作
// @author       duantianci
// @match        https://bi.sankuai.com/sql/edit*
// @match        https://data.sankuai.com/wanxiang#/xt/edit/*
// @icon         https://www.google.com/s2/favicons?domain=sankuai.com
// @license      MIT
// @run-at       document-end
// @grant        unsafeWindow
// @grant        GM_setValue
// @grant        GM_getValue
// @grant        GM_addStyle
// ==/UserScript==

(function() {
     // Your code here...

     var curUrl = window.location.href; 
     // 魔数
     if(curUrl.includes("bi")){
         var selectAllBtn = createSelectAllBtn(); // select *
        var SelectAggrBtn = createSelectAggrBtn(); // 单表聚合
        var SelectAggrDiffBtn = createSelectAggrDiffBtn(); // 双表聚合diff
        var AllDiffBtn = createAllDiffBtn(); // 无diff测试
        var toXtEditBtn = createRunInXtEdit();
        var btnList = [toXtEditBtn,selectAllBtn,SelectAggrBtn,SelectAggrDiffBtn,AllDiffBtn];

        // XT
        setTimeout( function(){
    
        var matchingElement=document.querySelector("#app > div > div.sidebar-container > div > div.ms-sidebar-main > div > div.router-view > div > div > div.mtd-tabs-content > div > div > div.control-buttons > div > span > button")
        var beforeEle = matchingElement
        for (var i in btnList){
            var curBtn=btnList[i]
            if(i==0){
                curBtn.style.cssText = 'display: inline-block;color:#fff;background:#0a70f5;white-space:nowrap;cursor:pointer;outline:0;text-align:center;font-weight:400;user-select:none;position:relative;transition:all.3s;border-radius:4px;min-width:32px;height:32px;font-size:14px;border-style:none;margin-right:10px;';
            }else{
                curBtn.style.cssText='color: #0a70f5;border-color: transparent!important;background-color: #0000;font-size: 14px;font-weight: 400;cursor: pointer;';
            }
            beforeEle.parentElement.insertBefore(curBtn,beforeEle);
            beforeEle=curBtn;
        }


        },3000);

     }else{
         //探数
         var sqlValue = GM_getValue("sqlText")
         GM_setValue("sqlText",undefined)
         if(sqlValue ==undefined){
             return
         }else{
            setTimeout( function(){
            AddIcon=getAddIcon()
            AddIcon.click()
                setTimeout(  function(){
                    var cm = getCm(-1)
                    cm.setValue(sqlValue)

                },3000)
         
                

        },2000)

         }
     }


})();


// Date.prototype.format = function (fmt) {
//     var o = {
//         "M+": this.getMonth() + 1, //月份
//         "d+": this.getDate(), //日
//         "h+": this.getHours(), //小时
//         "m+": this.getMinutes(), //分
//         "s+": this.getSeconds(), //秒
//         "q+": Math.floor((this.getMonth() + 3) / 3), //季度
//         "S": this.getMilliseconds() //毫秒
//     };
//     if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
//     for(var k in o)
//         if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
//     return fmt;
// }


var getDate=function(delta){
 var currentDate = new Date();
 currentDate.setDate(currentDate.getDate() - delta);
 var yearStr = currentDate.getFullYear(); // 年份
var monthStr = (currentDate.getMonth() + 1).toString().padStart(2, '0'); // 月份,toString 和 padStart 可以保证一位数月份前面加 0
var dayStr = currentDate.getDate().toString().padStart(2, '0'); // 日,同样保证前面加 0

//  var sDate = day.format("yyyyMMdd");
 return yearStr+monthStr+dayStr;
}

var getFormatBtn = function(){
    return document.getElementsByClassName("sql-icon-format")[0];
}



var getCm = function(tag=0){
    var cmList = document.getElementsByClassName("CodeMirror cm-s-ms-light CodeMirror-wrap")
    if(tag==0){
        return cmList[0].CodeMirror;
    }else{
        return cmList[cmList.length-1].CodeMirror;
    }
    
}

var getDiffTableName = function(oriTableName){
    return oriTableName.split(".")[0]+"_test." + oriTableName.split(".")[1]
}

var getTableName = function(){
   return document.getElementsByClassName("table-line show-column")[0].childNodes[1].childNodes[0].title;
}

var getTablePartitionType = function(){
    var first_text = document.getElementsByClassName("column-list")[0].rows[1].cells[0].textContent;
    var is_partiiton = first_text.includes('P');
    if(is_partiiton ){
        return 1;
    }else{
        return 0;
    }
}

var getColsName = function(){
   var tableCols=[];
   var table = document.getElementsByClassName("column-list")[0];
   var rows = table.rows;//获取所有行
   console.log("lenth",rows.length) //
   for(var i=1; i < rows.length; i++){
       var row = rows[i];//获取每一行
       var colName = row.cells[0].title;//获取具体单元格
       tableCols.push(colName);
   }
   return tableCols;
}


var getColInfo = function(cols){
    var sumEndPatterns=['num', 'cnt', 'amt','fee','1d','7d','15d']
    var disEndPatterns=['uv','user','poi_num']
    var sumCols=cols.filter(name => (
    sumEndPatterns.some(pattern => name.endsWith(pattern)) && !disEndPatterns.some(pattern => name.endsWith(pattern))
)).map(function(col){
    return 'sum('+ col +') as '+col
    }).join(',');

   var disCols=cols.filter(name => (
  disEndPatterns.some(pattern => name.endsWith(pattern))
)).map(function(col){
    return  'count(distinct '+ col +') as '+col
    }).join(',');
   return {'sum':sumCols,'dis':disCols};
}

var buautify = function(){
    var matchingElement=document.querySelector("#app > div > div.sidebar-container > div > div.ms-sidebar-main > div > div.router-view > div > div > div.mtd-tabs-content > div > div > div.sql-item-main > div.editor-controls > div.editor-control-button-groups > div.format-control.control-item > button")
    matchingElement.click()
}

var getAddIcon = function(){
    return document.getElementsByClassName("mtdicon mtdicon-add")[0];
}



// select *
function createSelectAllBtn(){
     let selectAllBtn=document.createElement("button");
     selectAllBtn.innerText="select *";
     selectAllBtn.className="biPlus"
     selectAllBtn.onclick=function(){
         var is_par = getTablePartitionType();
         var yesterday='and dt='+getDate(1);
         if(is_par == 0){
            yesterday ='';
         }
         var cm = getCm();
         var tableName =getTableName();
         var tableCols = getColsName();
         var joinCols = tableCols.join(",")
         var finalSql="select " +tableCols.join(",") +" from "+tableName +" where (1=1)   "+yesterday +" limit 100";
         cm.setValue(finalSql);
         buautify();
     }
     return selectAllBtn;
}

// 单表聚合
function createSelectAggrBtn(){
     let selectAllBtn=document.createElement("button");
     selectAllBtn.innerText="单表聚合";
     selectAllBtn.className="biPlus"
     selectAllBtn.onclick=function(){
         var is_par = getTablePartitionType();
         var dtstr = ',dt'
         var yesterday='and dt='+getDate(1);
         if(is_par == 0){
            yesterday ='';
            dtstr='';
         }
         var cm = getCm();
         var tableName =getTableName();
         var tableCols = getColsName();
         var colInfo = getColInfo(tableCols);
         var discommaInfo = colInfo.dis=='' ? '' : ',';
         var sumcommaInfo = colInfo.sum=='' ? '' : ',';
         var finalSql="select 1 "+ dtstr +",'online' as type, count(*) count_num "+ sumcommaInfo +colInfo.sum +discommaInfo+colInfo.dis +" from "+tableName +" where (1=1)  "+yesterday+" group by 1"+ dtstr;
         cm.setValue(finalSql);
         buautify();
     }
     return selectAllBtn;
}

//双表聚合diff
function createSelectAggrDiffBtn(){
     let selectAllBtn=document.createElement("button");
     selectAllBtn.innerText="双表聚合diff";
     selectAllBtn.className="biPlus"
     selectAllBtn.onclick=function(){
         var is_par = getTablePartitionType();
         var dtstr = ',dt'
         var yesterday='and dt='+getDate(1);
         if(is_par == 0){
            yesterday ='';
            dtstr='';
         }
         var cm = getCm();
         var tableName =getTableName();
         var diffTabeName = getDiffTableName(tableName);
         var tableCols = getColsName();
         var colInfo = getColInfo(tableCols);
         var discommaInfo = colInfo.dis=='' ? '' : ',';
          var sumcommaInfo = colInfo.sum=='' ? '' : ',';
         var online ="select 1 "+ dtstr +", 'online' as type, count(*) count_num " + sumcommaInfo +colInfo.sum +discommaInfo+colInfo.dis +" from "+tableName +" where (1=1)  "+yesterday +" group by 1"+ dtstr;
         var test   ="select 1 "+ dtstr +", 'test' as type, count(*) count_num  " + sumcommaInfo +colInfo.sum +discommaInfo+colInfo.dis +" from "+diffTabeName +" where (1=1)   "+yesterday +" group by 1"+ dtstr;
         //var finalSql="select 'online' as type, " +colInfo.sum +commaInfo+colInfo.dis +" from "+tableName +" where dt ="+yesterday + " union all    select 'test' as type," +colInfo.sum +commaInfo+colInfo.dis +" from "+diffTabeName +" where dt ="+yesterday;
         var finalSql= online +" union all "+test;
         cm.setValue(finalSql);
         buautify();
     }
     return selectAllBtn;
}

//双表无diff
function createAllDiffBtn(){
     let selectAllBtn=document.createElement("button");
     selectAllBtn.innerText="双表无diff";
     selectAllBtn.className="biPlus"
     selectAllBtn.onclick=function(){
         var is_par = getTablePartitionType();
         var yesterday='and dt='+getDate(1);
         if(is_par == 0){
            yesterday ='';
         }

         var cm = getCm();
         var tableName =getTableName();
         var diffTabeName = getDiffTableName(tableName);
         var tableCols = getColsName();
         var joinCols = tableCols.join(",")
         var finalSql="select "+tableCols.join(",") +", COUNT(*) num FROM (select " +tableCols.join(",") +" from "+tableName +" where (1=1)  "+yesterday+" union all   select " +tableCols.join(",") +" from "+diffTabeName +" where (1=1)  "+yesterday +" )tmp GROUP BY " + tableCols.join(",") + " HAVING COUNT(*) !=2";
         // var beautifulSql=vkbeautify.sql(finalSql);
         cm.setValue(finalSql);
         buautify();
     }
     return selectAllBtn;
}

//去探数执行
function createRunInXtEdit(){
     let toXtEditBtn=document.createElement("button");
     toXtEditBtn.className="biPlus"
     toXtEditBtn.innerText="去探数执行";
     toXtEditBtn.onclick=function(){
         var cm = getCm();
         var curSql = cm.getValue();
         GM_setValue("sqlText",curSql)
         window.open("https://data.sankuai.com/wanxiang#/xt/edit/");
     }

     return toXtEditBtn;
}