Greasy Fork

Greasy Fork is available in English.

魔数Plus

给魔数添加一些便捷操作

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

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

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 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;
}