/*
* Copyright 2008-2009 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.test.hasor.db._07_ql;
import net.hasor.data.ql.dsl.DataQL;
import net.hasor.data.ql.dsl.QueryModel;
import net.hasor.data.ql.dsl.domain.EqType;
import net.hasor.data.ql.dsl.parser.DataQLParser;
import net.hasor.data.ql.dsl.parser.ParseException;
import org.junit.Test;
/**
* @version : 2014-7-12
* @author 赵永春 (zyc@byshell.org)
*/
public class GraphQLTest {
public QueryModel main1() {
/*
-- 查询服务,并返回查询一条结果(如果服务返回一个List,那么取第一个元素)
findUserByID ( userID = 12345 , status > 2) {
name,
age,
nick
}
*/
QueryModel queryModel = DataQL.createQuery()//
.byUDF("findUserByID")//
.addParam(//
DataQL.createParam("userID").withNumber(12345)//
)//
.addParam(//
DataQL.createParam("status").withNumber(2), EqType.GT//
)//
//-----------------------------------------------------------------------
.asObject()//
.addField(//
DataQL.createField("name").withMapping("name2")//
)//
.addField(//
DataQL.createField("age").withMapping("age")//
)//
.addField(//
DataQL.createField("nick").withMapping("nick")//
)//----------------------------------------------------------------------
.buildQuery();
//
return printQuery(queryModel);
}
public QueryModel main2() {
/*
-- 查询服务,并返回查询一条结果(如果服务返回一个List,那么取第一个元素)
{
userInfo : {
info :findUserByID ( userID = 12345 ) {
name,
age,
nick
},
nick : info.nick
},
source : "DataQL"
}
*/
QueryModel queryModel = DataQL.createQuery()//
//-----------------------------------------------------------------------
.asObject()//
.addField(//
DataQL.createField("userInfo")//
//---------------------------------------------------------------------------
.asObject()//
.addField(//
DataQL.createField("info")//
.withUDF("findUserByID")//
.addParam(//
DataQL.createParam("userID").withNumber(12345)//
)//------------------------------------------------------------------------------
.asObject()//
.addField(//
DataQL.createField("name").withMapping("name")//
)//
.addField(//
DataQL.createField("age").withMapping("age")//
)//
.addField(//
DataQL.createField("nick").withMapping("nick")//
)//------------------------------------------------------------------------------
.asField()//
)//
.addField(//
DataQL.createField("nick").withMapping("info.nick")//
)//--------------------------------------------------------------------------
.asField()//
)//
.addField(//
DataQL.createField("source").withString("DataQL")//
)
//----------------------------------------------------------------------
.buildQuery();
//
return printQuery(queryModel);
}
public QueryModel main3() {
/*
-- 查询服务,并返回一组结果(如果服务只返回一个对象,那么以 List 形式返回)
findUserByID ( userID = 12345 ) [
{
name,
age,
nick
}
]
*/
QueryModel queryModel = DataQL.createQuery()//
.byUDF("findUserByID")//
.addParam(//
DataQL.createParam("userID").withNumber(12345)//
)//----------------------------------------------------------------------
.asListObject()//
//
.addField(//
DataQL.createField("name").withMapping("name")//
)//
.addField(//
DataQL.createField("age").withMapping("age")//
)//
.addField(//
DataQL.createField("nick").withMapping("nick")//
)//----------------------------------------------------------------------
.buildQuery();
//
return printQuery(queryModel);
}
public QueryModel main4() {
/*
-- 查询服务,并返回所有名称集合
findUserByID ( userID = 12345 ) [
name
]
*/
QueryModel queryModel = DataQL.createQuery()//
.byUDF("findUserByID")//
.addParam(//
DataQL.createParam("userID").withNumber(12345)//
)//----------------------------------------------------------------------
.asListValue()//
//
.addField(//
DataQL.createField("name").withMapping("name2")//
)//
.buildQuery();
//
return printQuery(queryModel);
}
public QueryModel main5() {
/*
-- 查询服务的同时构造另两个 orderList 属性,属性来源是另一个服务,另外参数 userID、status 也可以使用引号阔起来
findUserByID ("userID" = uid, "status" = 1, "oriData" = {
"self" : true,
"testID" : 222
}) {
"info" : {
"userID" : ~.userID,
"nick" : ~.nick
},
"orderList" : queryOrder ("accountID" = $.info.userID) [
{
"orderID",
"itemID",
"itemName",
"nick" : $.nick
}
]
}
*/
QueryModel queryModel = DataQL.createQuery()//
.byUDF("findUserByID")//
.addParam(//
DataQL.createParam("userID").withParam("uid")//
).addParam(//
DataQL.createParam("status").withNumber(1)//
).addParam(//
DataQL.createParam("oriData").withFragment(//
DataQL.createQuery()//
.asObject()//
.addField(//
DataQL.createField("self").withBoolean(true)//
)//
.addField(//
DataQL.createField("testID").withNumber(222)//
).buildQuery()//
)//
)//----------------------------------------------------------------------
.asObject()//
.addField(
//
DataQL.createField("info")//
.asObject()//
.addField(//
DataQL.createField("userID").withMapping("userID")//
).addField(//
DataQL.createField("nick").withMapping("~.nick")//
).asField()//
)//
.addField(//
DataQL.createField("orderList")//
.withUDF("queryOrder")//
.addParam(//
DataQL.createParam("accountID").withParam("$.info.userID")//
)//--------------------------------------------------------------------------
.asListObject()//
.addField(//
DataQL.createField("orderID").withMapping("orderID")//
)//
.addField(//
DataQL.createField("itemID").withMapping("itemID")//
)//
.addField(//
DataQL.createField("itemName").withMapping("itemName")//
)//
.addField(//
DataQL.createField("nick").withMapping("$.nick")//
)//--------------------------------------------------------------------------
.asField()//
)//
.buildQuery();
//
return printQuery(queryModel);
}
public QueryModel main6() {
/*
-- 参数可以是另一个函数的返回值
findUserByID ( "userID" = foo( "sessionID" = sid ), "status" = 1 ) {
"userID",
"nick"
}
*/
QueryModel queryModel = DataQL.createQuery()//
.byUDF("findUserByID")//
.addParam(//
DataQL.createParam("userID")//
.withUDF("foo")//
.addParam(//
DataQL.createParam("sessionID").withParam("sid")//
)//
//----------------------------------------------------------------------
.asOriginal()//
.asParam()//
)//
.addParam(//
DataQL.createParam("status").withNumber(1) //
)//
//----------------------------------------------------------------------
.asObject()//
.addField(//
DataQL.createField("userID").withMapping("userID")//
)//
.addField(//
DataQL.createField("nick").withMapping("nick")//
)//
.buildQuery();
//
return printQuery(queryModel);
}
public QueryModel main7() {
/*
{
user : findUserByID( "userID" = uid ,... ) {
uid : "userID",
name,
age,
nick
},
orderList : queryOrder( "accountID" = user.uid , ... ) [
{
orderID,
itemID,
itemName
}
]
}
*/
QueryModel queryModel = DataQL.createQuery()//
.asObject()//
.addField(//
DataQL.createField("user")//
.withUDF("userManager.findUserByID")//
.addParam(//
DataQL.createParam("userID").withParam("uid")//
)//
.asObject()//
.addField(//
DataQL.createField("uid").withMapping("userID")//
)//
.addField(//
DataQL.createField("name").withMapping("name")//
)//
.addField(//
DataQL.createField("age").withMapping("age")//
)//
.addField(//
DataQL.createField("nick").withMapping("nick")//
)//
.asField()//
)//
.addField(//
DataQL.createField("orderList")//
.withUDF("queryOrder")//
.addParam(//
DataQL.createParam("accountID").withParam("user.uid")//
)//
.asListObject()//
.addField(//
DataQL.createField("orderID").withMapping("orderID")//
)//
.addField(//
DataQL.createField("itemID").withMapping("itemID")//
)//
.addField(//
DataQL.createField("itemName").withMapping("itemName")//
)//
.asField()//
)//
.buildQuery();
//
return printQuery(queryModel);
}
public QueryModel main8() {
/*
-- 使用查询片段优化 DataQL 语句结构,以便于阅读
fragment fUser on findUserByID( "userID" = uid ) {
userID,
name,
age,
nick,
}
fragment fOrder on queryOrder( "accountID" = uid , ... ) [
{
orderID,
itemID,
itemName
}
]
{
user : fUser{},
orderList : fOrder{},
}
*/
QueryModel fUserQL = DataQL.createQuery("fUserQL")//
.byUDF("findUserByID")//
.addParam(//
DataQL.createParam("userID").withParam("uid")//
)//
.asObject()//
.addField(//
DataQL.createField("userID").withMapping("userID")//
)//
.addField(//
DataQL.createField("name").withMapping("name")//
)//
.addField(//
DataQL.createField("age").withMapping("age")//
)//
.addField(//
DataQL.createField("nick").withMapping("nick")//
)//
.buildQuery();
//
QueryModel fOrderQL = DataQL.createQuery("fOrderQL")//
.byUDF("queryOrder")//
.addParam(//
DataQL.createParam("accountID").withParam("uid")//
)//
.asListObject()//
.addField(//
DataQL.createField("orderID").withMapping("orderID")//
)//
.addField(//
DataQL.createField("itemID").withMapping("itemID")//
)//
.addField(//
DataQL.createField("itemName").withMapping("itemName")//
)//
.buildQuery();
//
QueryModel queryModel = DataQL.createQuery()//
.asObject()//
.addField(//
DataQL.createField("user").withFragment(fUserQL)//
).addField(//
DataQL.createField("orderList").withFragment(fOrderQL)//
)//
.buildQuery();
//
return printQuery(queryModel);
}
public QueryModel main9() {
/*
-- 查询片段的集中样式
fragment fUser on {
userInfo : findUserByID ( userID = uid ) {
name,
age,
nick
},
source : "DataQL"
}
fragment fOrder on queryOrder( "accountID" = uid , ... ) [
{
orderID,
itemID,
itemName
}
]
{
user : fUser,
orderList : fOrder,
}
*/
QueryModel fUserQL = DataQL.createQuery("fUser")//
.asObject()//
.addField(DataQL.createField("userInfo")//
.withUDF("findUserByID")//
.addParam(//
DataQL.createParam("userID").withParam("uid")//
)//
.asField()//
).addField(//
DataQL.createField("source").withString("DataQL")//
)//
.buildQuery();
//
QueryModel fOrder = DataQL.createQuery("fOrder")//
.byUDF("queryOrder")//
.addParam(//
DataQL.createParam("accountID").withParam("uid")//
)//
.asListObject()//
.addField(//
DataQL.createField("orderID").withMapping("orderID")//
)//
.addField(//
DataQL.createField("itemID").withMapping("itemID")//
)//
.addField(//
DataQL.createField("itemName").withMapping("itemName")//
)//
.buildQuery();
//
QueryModel queryModel = DataQL.createQuery()//
.asObject()//
.addField(//
DataQL.createField("user").withFragment(fUserQL)//
).addField(//
DataQL.createField("orderList").withFragment(fOrder)//
)//
.buildQuery();
//
return printQuery(queryModel);
}
private QueryModel printQuery(QueryModel graphQL1) {
try {
String query1 = graphQL1.buildQuery();
System.out.println(query1);
System.out.println("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
QueryModel graphQL2 = DataQLParser.parserQL(query1);
String query2 = graphQL2.buildQuery();
System.out.println(query2);
System.out.println("EQ:" + query1.equals(query2));
assert query1.equals(query2);
return graphQL2;
} catch (ParseException e) {
throw new RuntimeException(e);
}
}
@Test
public void _main1() {
main1();
}
@Test
public void _main2() {
main2();
}
@Test
public void _main3() {
main3();
}
@Test
public void _main4() {
main4();
}
@Test
public void _main5() {
main5();
}
@Test
public void _main6() {
main6();
}
@Test
public void _main7() {
main7();
}
@Test
public void _main8() {
main8();
}
@Test
public void _main9() {
main9();
}
}