import module namespace qs = "http://www.demaq.net/dql";
declare default errorqueue outgoingMessages;
declare namespace soap = "http://schemas.xmlsoap.org/soap/envelope/";
declare default element namespace "http://xmlns.demaq.net/onlineshop";
create queue incomingMessages kind incoming interface "http" port "2342" response outgoingMessages mode persistent;
create queue customerMasterData kind basic mode persistent;
create queue bookCart kind basic mode persistent;
create queue musicCart kind basic mode persistent;
create property customerID queue customerMasterData fixed value //customer/ID/text();
create property transactionID
queue bookCart fixed value //transactionID/text()
queue musicCart fixed value //transactionID/text();
create property bookTransactionID queue bookCart fixed value //transactionID/text();
create property musicTransactionID queue musicCart fixed value //transactionID/text();
create slicing masterDataForCustomer on customerID require false();
create slicing cartItemsForCustomer on transactionID require false();
create slicing bookCartItemsForCustomer on bookTransactionID require false();
create slicing musicCartItemsForCustomer on musicTransactionID require false();
(: START RULE registerNewCustomer :)
create rule registerNewCustomer for incomingMessages
if(//registerNewCustomer)
then(
enqueue message . into customerMasterData,
enqueue message Inserted customer masterdata into outgoingMessages
)
else ();
(: END RULE registerNewCustomer :)
(: START RULE addItemToCart :)
create rule addItemToCart for incomingMessages
if(//addItem)
then
if(//addItem/book)
then
(enqueue message . into bookCart,
enqueue message Added item to bookCart into outgoingMessages)
else
(enqueue message . into musicCart ,
enqueue message Added item to musicCart into outgoingMessages)
else ();
(: END RULE addItemToCart :)
(: START RULE updateMasterData :)
create rule updateMasterData for incomingMessages
if(//updateCustomerData)
then (
enqueue message . into customerMasterData,
enqueue message Changed master data into outgoingMessages
)
else();
(: END RULE updateMasterData :)
(: START RULE cartContent :)
create rule cartContent for incomingMessages
let $request := //requestCartContent
return
if($request)
then
let $relevantMessages :=
if($request/books)
then qs:slice($request/transactionID/text(), "bookCartItemsForCustomer")
else if($request/music)
then qs:slice($request/transactionID/text(), "musicCartItemsForCustomer")
else qs:slice($request/transactionID/text(), "cartItemsForCustomer")
let $resultDocument := {sum($relevantMessages//price)}
return enqueue message $resultDocument into outgoingMessages
else();
(: END RULE cartContent :)
(: START RULE handleCheckout :)
create rule handleCheckout for incomingMessages
let $request := //checkout
return
if($request)
then
let $transactionID := $request/transactionID/text()
let $customerID := $request/customerID/text()
let $customerMasterData := qs:slice($customerID, "masterDataForCustomer")[position() = last()]
let $customerOrders := qs:slice($transactionID, "cartItemsForCustomer")
let $result := {$customerOrders//item}{$customerMasterData//address}
return enqueue message $result into outgoingMessages
else();
(: END RULE handleCheckout :)