Join query in gremlin, group results in a one to many relationship - java

I have to type of vertices Country and Airports, and each country has an edge to multiple airports with label "hasAirport"
I'm trying a join query which will return Countries grouped with the Airports they have.
g.V().hasLabel("Country").as("country").out('hasAirport').as("airport").select("country", "airport").by(__.unfold().valueMap(true).fold()).toList()
The if I have only one Country say United States with two airports in my graph, the result of the query is something like below.
[ {
"country": [
{
"name": "United States",
"code": "USA", "label": "Country",
"id": 1565,
}
],
"airport": [
{
"id": 1234,
"label": "Airport",
"name": "San Francisco International Airport", "code": "SFO"
}
] }, {
"country": [
{
"name": "United States",
"code": "USA", "label": "Country",
"id": 1565,
}
],
"airport": [
{
"id": 2345,
"label": "Airport",
"name": "Austin Bergstrom International Airport", "code": "AUS"
}
] } ]
Is there a way to club multiple airports in a single array like below
[
{
"country": [
{
"name": "United States",
"code": "USA",
"label": "Country",
"id": 1565,
}
],
"airport": [
{
"id": 1234,
"label": "Airport",
"name": "San Francisco International Airport",
"code": "SFO"
},
{
"id": 2345,
"label": "Airport",
"name": "Austin Bergstrom International Airport",
"code": "AUS"
}
]
}
]

You need to use project:
g.V().hasLabel("Country")
.project("country","airport")
.by(valueMap(true))
.by(out('hasAirport').valueMap(true).fold())

Related

How to programmatically create a filter query in Elasticsearch with filtring in a nested object

I am struggling creating a filter query for Elastisearch in Java Spring. I have this Elasticsearch mapping:
"mappings": {
"properties": {
"id": {"type": "keyword"},
"name": {"type": "text"},
"city": {"type": "keyword"},
"cars": {
"type": "nested",
"properties": {
"id": {"type": "long"},
"brand": {"type": "text"},
"category": {"type": "text"}
}
}
}
Data in Elasticsearch looks like this:
[
{
"id": 1,
"name": "Car seller 1",
"city": "Detroit",
"cars": [
{"id": 1, "brand": "bmw", "category": "suv"},
{"id": 2, "brand": "bmw", "category": "sedan"},
{"id": 3, "brand": "bmw", "category": "hatchback"}
]
},
{
"id": 2,
"name": "Car seller 2",
"city": "Detroit",
"cars": [
{"id": 1, "brand": "vw", "category": "suv"},
{"id": 2, "brand": "vw", "category": "sedan"},
{"id": 3, "brand": "vw", "category": "suv"}
]
},
{
"id": 3,
"name": "Car seller 3",
"city": "Las Vegas",
"cars": [
{"id": 1, "brand": "ford", "category": "suv"},
{"id": 2, "brand": "ford", "category": "sedan"},
{"id": 3, "brand": "ford", "category": "hatchback"}
]
}
]
Now, let's say that from my FE will came an request to search documents by some filters:
1. city: ["Detroit"]
2. cars.category: ["suv"]
What I want to achieve is a filter query that will return documents of sellers, but only with cars that match the filter (if there is such a filter).
For example, for mentioned filters query should return this:
[
{
"id": 1,
"name": "Car seller 1",
"city": "Detroit",
"cars": [
{"id": 1, "brand": "bmw", "category": "suv"}
]
},
{
"id": 2,
"name": "Car seller 2",
"city": "Detroit",
"cars": [
{"id": 1, "brand": "vw", "category": "suv"},
{"id": 3, "brand": "vw", "category": "suv"}
]
}
]
So far, I was able to create query with java builders provided by Elastic, which can filter documents properly, but it returning all sellerĀ“s cars.
public Flux<Seller> filterSearch(Map<String, List<String>> filters) {
List<String> listOfFields = new ArrayList<>(filters.keySet());
BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
listOfFields.forEach(field -> {
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
if (field.contains("cars.")) {
filters.get(field).forEach(value -> boolQueryBuilder.should(QueryBuilders.termQuery(field, value)));
boolQueryBuilder.minimumShouldMatch(1);
NestedQueryBuilder nestedQueryBuilder = new NestedQueryBuilder("cars", boolQueryBuilder, NestedQueryBuilder.parseScoreMode("none"));
nestedQueryBuilder.innerHit(new InnerHitBuilder());
queryBuilder.must().add(nestedQueryBuilder);
} else {
filters.get(field).forEach(value -> boolQueryBuilder.should(QueryBuilders.matchPhraseQuery(field, value)));
queryBuilder.must().add(boolQueryBuilder);
}
});
return executeSearchQuery(queryBuilder);
}
Thanks for your help.
I think you should try this:
if (field.contains("cars.")) {
...
} else {
filters.get(field).forEach(value -> boolQueryBuilder.should(QueryBuilders.matchPhraseQuery(field, value)).minimumShouldMatch(1));
queryBuilder.must().add(boolQueryBuilder);
}

How to calculate the sum of a Respond (Json) using response.path?

Seem to be struggling to calculate the number of squad members who have the role type of 'PLAYER' by performing my restassured logic against my Json response.
Currently I have a simple setup which hits an endpoint and then executes my query, I can see that the endpoint and response is valid however it seems there is a problem when attempting to filter via my query in order to calculate the total sum of squad members who have a role of 'PLAYER'.
My Rest-assured code:
#Test
public void locatePlayerCalculateSum() {
Response response = given()
.spec(footballCompetitions_requestSpecification)
.when().get(EndPoint.TEAMS + EndPoint.SQUAD);
int sum = response.path("squad.collect { it.role == \"PLAYER\" }.sum()");
System.out.println(sum);
}
Exception Message: java.lang.IllegalArgumentException: No signature of method: java.lang.Boolean.plus() is applicable for argument types: (java.lang.Boolean) values: [true]
Possible solutions: is(java.lang.Object), or(java.lang.Boolean), implies(java.lang.Boolean), and(java.lang.Boolean), use([Ljava.lang.Object;), split(groovy.lang.Closure)
Example JSON response:
"id": 66,
"area": {
"id": 2072,
"name": "England"
},
"activeCompetitions": [
{
"id": 2021,
"area": {
"id": 2072,
"name": "England"
},
"name": "Premier League",
"code": "PL",
"plan": "TIER_ONE",
"lastUpdated": "2019-01-03T23:39:45Z"
},
{
"id": 2001,
"area": {
"id": 2077,
"name": "Europe"
},
"name": "UEFA Champions League",
"code": "CL",
"plan": "TIER_ONE",
"lastUpdated": "2018-12-13T18:55:02Z"
}
],
"name": "Manchester United FC",
"shortName": "Man United",
"tla": "MNU",
"crestUrl": "http://upload.wikimedia.org/wikipedia/de/d/da/Manchester_United_FC.svg",
"address": "Sir Matt Busby Way Manchester M16 0RA",
"phone": "+44 (0161) 8688000",
"website": "http://www.manutd.com",
"email": "enquiries#manutd.co.uk",
"founded": 1878,
"clubColors": "Red / White",
"venue": "Old Trafford",
"squad": [
{
"id": 3188,
"name": "David De Gea",
"position": "Goalkeeper",
"dateOfBirth": "1990-11-07T00:00:00Z",
"countryOfBirth": "Spain",
"nationality": "Spain",
"shirtNumber": 1,
"role": "PLAYER"
},
{
"id": 3202,
"name": "Sergio Romero",
"position": "Goalkeeper",
"dateOfBirth": "1987-02-22T00:00:00Z",
"countryOfBirth": "Argentina",
"nationality": "Argentina",
"shirtNumber": null,
"role": "PLAYER"
},
{
"id": 7942,
"name": "Lee Grant",
"position": "Goalkeeper",
"dateOfBirth": "1983-01-27T00:00:00Z",
"countryOfBirth": "England",
"nationality": "England",
"shirtNumber": 13,
"role": "PLAYER"
},
{
"id": 3206,
"name": "Marcos Rojo",
"position": "Defender",
"dateOfBirth": "1990-03-20T00:00:00Z",
"countryOfBirth": "Argentina",
"nationality": "Argentina",
"shirtNumber": 16,
"role": "PLAYER"
},```
This should work:
#Test
public void locatePlayerCalculateSum() {
Response response = given()
.spec(footballCompetitions_requestSpecification)
.when().get(EndPoint.TEAMS + EndPoint.SQUAD);
int sum = response.path("squad.count { it.role == 'PLAYER' }");
System.out.println(sum);
}

Find Regex for Given Format that matches specific key value pair(s) in JSON

'{"id":1,"last":"Doe","first":"John","location":{"city":"Oakland","state":"CA","postalCode":"94607"},"active":true}',
'{"id":2,"last":"Doe","first":"Jane","location":{"city":"San
Francisco","state":"WA","postalCode":"94105"},"active":false}',
'{"id":3,"last":"Doe","first":"Jane","location":{"city":"San
Francisco","state":"CA","postalCode":"94105"},"active":true}'
I am looking for getting json contain which includes '{"id":1}'. OR
I am looking for getting json contain which includes '{"location":{"state":"CA"},"active":true}' Likewise...
So for '{"id":1}' it should return
{{"id":1,"last":"Doe","first":"John","location":{"city":"Oakland","state":"CA","postalCode":"94607"},"active":true}
and for '{"location":{"state":"CA"},"active":true}' it should return
{"id":1,"last":"Doe","first":"John","location":{"city":"Oakland","state":"CA","postalCode":"94607"},"active":true}
{"id":3,"last":"Doe","first":"Jane","location":{"city":"San
Francisco","state":"CA","postalCode":"94105"},"active":true}
Try this one: (.*"state":"CA".*"active":true.*)
Demo: https://regex101.com/r/hP6gS1/238
It works.
You can change tag name and values as per your requirements. It extracts your required JSON content.
Python version
my_json = """[
{
"id": 1,
"last": "Doe",
"first": "John",
"location": {
"city": "Oakland",
"state": "CA",
"postalCode": "94607"
},
"active": true
}, {
"id": 2,
"last": "Doe",
"first": "Jane",
"location": {
"city": "San Francisco",
"state": "WA",
"postalCode": "94105"
},
"active": false
}, {
"id": 3,
"last": "Doe",
"first": "Jane",
"location": {
"city": "San Francisco",
"state": "CA",
"postalCode": "94105"
},
"active": true
}
]"""
import json
my_list = json.loads(my_json)
result_list = list(filter(
lambda d:
d["id"] == 1 or \
(d["location"]["state"] == "CA" and d["active"]),
my_list
))

eBay Order API throwing error in sandbox environment

In ebay Order API - initiateCheckoutSession (guest checkout), adding credit card information returns error. I am testing in sandbox environment.
API : https://api.sandbox.ebay.com/buy/order/v1/guest_checkout_session/initiate
Request Body:
{
"creditCard":
{
"accountHolderName": "Frank Smith",
"cardNumber": "5100000001598174",
"cvvNumber": "012",
"expireMonth": 10,
"expireYear": 2019,
"brand": "MASTERCARD",
"billingAddress":
{
"firstName": "Frank",
"lastName": "Smith",
"addressLine1": "3737 Any St",
"city": "San Jose",
"stateOrProvince": "CA",
"postalCode": "95134",
"country": "US"
}
},
"contactEmail": "fsmith1234#anymail.com",
"contactFirstName": "Frank",
"contactLastName": "Smith",
"shippingAddress": {
"recipient": "Frank Smith",
"phoneNumber": "617 555 1212",
"addressLine1": "3737 Any St",
"city": "San Jose",
"stateOrProvince": "CA",
"postalCode": "95134",
"country": "US"
},
"lineItemInputs": [
{
"quantity": 1,
"itemId": "v1|110188913683|0"
}
]
}
Response:
{
"errors": [
{
"errorId": 15000,
"domain": "API_ORDER",
"category": "APPLICATION",
"message": "There was a problem with an eBay internal system or process. Contact eBay developer support for assistance.",
"parameters": [
{
"name": "code",
"value": "1042"
}
]
}
]
}
API works fine if credit card details are not in request. Could someone please help?
As per eBay Order API documentation, your request payload is good, but if you check the guest checkout samples they do not have the credit-card object in the request. They also mention that if you do not have credit card information in this request then you can call updatePaymentInfoGuest to add credit card information to checkout session.
Documentation Links :
Initiate Checkout : https://developer.ebay.com/api-docs/buy/order/resources/guest_checkout_session/methods/initiateCheckoutSession
Update Payment Info : https://developer.ebay.com/api-docs/buy/order/resources/guest_checkout_session/methods/updatePaymentInfo#_samples
The inputs are the buyer's email, name, and address and the item IDs and quantity of each item. You can have a maximum of four individual items of any quantity in a checkout session. Each item is associated with a unique line item. Optionally, you can include the buyer's payment information. If you don't include this information in this call, you can use the updatePaymentInfoGuest call to add this information to the checkout session.
As the guest checkout response doesn't have much information about the error, I would recommend you to try the below ....
call guest checkout without credit-card information (buy/order/v1/guest_checkout_session/initiate)
call update payment with cred-t-card information info using the checkout session id from above (buy/order/v1/guest_checkout_session/{checkoutSessionId}/update_payment_info)
Checkout Session Request Schema:
{
"contactEmail": "string",
"contactFirstName": "string",
"contactLastName": "string",
"creditCard": {
"accountHolderName": "string",
"billingAddress": {
"addressLine1": "string",
"addressLine2": "string",
"city": "string",
"country": "CountryCodeEnum : [AD,AE,AF,AG,AI,AL,AM,AN,AO,AQ,AR,AS,AT,AU,AW,AX,AZ,BA,BB,BD,BE,BF,BG,BH,BI,BJ,BL,BM,BN,BO,BQ,BR,BS,BT,BV,BW,BY,BZ,CA,CC,CD,CF,CG,CH,CI,CK,CL,CM,CN,CO,CR,CU,CV,CW,CX,CY,CZ,DE,DJ,DK,DM,DO,DZ,EC,EE,EG,EH,ER,ES,ET,FI,FJ,FK,FM,FO,FR,GA,GB,GD,GE,GF,GG,GH,GI,GL,GM,GN,GP,GQ,GR,GS,GT,GU,GW,GY,HK,HM,HN,HR,HT,HU,ID,IE,IL,IM,IN,IO,IQ,IR,IS,IT,JE,JM,JO,JP,KE,KG,KH,KI,KM,KN,KP,KR,KW,KY,KZ,LA,LB,LC,LI,LK,LR,LS,LT,LU,LV,LY,MA,MC,MD,ME,MF,MG,MH,MK,ML,MM,MN,MO,MP,MQ,MR,MS,MT,MU,MV,MW,MX,MY,MZ,NA,NC,NE,NF,NG,NI,NL,NO,NP,NR,NU,NZ,OM,PA,PE,PF,PG,PH,PK,PL,PM,PN,PR,PS,PT,PW,PY,QA,RE,RO,RS,RU,RW,SA,SB,SC,SD,SE,SG,SH,SI,SJ,SK,SL,SM,SN,SO,SR,ST,SV,SX,SY,SZ,TC,TD,TF,TG,TH,TJ,TK,TL,TM,TN,TO,TR,TT,TV,TW,TZ,UA,UG,UM,US,UY,UZ,VA,VC,VE,VG,VI,VN,VU,WF,WS,YE,YT,ZA,ZM,ZW]",
"county": "string",
"firstName": "string",
"lastName": "string",
"postalCode": "string",
"stateOrProvince": "string"
},
"brand": "string",
"cardNumber": "string",
"cvvNumber": "string",
"expireMonth": "integer",
"expireYear": "integer"
},
"lineItemInputs": [
{
"itemId": "string",
"quantity": "integer"
}
],
"shippingAddress": {
"addressLine1": "string",
"addressLine2": "string",
"city": "string",
"country": "CountryCodeEnum : [AD,AE,AF,AG,AI,AL,AM,AN,AO,AQ,AR,AS,AT,AU,AW,AX,AZ,BA,BB,BD,BE,BF,BG,BH,BI,BJ,BL,BM,BN,BO,BQ,BR,BS,BT,BV,BW,BY,BZ,CA,CC,CD,CF,CG,CH,CI,CK,CL,CM,CN,CO,CR,CU,CV,CW,CX,CY,CZ,DE,DJ,DK,DM,DO,DZ,EC,EE,EG,EH,ER,ES,ET,FI,FJ,FK,FM,FO,FR,GA,GB,GD,GE,GF,GG,GH,GI,GL,GM,GN,GP,GQ,GR,GS,GT,GU,GW,GY,HK,HM,HN,HR,HT,HU,ID,IE,IL,IM,IN,IO,IQ,IR,IS,IT,JE,JM,JO,JP,KE,KG,KH,KI,KM,KN,KP,KR,KW,KY,KZ,LA,LB,LC,LI,LK,LR,LS,LT,LU,LV,LY,MA,MC,MD,ME,MF,MG,MH,MK,ML,MM,MN,MO,MP,MQ,MR,MS,MT,MU,MV,MW,MX,MY,MZ,NA,NC,NE,NF,NG,NI,NL,NO,NP,NR,NU,NZ,OM,PA,PE,PF,PG,PH,PK,PL,PM,PN,PR,PS,PT,PW,PY,QA,RE,RO,RS,RU,RW,SA,SB,SC,SD,SE,SG,SH,SI,SJ,SK,SL,SM,SN,SO,SR,ST,SV,SX,SY,SZ,TC,TD,TF,TG,TH,TJ,TK,TL,TM,TN,TO,TR,TT,TV,TW,TZ,UA,UG,UM,US,UY,UZ,VA,VC,VE,VG,VI,VN,VU,WF,WS,YE,YT,ZA,ZM,ZW]",
"county": "string",
"phoneNumber": "string",
"postalCode": "string",
"recipient": "string",
"stateOrProvince": "string"
}
}
Update Payment Info Request Schema:
{ /* UpdatePaymentInformation */
"creditCard": { /* CreditCard */
"accountHolderName": "string",
"billingAddress": { /* BillingAddress */
"addressLine1": "string",
"addressLine2": "string",
"city": "string",
"country": "CountryCodeEnum : [AD,AE,AF...]",
"county": "string",
"firstName": "string",
"lastName": "string",
"postalCode": "string",
"stateOrProvince": "string"
},
"brand": "string",
"cardNumber": "string",
"cvvNumber": "string",
"expireMonth": "integer",
"expireYear": "integer"
}
}

Covert JSON from One Format to Other Format?

I have following JSON
"ID": "234AS",
"Name": "SynchronousMate",
"Type": "Node",
"SubType": "SubNode",
"Dynamic": "Yes",
"DisplayName": "Sync",
"Direct": "Yes",
"Category": "IT",
"Properties": {
"Property": [
{
"Name": "A",
"Value": "Anant"
},
{
"Name": "B",
"Value": "Bharat"
},
{
"Name": "C",
"Value": "Cynus"
},
{
"Name": "D",
"Value": "Dynana"
},
{
"Name": "E",
"Value": "Elegant"
},
{
"Name": "Bank",
"Value": "BOB"
},
{
"Name": "ipAddress",
"Value": "101.90.34.12"
},
{
"Name": "siteName",
"Value": "BRS-WDM-PSS-X7A6"
},
{
"Name": "Longitude",
"Value": 0
},
{
"Name": "FullName",
"Value": "network:10.254.0.46"
},
{
"Name": "NumberOfShelves",
"Value": 0
},
{
"Name": "GEOCODE.Latitude",
"Value": 0
}
]
},
"Properties": ""
}
..............................
..............................
How to convert this JSON to like this
{
"ID": "234AS",
"Name": "SynchronousMate",
"Type": "Node",
"SubType": "SubNode",
"Dynamic": "Yes",
"DisplayName": "Sync",
"Direct": "Yes",
"Category": "IT",
"A" : "Anant",
"B" : "Bharat",
"C" : "Cynus",
"D" : "Dynana",
"E" : "Elegant",
"Bank" : "BOB",
"ipAddress" : "101.90.34.12",
"siteName" : "BRS-WDM-PSS-X7A6",
"Longitude" : ""0",
"FullName" : "network:10.254.0.46",
"NumberOfShelves" : 0,
"GEOCODE.Latitude" : 0
},
............................
............................
You can loop over properties and create a Map with key the value of Name and as value the value of Value.
In simple terms, Get/Store the Property JsonArray. Then iterate it putting the
elements of array in Map. And then add the map to the other half of JSON.

Categories

Resources