tinydbquery.java

来自「nesC写的heed算法」· Java 代码 · 共 824 行 · 第 1/2 页

JAVA
824
字号
	 a currently running query.	 */    public Message setRateMessage(int rate) {	QueryMsg m = new QueryMsg();	initCommonFields(m);	m.set_msgType(SET_RATE_MSG);	this.epochDur = (short)(rate / MS_PER_EPOCH_DUR_UNIT);	m.set_epochDuration(epochDur);	return m;    }    public void setDropTables() {	this.dropTables = true;	    }	    /* Return a vector of strings containing the	 headings for the columns in this query	 */    public Vector getColumnHeadings() {		Vector cols = new Vector();		boolean addedGroupCol = false;				cols.addElement("Epoch");				if (isAgg()) {			//it's an agg; the columns that are returned			//are the group and the aggregate value			for (int i = 0; i < numExprs(); i++) {				QueryExpr e = getExpr(i);								//System.out.println("Expression " + i + " is " + e.isAgg() + "   " + e);								if (e.isAgg()) {					AggExpr ae = (AggExpr)e;					if (ae.getGroupField() != -1 && !addedGroupCol) {						cols.addElement(groupColName());						addedGroupCol = true;					}					String aggString = "";					aggString += ae.getAgg().toString() + "(" + getField(ae.getField()).getName();										if (ae.getFieldOp() != ArithOps.NO_OP) {						aggString += ArithOps.getStringValue(ae.getFieldOp()) + " ";						aggString += ae.getFieldConst();					}										aggString += ")";										cols.addElement(aggString);									}				if (TinyDBMain.debug) System.out.println(cols);			}					} else {			//its a selection; the columns that are returned			//are the exprs			for (int i =0; i < numFields(); i++) {				QueryField qf = getField(i);				if (qf != null) cols.addElement(qf.getName());			}					}				return cols;    }	    //Returns the type (as defined in QueryField) of the specified    //column in the result set.    public byte getFieldType(int idx) throws ArrayIndexOutOfBoundsException {		boolean addedGroupCol = false;		if (idx == 0) return QueryField.INTTWO;		if (isAgg()) {			for (int i = 0; i < numExprs(); i++) {				QueryExpr e = getExpr(i);								if (e.isAgg()) {					AggExpr ae = (AggExpr)e;					if (ae.getGroupField() != -1 && !addedGroupCol) {						if (--idx == 0) return getField(groupExpr.getGroupField()).getType();						addedGroupCol = true;					}					if (--idx == 0) return getField(ae.getField()).getType();				}							}			throw new ArrayIndexOutOfBoundsException();		} else {			for (int i = 0; i < numFields(); i++) {				QueryField qf = getField(i);				if (--idx == 0) return qf.getType();			}			throw new ArrayIndexOutOfBoundsException();		}		    }	        /** Return an Iterator over messages to be sent	 to start sensors running this	 query	 */    public Iterator messageIterator() {		ArrayList messages = new ArrayList();		Message msg;		QueryMsg qrm;				//first, set up all the fields		for (int i = 0; i < fields.size(); i++) {			QueryField f = (QueryField)fields.get(i);						qrm = new QueryMsg();			msg = qrm;			initCommonFields(qrm);			qrm.set_type(FIELD);			qrm.set_idx((byte)i);			qrm.set_u_field_op(f.getOp());			qrm.setString_u_field_name(f.getName());			qrm.set_u_field_type(f.getType());			if (TinyDBMain.debug) System.out.println(qrm.toString());						messages.add(msg);		}				//then all the exprs		for (int i = 0; i < exprs.size(); i++) {			QueryExpr e = (QueryExpr)exprs.get(i);						qrm = new QueryMsg();			msg = qrm;			initCommonFields(qrm);						qrm.set_type(EXPR);			qrm.set_idx((byte)i);			qrm.set_u_expr_opType((byte)(e.isAgg()?(((AggExpr)e).isTemporalAgg()?TEMPORAL_AGG_EXPR:AGG_EXPR):SEL_EXPR));									qrm.set_u_expr_fieldOp(e.getFieldOp());			qrm.set_u_expr_fieldConst(e.getFieldConst());			if (e.isAgg()) {				AggExpr a = (AggExpr)e;								qrm.set_u_expr_ex_agg_field(e.getField());				qrm.set_u_expr_ex_agg_op(a.getAggOpCode());				qrm.set_u_expr_ex_agg_groupingField(a.getGroupField());				qrm.set_u_expr_ex_agg_groupFieldOp(a.getGroupFieldOp());				qrm.set_u_expr_ex_agg_groupFieldConst(a.getGroupFieldConst());							// set up arguments, for both temporal and non-temporal ones				AggOp ag = a.getAgg();//needs renaming?				for (int j=0; j < ag.getArguments().size(); j++) {					qrm.setElement_u_expr_ex_tagg_args(j, ag.getArgument(j));				}			} else {				SelExpr s = (SelExpr)e;								if (s.isString()) {					qrm.set_u_expr_isStringExp((byte)1);					qrm.set_u_expr_ex_sexp_field(e.getField());					qrm.set_u_expr_ex_sexp_op((byte)s.getSelOpCode());					qrm.setString_u_expr_ex_sexp_s(s.getStringConst());				} else {					qrm.set_u_expr_isStringExp((byte)0);					qrm.set_u_expr_ex_opval_field(e.getField());					qrm.set_u_expr_ex_opval_op((byte)s.getSelOpCode());					qrm.set_u_expr_ex_opval_value(s.getValue());				}			}			if (TinyDBMain.debug) {				System.out.println("expr msg: ");				System.out.print(qrm.toString());			}			messages.add(msg);		}				//the command, if this is a command buffer		if (hasCmd) {		    qrm = new QueryMsg();		    msg = qrm;			initCommonFields(qrm);			qrm.set_type(BUFFER);			qrm.setString_u_buf_cmd_name(cmdName);			qrm.set_u_buf_cmd_hasParam((short)(hasParam?1:0));			qrm.set_u_buf_cmd_param(paramVal);			if (TinyDBMain.debug) System.out.println("command msg: " + qrm.toString());			messages.add(msg);		} else if (ramBuffer) { //or, might be a ram buffer		    qrm = new QueryMsg();		    msg = qrm;			initCommonFields(qrm);			qrm.set_type(BUFFER);			qrm.set_u_buf_ram_numRows(bufSize);			qrm.set_u_buf_ram_policy(EVICT_OLDEST_POLICY);			qrm.set_u_buf_ram_create(createTable?(byte)1:(byte)0);			qrm.set_u_buf_ram_hasOutput(hasName?(byte)1:(byte)0);			qrm.setString_u_buf_ram_outBufName(queryName);			qrm.set_u_buf_ram_hasInput(hasInputBuf?(byte)1:(byte)0);			qrm.setString_u_buf_ram_inBufName(inputBufferName);			if (TinyDBMain.debug) System.out.println("ram buffer msg: " + qrm.toString());			messages.add(msg);		}				//if this query is triggered by an event, send in the event		if (hasEvent) {		    qrm = new QueryMsg();		    msg = qrm;			initCommonFields(qrm);			qrm.set_type(EVENT);			qrm.setString_u_eventName(eventName);			if (TinyDBMain.debug) System.out.println("event message: " + qrm.toString());			messages.add(msg);		}				//if this query is for a fixed number of epochs, send the number of epochs		if (numEpochs > 0) {		    qrm = new QueryMsg();		    msg = qrm;			initCommonFields(qrm);			qrm.set_type(N_EPOCHS);			qrm.set_u_numEpochs(numEpochs);			if (TinyDBMain.debug) System.out.println("num epochs message: " + qrm.toString());			messages.add(msg);		}		//if this is a drop message, that's it		if (dropTables) {		    qrm = new QueryMsg();		    msg = qrm;		    initCommonFields(qrm);		    qrm.set_msgType(DROP_TABLE);					    if (TinyDBMain.debug) System.out.println("drop message: " + qrm.toString());		    qrm.set_u_ttl(DEL_MSG_TTL);		    messages.add(msg);		}				return messages.iterator();    }	    // set up common fields in radio messages    private void initCommonFields(QueryMsg m) {      m.set_msgType(ADD_MSG);      m.set_qid(qid);      m.set_fwdNode(TinyDBNetwork.UART_ADDR);       m.set_numFields((byte)fields.size());      m.set_numExprs((byte)exprs.size());      m.set_fromCatalogBuffer(fromCatalogBuf?(byte)1:(byte)0);      m.set_fromBuffer(fromCatalogBuf?catalogTableId:from_qid);            m.set_bufferType(hasCmd?COMMAND_BUFFER:(ramBuffer?EEPROM_BUFFER:RADIO_BUFFER));      m.set_epochDuration(epochDur);      if (hasEvent)	  m.set_hasEvent((byte)1);      else	  m.set_hasEvent((byte)0);      if (numEpochs > 0)	  m.set_hasForClause((byte)1);      else	  m.set_hasForClause((byte)0);      for (int i = 0; i < 5; i++) {	  m.setElement_timeSyncData(i, (short)0);      }      m.set_clockCount((short)0);    }	    /* Return the id fo the query this query reads results from */    public byte getFromQid() {		return from_qid;    }        /** Set the id of the query this query reads results from */    public void setFromQid(byte qid) {		this.from_qid = qid;    }		public void setFromCatalogTable(byte catalogTable) {		this.fromCatalogBuf = true;		this.catalogTableId = catalogTable;	}	    public boolean isFromCatalogTable() {		return fromCatalogBuf;    }        /** Specify that this query should output results to a RAM based buffer */	public void useRamBuffer(short size) {		bufSize = size;		ramBuffer = true;	}        /** Specify the name of the buffer this query outputs results to -- other queries	 may refer to this buffer name.  If share is true, associate this name with	 this query (globally), so that other queries can reference the local schema.	 */    public void setBufferName(String name, boolean share) {	//overwrite old values, if they exist...	if (share) nameHashMap.put(name.toLowerCase(), this);	this.queryName = name;	hasName = true;    }	    public void setInputBufferName(String name) {		this.inputBufferName = name;		hasInputBuf = true;    }	    /** Given a buffer name, lookup the query which corresponds to it. */    public static TinyDBQuery getQueryForBufName(String name) {		return (TinyDBQuery)nameHashMap.get(name.toLowerCase());    }	    public void setBufferCreateTable(boolean create) {		createTable = create;    }	    public boolean getBufferCreateTable() {		return createTable;    }		    /** Inactive queries have been "stopped" -- e.g. cancelled on the motes,	 but we may still want to keep state about them so the can be	 restarted at the previous epoch	 */    public boolean active() {		return isRunning;    }	    public void setActive(boolean active) {		isRunning = active;    }	            public byte qid,from_qid;    private short epochDur;	public short numEpochs;		private boolean fromCatalogBuf = false;	private byte catalogTableId;	    private static HashMap nameHashMap = new HashMap();	    private boolean ramBuffer = false;    private short bufSize;	    private boolean isGrouped = false;    private AggExpr groupExpr = null;	    private ArrayList fields;    private ArrayList exprs;    private int lastSelExpr = -1;	    private String sql = "";	    private boolean hasCmd = false;    private String cmdName;    private short paramVal = 0;    private boolean hasParam = false;    private String queryName = "";    private String inputBufferName = "";    private boolean hasName = false;    private boolean hasInputBuf = false;	    private boolean hasEvent = false;    private boolean createTable = false;        private boolean dropTables = false;    private String eventName;        static final byte FIELD = 0;    static final byte EXPR = 1;    static final byte BUFFER = 2;    static final byte EVENT = 3;    static final byte N_EPOCHS = 4;    static final byte DROP_TABLE = 5;    static final byte ADD_MSG = 0;    static final byte DEL_MSG = 1;    static final byte MODIFY_MSG = 2;    static final byte SET_RATE_MSG = 3;	    static final byte DEL_MSG_TTL = 3; //ttl on delete messages        public static final byte NO_FROM_QUERY = (byte)0xFF;	    static final byte SEL_EXPR = 0;    static final byte AGG_EXPR = 1;    static final byte TEMPORAL_AGG_EXPR = 2;	    static final byte RADIO_BUFFER = 0;    static final byte RAM_BUFFER = 1;    static final byte EEPROM_BUFFER = 2;    static final byte COMMAND_BUFFER = 3;    static final byte ATTRLIST = 4;    static final byte EVENTLIST = 5;    static final byte COMMANDLIST = 6;    static final byte QUERYLIST = 7;    static final byte EVICT_OLDEST_POLICY = 0;    static final short MS_PER_EPOCH_DUR_UNIT =10;        public static final short kEPOCH_DUR_ONE_SHOT=(short)0x7FFF;	    private boolean isRunning = false; //have we seen any results for this query lately?	}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?