Ignite自定義函式注意事項

仔仔930628發表於2018-07-06

Ignite自定義函式注意事項

  1. Customer SQL Function
    首先,需要寫自定義SQL函式的java類。

注意:1. 定義函式的方法必須是靜態的static修飾。

      2. 自定義函式的方法不能過載。
      3. 每個方法必須要用@QuerySqlFunction註釋。
      4.當有多個自定義方法時,不能同時在@QuerySqlFunction(alias=’XXX’)中定義別名。
      5. 使用setSqlfunction(‘xxx.class’)註冊函式的時候,不能同時註冊兩個class,如果需要自定義多個函式可以在一個類中定義多個方法。

示例如下:
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.apache.ignite.cache.query.annotations.QuerySqlFunction;

public class addition2{

public static final String DATE_TIME_PATTERN = "yyyy-MM-dd HH:mm:ss";
public static final String MINUTE_PATTERN = "yyyy-MM-dd HH:mm";
public static final String HOUR_PATTERN = "yyyy-MM-dd HH:mm:ss";
public static final String DATE_PATTERN = "yyyy-MM-dd";
public static final String HOUR_FORMAT = "HH:mm:ss";
public static final String MONTH_PATTERN = "yyyy-MM";
public static final String YEAR_PATTERN = "yyyy";
public static final String MINUTE_ONLY_PATTERN = "mm";
public static final String HOUR_ONLY_PATTERN = "HH";

// @QuerySqlFunction
// public static double add1(int x,double y){
// return (double)x+y;
// }

@QuerySqlFunction
public static int add(int x,int y){
    return x+y;
}
@QuerySqlFunction
public static int chengfa(int x,int y){
    return x*y;
}
@QuerySqlFunction
public static int jianfa(int x,int y){
    return x-y;
}
@QuerySqlFunction
public static double chufa(double x,double y){
    if (y==0)
        System.out.println("被除數不能為零,重新輸入:");
    return x/y;
}
@QuerySqlFunction
public static Date todate(String dateTimeString,String pattern) throws ParseException{
    if(pattern==null||pattern==""){
        pattern =DATE_PATTERN;
    }
    SimpleDateFormat sdf = new SimpleDateFormat(pattern);
    return sdf.parse(dateTimeString);
}

}

  1. 註冊自定義函式
    注意:1.客戶端和伺服器端需要同時擁有自定義函式的類檔案,不然會找不到檔案

    1. 採用client方式啟動的ignite獲取的cacheconfigeration物件和伺服器段啟動的ignite獲取的cacheconfigeration物件是不一樣的,客戶端必須定義不一樣的cache名,且伺服器端必須配置sqlchema,不然會報錯找不到sqlschema。
    2. 程式中使用setName(‘XXXX’)指定cachename的時候需要與已經存在的cacheName不同。

示例如下:
import java.util.Arrays;
import java.util.List;
import org.apache.ignite.Ignite;
import org.apache.ignite.IgniteCache;
import org.apache.ignite.Ignition;
import org.apache.ignite.cache.CacheAtomicityMode;
import org.apache.ignite.cache.CacheMode;
import org.apache.ignite.cache.query.QueryCursor;
import org.apache.ignite.cache.query.SqlFieldsQuery;
import org.apache.ignite.configuration.CacheConfiguration;
import org.apache.ignite.configuration.IgniteConfiguration;
import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi;
import org.apache.ignite.spi.discovery.tcp.ipfinder.multicast.TcpDiscoveryMulticastIpFinder;
import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder;

public class SqlFunction {

public static void main(String[] args) {
    // TODO Auto-generated method stub
    //local ignite connect
            IgniteConfiguration cfg1 = new IgniteConfiguration();
            cfg1.setIgniteInstanceName("productinfo_withtime");
            TcpDiscoverySpi spi = new TcpDiscoverySpi();
            TcpDiscoveryMulticastIpFinder ipFinder = new TcpDiscoveryMulticastIpFinder();
            ipFinder.setAddresses(Arrays.asList("127.0.0.1:47500..47510"));
            spi.setIpFinder(ipFinder);
            cfg1.setDiscoverySpi(spi);
            cfg1.setClientMode(true);
            Ignite ignite = Ignition.start(cfg1);        
            CacheConfiguration ccfg = new CacheConfiguration();
            ccfg.setName("productinfo1");
            ccfg.setSqlSchema("productinfo_withtime");
            ccfg.setSqlFunctionClasses(addition2.class);        
            IgniteCache cache = ignite.getOrCreateCache(ccfg);
            SqlFieldsQuery query = new SqlFieldsQuery("SELECT add(number,20) add,chengfa(number,3) chengfa,jianfa(number,3) jianfa,chufa(unitPrice,3) chufa,number,floor(unitPrice) floor,unitPrice,todate(time,`yyyy-MM-dd`),time FROM SALE");
            QueryCursor<List<?>> cursor=cache.query(query);
            int i=1;
            for(List<?> row: cursor){
            System.out.println("呼叫add函式後的number資料第"+i+"行為:"+row.get(0)+"	呼叫chengfa函式後number的資料為:"+row.get(1)+"	呼叫jianfa函式後的number的資料為:"+row.get(2)+"	呼叫chufa函式後的unitPrice的資料為:"+row.get(3)+",	number原始資料為:"+row.get(4)+",	呼叫內建floor函式後的unitprice的值:"+row.get(5)+",	unitPrice原始資料為:"+row.get(6)+",	呼叫to_date函式後saleDate資料為:"+row.get(7)+",	saleDate原始資料為:"+row.get(8));
                i++;
            }
        }
}


相關文章