精华内容
参与话题
问答
  • saiku限制日期查询

    千次阅读 2016-10-14 19:49:05
    saiku在公司内部推广开来...日志类型的数据每天大概有几个亿条,对kylin的压力太大(目前kylin集群只有3台),由此只好限制用户查询数据时间的跨度;在大数据量的情况下,估计网友也会有这种情况的,由此笔者把自己的
    saiku在公司内部推广开来之后,得到了产品、运营、策略等同事一致好评,由此带来了一大波需求,就连打点、日志数据的需求都来了,笔者觉得这种数据不适合用来做多维分析,但是迫于公司内部压力,又不得不做,只好硬头皮上了;日志类型的数据每天大概有几个亿条,对kylin的压力太大(目前kylin集群只有3台),由此只好限制用户查询数据时间的跨度;在大数据量的情况下,估计网友也会有这种情况的,由此笔者把自己的思路与实现方式分享出来,或许有其它更好的实现方式,望网友不吝赐教;

    方案选择
    经过分析saiku的代码,结合笔者使用saiku的经验,笔者针对这个问题想到了3个方向:
    1.直接在MDX语句上加入限制条件 ;
    2.在MDX转换后的SQL上加上限制条件;
    3.直接加入日期维度限制;
    经过笔者持续研究,最终选择了方案3,;说下放弃方案1、2的理由:方案1,由于对MDX语法不太熟悉,而将前端的参数传到后台之后,转换出来的MDX语句,比较灵活多变,这时就需要判断多种情况了,此时便有可能不会兼顾所有的case;方案2与方案1有点类似,其实更甚,在SQL上添加限制条件其实就是在where后面加入and 【字段】的条件,经过mondrian之后转换出的sql可能会有多条,而且SQL的结构有可能不同,在where后面加入条件就需要考虑更多的case了(至于详细的分析过程,笔者就不在赘述了);

    解决过程
    方案3的处理思想很简单:用户在页面中选择指标和维度时,如果选用了【日期】维度,就限制该维度的跨度,若没有选用,则加入该维度,并限制查询日期为今日;详细的实现逻辑是:用户点击维度,添加查询维度时,会自动添加到【列】上,当然用户也可以自己拖拽到【行】或者【过滤】上,在这3条件的处理方式是不同的需要分别处理;思路有了就直接上代码,saiku处理和执行查询的逻辑的代码在Query2Resource.java中,执行的接口为:execute(),代码如下:
    @POST
        @Consumes({"application/json" })
        @Path("/execute")
        public QueryResult execute(ThinQuery tq) {
        	//限制查询时间区间
        	tq = this.restrictQueryByDate(tq);
        	
            try {
                if (thinQueryService.isMdxDrillthrough(tq)) {
                    Long start = (new Date()).getTime();
                    ResultSet rs = thinQueryService.drillthrough(tq);
                    QueryResult rsc = RestUtil.convert(rs);
                    rsc.setQuery(tq);
                    Long runtime = (new Date()).getTime()- start;
                    rsc.setRuntime(runtime.intValue());
                    return rsc;
                }
    
                QueryResult qr = RestUtil.convert(thinQueryService.execute(tq));
                ThinQuery tqAfter = thinQueryService.getContext(tq.getName()).getOlapQuery();
                qr.setQuery(tqAfter);
                return qr;
            }
            catch (Exception e) {
                log.error("Cannot execute query (" + tq + ")",e);
                String error = ExceptionUtils.getRootCauseMessage(e);
                return new QueryResult(error);
            }
        }
    /***
    	 * 该方法为限制在查询中的日期:若不限制日期,则选取当天日期加以限制
    	 * zst create 20160802
    	 * */
      
      private ThinQuery restrictQueryByDate(ThinQuery tq) {
    	  
    	ThinQueryModel queryModel = tq.getQueryModel();
      	Map<AxisLocation, ThinAxis> axesMap = queryModel.getAxes();
      	
      	NamedList<ThinHierarchy> namedList = new NamedListImpl<ThinHierarchy>();
      	
      	ThinAxis filterAxis = axesMap.get(AxisLocation.FILTER);
      	List<ThinHierarchy> filterHie = filterAxis.getHierarchies();
      	
      	namedList = this.resetThinHierachy(filterHie);
      		
      	//将修改后的Row重新set到queryModel
      	if(namedList.size() > 0) {
      		
    		ThinAxis newFilterAxis = new ThinAxis(
    				AxisLocation.FILTER,
    				namedList,
    				filterAxis.isNonEmpty(),
    				filterAxis.getAggregators()
    				);
    		
    		axesMap.put(AxisLocation.FILTER,newFilterAxis);
      	}
      	
      	//将修改后的Row重新set到queryModel
      	if(namedList.size() == 0) {
      		
      		ThinAxis rowAxis = axesMap.get(AxisLocation.ROWS);
      	  	List<ThinHierarchy> rowHie = rowAxis.getHierarchies();
      	  	
      	  	namedList = this.resetThinHierachy(rowHie);
      		
      		if(namedList.size() > 0) {
    			ThinAxis newRowsAxis = new ThinAxis(
    					AxisLocation.ROWS,
    					namedList,
    					rowAxis.isNonEmpty(),
    					rowAxis.getAggregators()
    					);
    			
    			axesMap.put(AxisLocation.ROWS,newRowsAxis);
      		}	
      	}
      	
      	//若rows中不包含[日期]维度,则判断culowns中是否包含;
      	//若columns中包含[日期]维度,且没有限制时间区间,则限制为当天;不包含[日期]维度,则强制添加[日期]维度,并限制时间为当天;
      	if(namedList.size() == 0) {
      		
    //  		namedList.clear();
      		
        	ThinAxis colAxis = axesMap.get(AxisLocation.COLUMNS);
        	List<ThinHierarchy> colHie = colAxis.getHierarchies();
        	
        	namedList = this.resetThinHierachy(colHie);
        	
        	if(namedList.size() == 0) {
        		
        		//若list为空,则说明columns中不包含日期维度,将colHie加入list中,并强制添加日期维度
        		namedList.addAll(colHie);
        		
        		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
    			String yesterday = format.format(new Date(new Date().getTime() - 24 * 60 * 60 * 1000));
    			
    			String newDateMdx = "[日期].[日期].["+yesterday+"]";
    			
    			ThinMember thinMember = new ThinMember(yesterday,newDateMdx,yesterday);
        		ThinHierarchy thinHie = new ThinHierarchy();
        		
        		thinHie.setName("[日期].[日期]");
        		
        		List<ThinMember> thinMemberList = new ArrayList<ThinMember>();
    			thinMemberList.add(thinMember);
    			ThinSelection selection = new ThinSelection();
    			selection.setMembers(thinMemberList);
    			selection.setType(ThinSelection.Type.INCLUSION);
    			ThinLevel thinLevel = new ThinLevel(yesterday,yesterday,selection,null);
    	//  			thinLevel.setSelection(selection);
    			Map<String,ThinLevel> mapLevel = new LinkedHashMap<String,ThinLevel>();
    			mapLevel.put("日期", thinLevel);
    	    		
    			thinHie.setLevels(mapLevel);
    			
    			namedList.add(thinHie);
        		ThinAxis newColAxis = new ThinAxis(
        				AxisLocation.COLUMNS,
        				namedList,
        				colAxis.isNonEmpty(),
        				colAxis.getAggregators()
        				);
        		
        		axesMap.put(AxisLocation.COLUMNS,newColAxis);
        	}
      	}
      	
      	return tq;
      }
      
      private NamedList<ThinHierarchy> resetThinHierachy(List<ThinHierarchy> hieList) {
    	  
    	  NamedList<ThinHierarchy> namedList = new NamedListImpl<ThinHierarchy>();
    	  boolean flag = false;
    	  
    	  for(ThinHierarchy hie : hieList) {
    	  		if(hie.getName().equals("[日期].[日期]")) {
    	    		
    	    		if(hie.getLevels().get("日期").getSelection() == null) {
    	    			SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
    	    			String yesterday = format.format(new Date(new Date().getTime() - 24 * 60 * 60 * 1000));
    	    			
    	    			String newDateMdx = "[日期].[日期].["+yesterday+"]";
    	    			
    	    			ThinMember thinMember = new ThinMember(null,newDateMdx,yesterday);
    	    			
    	    			List<ThinMember> thinMemberList = new ArrayList<ThinMember>();
    	    			thinMemberList.add(thinMember);
    	    			ThinSelection selection = new ThinSelection();
    	    			selection.setMembers(thinMemberList);
    	    			
    	    			hie.getLevels().get("日期").setSelection(selection);
    	    		}
    	    		
    	    		flag = true;
    	  		}
    	  		
    	  		namedList.add(hie);
    	  	}
    	  if(flag) return namedList;
    	  
    	  namedList.clear();
    	  return namedList;
      }

    总结
    按照上述方法,实现了笔者的需求:并没有加入【日期】维度,但是saiku默认将查询日期限制为当日,如下图:

    需要特别强调的一点是:在配置schema时,必须要单独加入【日期】维度配置

    展开全文
  • elementui限制日期控件选择范围

    千次阅读 2019-06-28 19:39:40
    elementui日期控件选择范围1、文档2、实现代码 1、文档 elementui日期控件el-date-picker相关文档 2、实现代码 以设置只能选择今天以及今天以前的日期为例,代码如下。 html代码: <el-date-picker align=...

    elementui日期控件选择范围

    1、文档

    elementui日期控件el-date-picker相关文档
    在这里插入图片描述
    在这里插入图片描述

    2、实现代码

    以设置只能选择今天以及今天以前的日期为例,代码如下。

    html代码:

    <el-date-picker align="right" type="date" placeholder="选择日期" :picker-options="pickerOptions0"></el-date-picker>
    

    js代码:

    data() {
        return {
          pickerOptions0: {
            disabledDate(time) {
              return time.getTime() > Date.now() - 8.64e6
            }
          }
        }
    
    展开全文
  • Android DatePicker 限制日期选择范围

    千次阅读 2014-09-25 18:44:51
    Android DatePicker 设定不能x Calendar calendar = Calendar.getInstance(); int year = calendar.get(Calendar.YEAR); int month = calendar.get(Calendar.MONTH);... int day = calendar.get(Calendar...

    1. Android DatePicker 设定不能选取晚于今日日期


    Calendar calendar = Calendar.getInstance();
    			int year = calendar.get(Calendar.YEAR);
    			int month = calendar.get(Calendar.MONTH);
    			int day = calendar.get(Calendar.DAY_OF_MONTH);
    			datePicker.init(year, month, day, new OnDateChangedListener() {
    
    				@Override
    				public void onDateChanged(DatePicker view, int year,
    						int monthOfYear, int dayOfMonth) {
    
    					if (isDateAfter(view)) {
    						Calendar mCalendar = Calendar.getInstance();
    						view.init(mCalendar.get(Calendar.YEAR),
    								mCalendar.get(Calendar.MONTH),
    								mCalendar.get(Calendar.DAY_OF_MONTH), this);
    					}
    				}
    
    				private boolean isDateAfter(DatePicker tempView) {
    					Calendar mCalendar = Calendar.getInstance();
    					Calendar tempCalendar = Calendar.getInstance();
    					tempCalendar.set(tempView.getYear(), tempView.getMonth(),
    							tempView.getDayOfMonth(), 0, 0, 0);
    					if (tempCalendar.after(mCalendar))
    						return true;
    					else
    						return false;
    				}
    			});


    展开全文
  • easyui datebox 限制日期选择大小

    千次阅读 2014-01-16 11:36:15
    $('#enddate').datebox({  onSelect: function(date){  var date=date.getFullYear()+"-"+(date.getMonth()+1)+"-"+date.getDate();  if(date  $("#enddate").datebox('set
    $('#enddate').datebox({
            onSelect: function(date){
            var date=date.getFullYear()+"-"+(date.getMonth()+1)+"-"+date.getDate();
            if(date<"2014-01-01"){
                    $("#enddate").datebox('setValue','2014-01-01');
                    }
            }
            });
    展开全文
  • 2、限制日期可选范围(限制最大可选范围是最近6个月) 具体实现代码出下: import React, { PureComponent } from 'react'; import moment from 'moment'; import { Form, Modal, DatePicker, } from 'antd'...
  • 如图: 实际的业务需求是: 用户选择月份,提交。 再下一个环节时,需要再次选择具体日期。...即:限制日期控件:只能选择指定月份下的日期 html <input type="text" id="currentDate...
  • Android中DatePicker如何限制日期从某一天开始到现在时间
  • element-ui datetime限制日期时间范围

    千次阅读 2019-03-25 21:29:43
    代码 [ 日期比较 ] <div class="block"> <span class="demonstration">开始日期:</span> <el-date-picker v-model="startDate" type="date" :picker-options="pick...
  • element-ui 动态 限制日期选择范围

    千次阅读 2018-12-18 22:30:03
    逻辑:根据任务时间选择的日期范围来限制收单日期范围 html: &lt;el-form :model="form" :inline="true" ref="form" class="form" label-width="80px"&...
  • Jquery UI的日历控件datepicker限制日期

    万次阅读 2013-12-30 22:55:10
    JQuery.ui.Datepicker是一个很强大的日期选择控件,定制性很强。朱最近在做一个旅馆预订的小功能,要求用户在填写订单选择入住日期时,要将已经被预订出的日期置为不可用,查些资料,看看JS,原来可以使用...
  • antDesign RangePicker限制日期可选范围

    千次阅读 2019-07-23 10:59:58
    上代码: import React from 'react'; import ReactDOM from 'react-dom'; import 'antd/dist/antd.css'; import './index.css';...import moment from 'moment';...import { DatePicker } from 'antd';...
  • 当前时间只能选择两年之内的时间 + 只能选择30天之内的时间范围 其实这个功能只需要一个时间框,跟后台讨论 只能选择两年之内的时间,数据检索两个月之内的数据就可完美解决,只是无奈 有的 (沙币)不同意。...
  • 代码 &amp;amp;lt;template&amp;amp;gt; &amp;amp;lt;el-date-picker type=&amp;quot;daterange&amp;quot; value-format=&amp;quot;yyyyMMdd&amp;quot; format=&...
  • 编写 Java 程序,在控制台中输入日期,计算该日期是对应年份的第几天。 实现思路: (1)声明变量 year、month和 date,用于存储日期中的年、月、日。 (2)声明变量 days,用于存储累加的天数。 (3)通过 ...
  • WdatePicker 最大日期和最小日期限制

    千次阅读 2019-02-17 10:54:28
    &lt;ul class="lina-col"&gt; &lt;li class="col-md-6 p0"...发证日期&lt;i style="color: red;"&gt;*&lt;/i&gt;:&lt;/span&gt; &l
  • 我在activity中使用DatePicket方法来限制日期的选择。 我想限制用户挑选的日期,截止到目前的日期。 用户正能选择日期到当前日期。 当前日期后面的日期不显示 怎么用代码设置这个功能? 谢谢!
  • easyUI日期框的日期范围限制

    千次阅读 2017-06-11 15:31:47
    使用eayUI日期框的日期范围限制对应的官网页面:http://www.jeasyui.net/demo/345.html案例1:控制只能选择本月份的(6.1号-6.30号)&lt;input type="text" class="easyui-datebox appCheckDate&...
  • 前几天在开发中遇到日期选择中需要限制结束日期不能大于起始日期的问题,查了些资料,解决了这个问题。在这里记下用法,以便以后查阅,同时也顺带分享给大家。 var endDate= laydate.render({ elem: '#...
  • 一个合法的身份证号码由17位地区、日期编号和顺序编号加1位校验码组成。校验码的计算规则如下: 首先对前17位数字加权求和,权重分配为:{7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};然后将计算的和对...
  • $('#startDate').datePicker({ yearRange:'1930:2030', dateFormat:'yy-mm-dd', onSelect: function (dateText, inst) { $("#endDate").datepicker("option", "minDate"...
  • bootstrap datetimepicker 日期范围限制

    万次阅读 2017-12-12 10:04:39
    只显示截止到今天一年的日期 一、引入需要的文件,css,js bootstrap-datetimepicker.zh-CN.js 汉化 jsp/html代码 如下: class="form-group"> class="control-label">开始日期: class="input-group date form...
  • android DatePickerDialog设置日期限制

    千次阅读 2015-03-31 17:03:52
    如果需要给自己的日期选择器添加一个起始日期或者结束日期限制的话,那么搜索很容易发现 DatePicker dp; dp.setMinDate(); dp.setMaxDate(); 然而很多人都蒙了,我用的是DatePickerDialog啊,呵呵……这时候...
  • js代码对日期限制

    千次阅读 2016-10-11 20:41:25
    现在有一个需求:js代码对比两个时间,1、开始时间要早于结束时间;2、结束时间和开始时间的间隔不大于7天 function comptime(beginTime, endTime){ //时间的字符串格式“yyyy-MM-dd”  var beginTimes=begin...
  • 实现的效果就是在同一个布局上显示日期选择和时间选择。自定义一个类:/DateTimePicker/src/com/wwj/datetimepicker/DateTimePickDialogUtil.javapackage com.wwj.datetimepicker; import java.text....
  • 7-22 查验身份证 (15 分)一个合法的身份证号码由17位地区、日期编号和顺序编号加1位校验码组成。校验码的计算规则如下: 首先对前17位数字加权求和,权重分配为:{7,9,10,5,8,4,2,1,6,3,7,9,10,5,8...
  • jquery自身提供了日历操作的功能,但之前一直在用My97DatePicker日历的操作,每次使用都要导入文件夹和提供的库,看着令人厌烦,这两天琢磨了一下  jq的日历控件的操 作,...//这是开始日期的操作 $("#endTime").

空空如也

1 2 3 4 5 ... 20
收藏数 800,674
精华内容 320,269
关键字:

限制