codenautas/backend-plus

View on GitHub
lib/tables/table-summary.js

Summary

Maintainability
A
1 hr
Test Coverage
"use strict";

module.exports = function(context){
    var $1_is_num=`$1 ~ '^\\s*(\\d+(\\.\\d*)?|\\.\\d+)\\s*$'`
    return context.be.tableDefAdapt({
        name:'summary',
        schema:'his',
        editable:context.forDump,
        fields:[
            {name:'table_name'            , typeName:'text'       , visible:false},
            {name:'name'                  , typeName:'text'       },
            {name:'data_type'             , typeName:'text'       },
            {name:'ordinal_position'      , typeName:'bigint'     , visible:false },
            // {name:'typeName'              , typeName:'text'       },
            // {name:'nullable'              , typeName:'boolean'    },
            // {name:'label'                 , typeName:'text'       },
            // {name:'title'                 , typeName:'text'       },
            // {name:'description'           , typeName:'text'       },
            {name:'not_nulls'             , typeName:'bigint'     ,summary:{expr:`count($1)`}},
            {name:'nulls'                 , typeName:'bigint'     ,summary:{expr:`sum(case when $1 is null then 1 else 0 end)`}},
            {name:'distincts'             , typeName:'bigint'     ,summary:{expr:`count(distinct $1)`}},
            {name:'uniques'               , typeName:'bigint'     ,summary:{sql:`select count(*) from (select from $2 group by $1 having count(*)=1) x`}},
            {name:'not_uniques'           , typeName:'bigint'     ,summary:{sql:`select count(*) from (select from $2 group by $1 having count(*)>1) x`}},
            {name:'min'                   , typeName:'text'       ,summary:{expr:`min($1)`, excludeTypes:['boolean']}},
            {name:'mean'                  , typeName:'text'       ,summary:{sql:`select $1 from $2 order by $1 offset $not_nulls/2 limit 1`}},
            {name:'max'                   , typeName:'text'       ,summary:{expr:`max($1)`, excludeTypes:['boolean']}},
            {name:'avg'                   , typeName:'decimal'    ,summary:{expr:`avg($1)`, types4:['bigint','integer','decimal']}},
            {name:'modes'                 , typeName:'text'       ,summary:{sql:`select string_agg(value||'→'||rep, ',  ' order by rep desc, value) from (select $1 as value, count(*) as rep from $2 where $1 is not null group by $1 order by count(*) desc,$1 limit 10) x`}},
            {name:'num_avg'               , typeName:'decimal'    ,summary:{expr:`avg(case when ${$1_is_num} then $1::text::decimal else null end)`, types4:['text']}},
            {name:'numbers'               , typeName:'bigint'     ,summary:{expr:`sum(case when ${$1_is_num} then 1 else null end)`, types4:['text']}},
            {name:'longests'              , typeName:'text'       ,summary:{sql:`select string_agg($1, ', ') from (select distinct $1, length($1) from $2 order by length($1) desc, $1 limit 3) x`, types4:['text','decimal']}},
            {name:'shortests'             , typeName:'text'       ,summary:{sql:`select string_agg($1, ', ') from (select distinct $1, length($1) from $2 order by length($1), $1 limit 10) x`, types4:['text','decimal']}},
        ],
        primaryKey:['table_name', 'name'],
        // hiddenColunns:['typeName', 'nullable', 'label', 'title', 'description'],
        sql:{skipEnance:true},
        sortColumns:[{column:'ordinal_position', order:1}]
    }, context);
}