maha icon indicating copy to clipboard operation
maha copied to clipboard

Maha Validate query request before actually query

Open YixianNiu opened this issue 5 years ago • 2 comments

Hi, We are making a API endpoint which checks whether a request query to maha is valid or not. The query looks like this: `{ "cube":"fake_cube", "selectFields":[ { "field":"fake ID" } ], "filterExpressions":[ { fake filter },

], "sortBy":[ { "field":"fake Id", "order":"Desc" } ], "rowsPerPage":10 }`

We want to check whether the field, cube , filter etc are right. Is there any method that can validate the request before process the query? Thanks!

YixianNiu avatar May 11 '20 20:05 YixianNiu

Hello @YixianNiu take look at the test at com/yahoo/maha/core/query/oracle/OracleQueryGeneratorTest.scala. All you can do is DeSer input request like following and try generating the Request Model for given json. It will return the TRY(Request Model).

val requestOption = ReportingRequest.deserializeSyncWithFactBias(jsonString.getBytes(StandardCharsets.UTF_8), AdvertiserSchema)
val registry = defaultRegistry
val requestModel = RequestModel.from(requestOption.toOption.get, registry)
assert(requestModel.isSuccess, requestModel.errorMessage("Building request model failed"))

test("successfully generate sync force dim driven dim only query with filters and order by and row count") { val jsonString = s"""{ "cube": "performance_stats", "selectFields": [ { "field": "Campaign ID", "alias": null, "value": null }, { "field": "Ad Group ID", "alias": null, "value": null }, { "field": "Advertiser Status", "alias": null, "value": null }, { "field": "Campaign Name", "alias": null, "value": null }, { "field" : "Source", "value" : "2", "alias" : "Source"} ], "filterExpressions": [ {"field": "Advertiser ID", "operator": "=", "value": "12345"}, {"field": "Day", "operator": "between", "from": "$fromDate", "to": "$toDate"} ],"sortBy": [ {"field": "Campaign ID", "order": "Asc"} ], "paginationStartIndex":0, "rowsPerPage":100, "forceDimensionDriven": true, "includeRowCount": true }"""

val requestOption = ReportingRequest.deserializeSyncWithFactBias(jsonString.getBytes(StandardCharsets.UTF_8), AdvertiserSchema)
val registry = defaultRegistry
val requestModel = RequestModel.from(requestOption.toOption.get, registry)
assert(requestModel.isSuccess, requestModel.errorMessage("Building request model failed"))

val queryPipelineTry = generatePipeline(requestModel.toOption.get)
assert(queryPipelineTry.isSuccess, queryPipelineTry.errorMessage("Fail to get the query pipeline"))

val result =  queryPipelineTry.toOption.get.queryChain.drivingQuery.asInstanceOf[OracleQuery].asString
val expected = """
                 |SELECT  *
                 |      FROM (SELECT ago2.campaign_id "Campaign ID", ago2.id "Ad Group ID", ao0."Advertiser Status" "Advertiser Status", co1.campaign_name "Campaign Name", '2' AS "Source", Count(*) OVER() TOTALROWS, ROWNUM as ROW_NUMBER
                 |            FROM
                 |               ( (SELECT  campaign_id, advertiser_id, id
                 |            FROM ad_group_oracle
                 |            WHERE (advertiser_id = 12345)
                 |            ORDER BY 1 ASC  ) ago2
                 |          INNER JOIN
                 |            (SELECT /*+ CampaignHint */ id, advertiser_id, campaign_name
                 |            FROM campaign_oracle
                 |            WHERE (advertiser_id = 12345)

pranavbhole avatar May 12 '20 02:05 pranavbhole

Thanks for the info. But why we are using deserializeSyncWithFactBias?

YixianNiu avatar May 13 '20 19:05 YixianNiu