sensorqueryer.java

来自「用于传感器网络的节点操作系统 TinyOS 结构设计非常有意思」· Java 代码 · 共 121 行

JAVA
121
字号
package net.tinyos.tinydb.parser;import net.tinyos.tinydb.*;import java.io.*;import java_cup.runtime.*;import java.util.Hashtable;public class SensorQueryer {    private static boolean DEBUG = false;        private TinyDBNetwork network;    private byte queryId = 1;    public static String errorMessage = "";        public SensorQueryer(TinyDBNetwork network) {	this.network = network;    }        public void query(String sql_query) {	TinyDBQuery tdb_query;		try {	    tdb_query = translateQuery(sql_query, queryId++);	} catch (ParseException pe) {	    System.err.println(pe.getMessage());	    pe.printStackTrace();	    System.err.println(pe.getParseError());	    return;	}	try {	    network.sendQuery(tdb_query);	} catch (IOException e) {	    e.printStackTrace();	}    }        public static TinyDBQuery translateQuery(String sql_query, byte queryId) throws ParseException {	StringReader reader = new StringReader(sql_query);	senseParser parser = new senseParser(new Yylex(reader));	Symbol parse_result = null;		if (parser == null)	    System.out.println("PARSER IS NULL");	//parser.setCatalog("catalog");	//parser.setQueryId(queryId);		try {	    errorMessage = "";	    if (DEBUG)		parse_result = parser.debug_parse();	    else		parse_result = parser.parse();	} catch (Exception e) {	    String parseErrMessage;	    if (errorMessage.equals(""))		parseErrMessage = parser.errorMsg;	    else		parseErrMessage = errorMessage;	    throw new ParseException(e, parseErrMessage);	}		String status;	TinyDBQuery tdb_query = (TinyDBQuery) parse_result.value;	tdb_query.setId(queryId);	tdb_query.setSQL(sql_query);	status = checkValidQuery(tdb_query);	//System.out.println("Query Status:  " + status);		if (status.equals("ok")) {	    return tdb_query;	} else {	    throw new ParseException(new Exception("Inconsistent Query: " + status), status);	    //return null;	}	        }        private static String checkValidQuery(TinyDBQuery tdb_query) {	boolean hasNonAggs = false;	boolean isAggQuery = tdb_query.isAgg();  //true if >0 aggregate expressions	boolean isGrouped = false;  //true if isAggQuery and has a group by expression	Hashtable fields = new Hashtable();	//hasNonAggs isn't being set right	//currently set to true only if a non-aggregate expression is present (not a non-aggregate field)	if (tdb_query.numExprs() > 0) {	    QueryExpr e = tdb_query.getExpr(0);	    System.out.println("Expression: " + e);	    if (!e.isAgg()) hasNonAggs = true;	}	if (tdb_query.grouped() && !isAggQuery)	    return "Can't group by if there are no aggregates!";	for (int i = 0; i < tdb_query.numExprs();i++) {	    QueryExpr e = tdb_query.getExpr(i);	    if (e.isAgg()) {		if (tdb_query.grouped() && ((AggExpr)e).getField() == tdb_query.getGroupExpr().getGroupField())		    return "Can't group by aggregate field.";		fields.put(new Integer(((AggExpr)e).getField()), new Integer(0));		fields.put(new Integer(((AggExpr)e).getGroupField()), new Integer(0));	    } else		fields.put(new Integer(((SelExpr)e).getField()), new Integer(0));	}		if (isAggQuery) {	    for (int i = 0; i < tdb_query.numFields(); i++) {		QueryField qf = tdb_query.getField(i);		if (fields.get(new Integer(qf.getIdx())) == null)		    return "Can't SELECT non-aggregate fields in aggregate query.";	    }	}	 		return "ok";    }}

⌨️ 快捷键说明

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