How to debug XQuery - debugging

I am new to XQuery. Can anyone explain how the debug process happens in XQuery?
For example, how to debug the below declaration:
declare
%rxq:produces('*/*')
%rxq:POST
%rxq:path('/sstatement/(Report)/([^/]+)')
function ReportSupplement(
$supplementType
, $submissionId
)
Please suggest any site for debugging XQuery.
Thanks in advance.

A typical way to debug queries in XQuery is to use the trace function around expressions of interest, like a call to the function above in your case.
For example:
for $i in trace(1 to 3, "s")
return <element>{$i * trace($i, "i") }</element>
and to read the output in a separate log, documented by your engine.
In this case, it will look like:
s[1]: 1
i[1]: 1
s[2]: 2
i[1]: 2
s[3]: 3
i[1]: 3

Related

XQuery - How can I count and save informations in a map

I want to safe IDs in a map. If the ID occurs again, I want to set the count ($value) from 1 to 2 and so on.
Following you find my code:
declare namespace functx = "http://www.functx.com";
declare variable $idMap := map{};
declare function functx:uniqueID ($entityID as xs:string) as xs:integer {
let $idMap := map:merge(($idMap, if(not(map:contains($idMap, $entityID))) then map:entry($entityID, 1) else map:entry(entityID, map:get($idMap, $entityID)+1)))
return map:get($idMap, $entityID)
};
declare variable $map := map:merge((
map:entry("Sheff", "85246525"),
map:entry("Peter", "85246454"),
map:entry("Marcel", "85246525"),
map:entry("Lion", "85244565"),
map:entry("Klaus", "85241234")
));
map:for-each($map,
function($key, $value) {
functx:uniqueID($value)
}
)
Result:
1
1
1
1
1
Expected Result
1
1
2 (: Because it is the second time, that 85246525 occurs. :)
1
1
Edited 23.03.2020 - 17:45:
I have a complex xquery, which functions. But the target system need unique IDs per line. I have a map, which hold my information like the upper one. I need to add something behind the IDs like (001, 002, 003) to have different IDs.
Best practice would be, that only douplicate IDs get a added number.
Do you understand or what do you need more from me?
One way to construct a new map with an "index" added to duplicated values is to use grouping:
map:merge(
for $key in map:keys($map)
group by $value := $map($key)
for $group-key at $pos in $key
return map:entry($group-key, $value || '-' || format-integer($pos, '000'))
)
At https://xqueryfiddle.liberty-development.net/6qVSgeT that gives
{
"Peter": "85246454-001",
"Marcel": "85246525-001",
"Sheff": "85246525-002",
"Lion": "85244565-001",
"Klaus": "85241234-001"
}
You've written your code as if $idMap is mutable, and as if calling functx:uniqueID() has the side-effect of modifying the map. That isn't going to work in a functional language.
You need a completely different approach; and to help you with that, we need to look at the problem you are trying to solve, not at your existing approach to a solution.

JMeter If Controller using groovy and Or is not working

I have a script where I have some if controllers. I'm attempting to add a 4th If controller that will trigger a script failure if none of the 3 expected values is returned. It's saying one of the 3 expected values is invalid.
1st, I have a user defined variable like this:
testTool= ${__P(testTool,APPLES)}
2nd, I have these 3 If controllers with these Expressions:
${__groovy(vars.get("testTool").toUpperCase().equals("APPLES"))}
${__groovy(vars.get("testTool").toUpperCase().equals("BANANAS"))}
${__groovy(vars.get("testTool").toUpperCase().equals("PEACHES"))}
The 4th If is supposed to be triggered if the value of testTool is not one of the 3 expected values. It's Expression looks like this:
> ${__groovy( (vars.get("testTool").toUpperCase().equals("APPLES") == false ||
> vars.get("testTool").toUpperCase().equals("BANANAS") == false ||
> vars.get("testTool").toUpperCase().equals("PEACHES") == false)) }
I have also tried it this way:
> ${__groovy((!vars.get("testTool").toUpperCase().equals("APPLES") ||
> !vars.get("testTool").toUpperCase().equals("BANANAS") ||
> !vars.get("testTool").toUpperCase().equals("PEACHES")),)}
It is somehow saying APPLES is an invalid testTool. What am I doing wrong? All if controllers have the 'Interpret Condition as Variable Expression' checked.
Use the following condition in if controller
${__groovy(!(vars.get("testTool").toUpperCase().equals("APPLES"))||!(vars.get("testTool").toUpperCase().equals("BANANAS"))||!(vars.get("testTool").toUpperCase().equals("PEACHES")))}
Please let me know if it helps
You should use && operator instead of ||, see Groovy Logical Operators for detailed explanation and more information.
Your 4th expression needs to be amended to look like:
${__groovy(!(vars.get("testTool").toUpperCase().equals("APPLES")) && !(vars.get("testTool").toUpperCase().equals("BANANAS")) && !(vars.get("testTool").toUpperCase().equals("PEACHES")))}
An easier option would be using Switch Controller, from implementation and especially performance perspectives it is the optimal solution.
Add Switch Controller to your Test Plan
Use ${testTool} as the "Switch Value"
Put 4 requests as the children of the Switch Controller and name them as:
APPLES
BANANAS
PEACHES
DEFAULT
So if ${testTool} variable value will be APPLES - the APPLES sampler will be executed, if ${testTool} variable value will be BANANAS - the BANANAS sampler will be executed, etc.
If ${testTool} will not match any other children - JMeter will run DEFAULT sampler
See Selection Statements in JMeter Made Easy guide for details.

Passing two variables in a ForEach controller in jmeter

I am running a ForEach controller in which I want the controller to run the service underneath it for changes in sets of latitudes and longitudes. example-
Input variable prefix: latitude
Output variable name: Latitude
I want to run the controller for changes in both "latitude" and "longitude". I tried doing this-
Input variable prefix:latitude, longitude
but it does not work. Is there any other way to pass two variables in ForEach controller?
Unfortunately you cannot do it using ForEach Controller, but you can work it around using __V() and __counter() function combination.
For example you have 4 JMeter Variables:
latitude_1=40.7128° N
longitude_1=74.0059° W
latitude_2=32.0853° N
longitude_2=34.7818° E
And you want to iterate them both using ForEach Controller. In that case the relevant configuration would be:
Input variable prefix: latitude
Output variable name: anything meaningful, i.e. current_latitude
You can refer matching longitude value using the following expression:
${__V(longitude_${__counter(,)})}
Demo:
See Here’s What to Do to Combine Multiple JMeter Variables for detailed explanation of where did the above expression come from.
I encountered same problem and google a lot to find the best possible solution but
did not get success. I am sharing my work-around (and I am not saying it's a great solution ) -
Mention your Input variable name (ex - inputVar) as well as Output variable name (outputVar) on ForEach Controller
(lets say http://website.com/folder_A/folder_B/123_latitude/456_longitude) and you like to take care these two : latitue and longtitude
Use regular expression extractor :
Name of created variable : inputVar
Expression : http://website.com/folder_A/folder_B/(.*)
Template : $1$
match No : -1 // (yes -1 , this will give you complete group)
Handle with regular expression (just search it out )
so for above example : that would be -
http://website.com/folder_A/folder_B/${outputVar}
http://website.com/folder_A/folder_B/${outputVar} URL will be able to print / give you latitue and longtitude in your response code

Suggestions on how to create an user-friendly UI for a builder expression(if statements ,mathematical and logical operations)

I need to create a builder expression in asp.net that allows users to create and edit expressions like this
If ([age] >=60 : 50; If ([age]>=50 : 40; If ([age]>=40 : 30; If([age]>=30 : 20;0))))
or its more readable equivalent :
If ([age] >=60 : 50) Else If ([age]>=50 : 40) Else If ([age]>=40 : 30) Else If ([age]>=30 : 20) Else 0
I know how to run code on the fly and I also have a few ideas on how to convert these strings into a .net code, the problem I'm facing now , is how to design an UI that lets users edit this sort of expressions with the minimum margin of error.
I had thought of using a dropdownlist with all the variables defined by the user , another one for the available operators, but I'm not so sure, that's why I want to ask you guys if you have ever done something similar or have any ideas on how to do this
Any advise or guidance would be greatly appreciated.

Xpath or xquery and test the order

Using SoapUI (great tool for WS by the way), I have the following xml result :
<code>c</code>
<code>b</code>
<code>a</code>
For this sample above, i would like to test the code value are order asc. Of course, for this sample the test will fail like excepted.
Any solution with xquery or xpath (i can use groovy inside the test if necessary)
Thanks in advance.
Use (XQuery or XPath 2.0):
not(code[. > following-sibling::code])
Two other ways:
empty(
for $x at $p in code
where ($x > code[$p + 1])
return $x
)
and
deep-equal(for $x in code order by $x return $x/data(.), code/data(.))
But Dimitre's answer seems the cleanest.

Resources