Esper學習筆記四:EPL語法(2)

1.select

查詢全部屬性或特定屬性

EPL的select和SQL的select很相近,SQL用*表示查詢表的全部字段,而EPL用*表示查詢事件流的全部屬性值。SQL查詢某個字段名,直接在select後跟字段名就ok,EPL也是將要查詢的屬性名放在select以後。若查多個屬性值,則用逗號分割。和SQL同樣,EPL查詢屬性也能夠設置別名。函數

//EPL:查詢全部屬性
select * from myEvent
//在監聽器中獲取完整對象
MyEvent me = (MyEvent)eb.getUnderlying();

// EPL:查詢MyEvent的name和age,age別名爲a
select name,age as a from myEvent
//在監聽器中獲取查詢屬性
String name = (String)eb.get("name");
Integer a = (Integer)eb.get("a");

表達式

除了查詢完整對象和屬性外,EPL還支持屬性值的計算,以計算的值做爲結果返回。工具

// 計算長方形的面積(長乘以寬)
select length * width as area from Rectangle

除了簡單的加減乘除,還能夠利用事件流對象的某個方法spa

// 計算長方形的面積(長乘以寬)
select r.getArea(r.length,r.width) as area from Rectangle as r

select r.getArea() as area from Rectangle as r

定義計算面積方法.net

// Rectangle類
public class Rectangle
{
    private int length;
    private int width;
 
    /** 省略getter/setter方法 **/
    // 外部傳入參數計算面積
    public int getArea(int l, int w){
        return l*w;
    }
 
    // 計算該對象的面積
    public int getArea(){
        return length * width;
    }
}

如上所示,一個方法須要傳參,另外一個方法不須要,可是他會利用當前事件的length和width來計算面積。並且要注意的是事件流須要設置別名才能使用其方法。code

若是Rectangle類裏沒有計算面積的方法,可是提供了一個專門計算面積的靜態方法的工具類,表達式也能夠直接引用。不過要事先加載這個包含方法的類。對象

// 該類用於計算面積
public class ComputeArea{
	
	public static int getArea(int length, int width){
		return length*width;
	}
}
 
// 加載
epService.getEPAdministrator().getConfiguration().addImport(ComputeArea.class);

在EPL中調用計算方法blog

// 調用ComputeArea的getArea方法計算面積
select ComputeArea.getArea(length,width) from Rectangle

多事件流查詢

和SQL中的多表查詢相似,EPL也能夠同時對多個事件流進行查詢,即join,可是必須對每一個事件流設置別名。事件

// 在10秒鐘內當老師的id和學生的id相同時,查詢學生的姓名和老師的姓名
select s.name, t.name from Student.win:time(10 sec) as s, Teacher.win:time(10 sec) as t where s.id=t.id

若是想查詢Student或者Teacher,則EPL改寫以下rem

select s.* as st, t.* as tr from Student.win:time(10 sec) as s, Teacher.win:time(10 sec) as t where s.id=t.id

insert和remove事件流

Esper對於事件流分輸入和移出兩種,分別對應監聽器的兩個參數newEvents和oldEvents。字符串

Distinct

去重。

2.From

語法

From的語法不難,主要內容是針對事件流的處理。包括事件流過濾,事件流的維持等等。

事件流過濾

事件流過濾一般狀況都是對其中某個或多個屬性加以限制來達到過濾的目的。

// 只有age大於10的User對象纔可查詢到name值
select name from User(age>10) as user
// 當name=''時,可得到其age值
select age from User(name='')

過濾表達式寫法多種多樣,能夠用逗號「,」,又或者使用and,or,between等邏輯語言。

// 查詢年齡大於15小於18的學生的姓名
select name from Student(age between 15 and 18)
// 等同於
select name from Student(age >= 15 and age <= 18)
// 等同於
select name from Student(age >= 15, age <= 18)

過濾條件有多種多樣,主要有<, >, <=, >=, =, !=, between...and..., in, not in, [ ], ( )。

between...and...

和SQL的between……and……意思同樣,是一個閉區間。好比說between 10 and 15,中文語義爲10到15之間幷包含10和15。

in

配合( )和[ ]進行使用,表示值在某個範圍內。

not in

表示不在某個範圍內

( ):表示一個開區間,語法爲(low:high)。如(10:15),表示10到15之間,而且不包含10和15。

[ ]:表示一個閉區間,語法爲[low:high]。如[10:15],表示10到15之間,而且包含10和15

( )和[ ]能夠混合用。好比[10:15)或者(10:15]

例如:

select name from User(age in [10:15))
select age from User(name in ('張三', '李四'))

靜態方法過濾

除了上面說的這些符號之外,相似於select子句中使用的靜態方法,過濾表達式中也可使用,可是返回值必須爲布爾值,否則會報錯。

/ 判斷總數是否等於0
public class IsZero
{
	public static boolean isZero(int sum)
	{
		return sum==0;
	}
}
 
// 加載
epService.getEPAdministrator().getConfiguration().addImport(IsZero.class);
 
// 查詢沒有錢的用戶的name值(User包含name和money屬性)
select name from User(IsZero.isZero(money))

1. 要過濾的屬性只能是數字和字符串。
2. 過濾表達式中不能使用聚合函數。

 

轉載:https://blog.csdn.net/luonanqin/article/details/11877127

相關文章
相關標籤/搜索