036 instance_ls field set limited

This commit is contained in:
msyu
2024-12-06 20:06:06 +03:00
parent b9826a7a0c
commit b6939ccdab
6 changed files with 71 additions and 25 deletions
+54 -19
View File
@@ -7,22 +7,44 @@
<!---спецификация полей, пригодных для фильтрации (?и сортировки)--->
<cfset this.fieldsSpec={
dt_created={prefix="e", type="date"},
dt_updated={prefix="e", type="date"},
display_name={prefix="e", type="string"},
service_id={prefix="e", type="integer"},
specification_item_id={prefix="e", type="integer"},
contract_id={prefix="d", type="integer"},
specification_id={prefix="i", type="integer"},
svc={prefix="v", type="string"},
is_test={prefix="e", type="boolean"}
"instance_uid"={prefix="inr", type="guid"},
"dt_created"={prefix="inr", type="date"},
"dt_updated"={prefix="inr", type="date"},
"instance_config_dt_created"={prefix="inr", type="date"},
"instance_config_dt_updated"={prefix="inr", type="date"},
"display_name"={prefix="inr", type="string"},
"service_id"={prefix="inr", type="integer"},
"specification_item_id"={prefix="inr", type="integer"},
"contract_id"={prefix="inr", type="integer"},
"specification_id"={prefix="inr", type="integer"},
"svc"={prefix="inr", type="string"},
"code"={prefix="inr", type="string"},
"last_operation"={prefix="inr", type="string"},
"last_operation_uid"={prefix="inr", type="guid"},
"submit_result"={prefix="inr", type="string"},
"operation_dt_start"={prefix="inr", type="date"},
"operation_dt_finish"={prefix="inr", type="date"},
"duration"={prefix="inr", type="numeric"},
"uptime"={prefix="inr", type="numeric"},
"dt_deploy"={prefix="inr", type="date"},
"instance_data"={prefix="inr", type="string"},
"instance_state_uid"={prefix="inr", type="guid"},
"is_deleted"={prefix="inr", type="string"},<!--- not bool --->
"suspended"={prefix="inr", type="string"},<!--- not bool --->
"is_test"={prefix="inr", type="boolean"},
"explained_status"={prefix="inr", type="string"},
"version"={prefix="inr", type="integer"}
}
/>
<cffunction name="get" hint="Список экземпляров сервисов, принадлежащих данному клиенту">
<cfargument name="pageSize" type="string" hint="type:integer" default="100"/>
<cfargument name="page" type="string" hint="type:integer" default="1"/>
<cfargument name="orderBy" type="string" hint="type:string, description:comma-separated list of fields to sort by, example:fld1.ASC,fld2.DESC,fld3.ASC" default=""/>
<cfargument name="orderBy" type="string" hint="type:string, description:comma-separated list of fields to sort by, example:fld1.ASC,fld2.DESC,fld3.ASC (performance not assured on arbitrary sorting)" default=""/>
<cfargument name="fields" type="string" hint="type:string, description:comma-separated list of fields to limit output to, empty string for default field set" default=""/>
<!---сюда можно воткнуть спецификацию полей для сортировки и фильтрации, но только ручками, идея компактного кода еще более отдаляется--->
<!---parse and validate request parameters--->
@@ -30,12 +52,17 @@
<cftry>
<cfset this.helper.validateField(arguments, "pageSize", "integer")/>
<cfset this.helper.validateField(arguments, "page", "integer")/>
<!---мы мирно игнорируем поля, отсутствующие в спецификации, что позволяет не делать исключения для orderBy и т.п.--->
<cfset var filter=this.helper.parseFilterParams(this.fieldsSpec)/>
<!--- <cfset var order=this.helper.parseOrderBy(this.fieldsSpec, arguments.orderBy)/> --->
<!--- <cfset var order=this.helper.parseOrderBy(this.fieldsSpec, arguments.orderBy)/> --->
<cfset var order=this.helper.parseOrderBy(this.fieldsSpec, arguments.orderBy)/>
<cfset local.fields=""/>
<cfloop collection=#this.fieldsSpec# item="fld"><cfoutput>#this.helper.snake2camel(trim(fld))#</cfoutput>
<cfif listFind(arguments.fields, this.helper.snake2camel(trim(fld)))
OR structKeyExists(order,this.helper.snake2camel(trim(fld)))>
<cfset local.fields=listAppend(local.fields,trim(fld))/>
</cfif>
</cfloop>
<cfcatch type="invalidParamValue">
<cfreturn representationOf(this.helper.formatBadRequestError(cfcatch)).withStatus(400)/>
@@ -52,6 +79,9 @@
--->
<cfquery name="local.qRead" result="local.result">
select
<cfif listLen(local.fields)>#local.fields#<cfelse>*</cfif>
from (
select
<m:field_set titleMapOut="local.titleMap" lengthOut="local.fieldCount">
<m:field>e.instance_uid::text as instance_uid</m:field>
<m:field>e.display_name</m:field>
@@ -74,7 +104,7 @@
<m:field>(select io.submit_result from instance_operation io where io.instance_uid=e.instance_uid order by dt_submit desc limit 1) as submit_result</m:field><!--- *** последняя операция может быть неуспешной, и даже не отправленой --->
<m:field>(select to_char(io.dt_start, 'YYYY-MM-DD"T"HH24:MI:SS.FF3TZHTZM') from instance_operation io where io.instance_uid=e.instance_uid order by dt_submit desc limit 1) as operation_dt_start</m:field>
<m:field>(select to_char(io.dt_finish, 'YYYY-MM-DD"T"HH24:MI:SS.FF3TZHTZM') from instance_operation io where io.instance_uid=e.instance_uid order by dt_submit desc limit 1) as operation_dt_finish</m:field>
<m:field>(select extract('epoch' from coalesce(io.dt_finish,CURRENT_TIMESTAMP)- io.dt_start) from instance_operation io where io.instance_uid=e.instance_uid order by dt_submit desc limit 1) as duration</m:field>
<m:field>(select round(extract('epoch' from coalesce(io.dt_finish,CURRENT_TIMESTAMP)- io.dt_start),1) from instance_operation io where io.instance_uid=e.instance_uid order by dt_submit desc limit 1) as duration</m:field>
<m:field>(select case when io.is_successful then extract('epoch' from CURRENT_TIMESTAMP - coalesce(io.dt_finish,CURRENT_TIMESTAMP)) else 0 end from instance_operation io where io.instance_uid=e.instance_uid order by dt_submit desc limit 1) as uptime</m:field>
<m:field>(select io.dt_finish from instance_operation io where io.instance_uid=e.instance_uid AND io.is_successful AND io.operation='create' order by dt_submit desc limit 1) as dt_deploy</m:field>
<!--- *** не то же самое, что в DETAIL view! --->
@@ -84,8 +114,8 @@
<m:field>(select st.instance_data->>'isDeleted' from instance_state st where st.instance_uid=e.instance_uid order by version desc limit 1) as is_deleted</m:field>
<m:field>(select st.instance_data->>'suspended' from instance_state st where st.instance_uid=e.instance_uid order by version desc limit 1) as suspended</m:field>
<!--- <m:field>(select st.instance_data->>'grafanaUrl' from instance_state st where st.instance_uid=e.instance_uid order by version desc limit 1) as grafana_url</m:field> --->
<m:field>(
case
<m:field>
(case
when
(select st.instance_data->>'isDeleted' from instance_state st where st.instance_uid=e.instance_uid order by version desc limit 1) = 'true' then 'deleted'
when
@@ -97,7 +127,8 @@
when
not exists (select * from instance_state st where st.instance_uid=e.instance_uid) then 'not created'
else null end
) as explained_status</m:field><!--- ******** (сделать тест кейсы) еще ситуация, когда не завершена операция create, но есть первый стейт --->
) as explained_status
</m:field><!--- ******** (сделать тест кейсы) еще ситуация, когда не завершена операция create, но есть первый стейт --->
<m:field>(select max(version) from instance_state st where st.instance_uid=e.instance_uid) as version</m:field>
</m:field_set>
@@ -109,10 +140,14 @@
join svc v on (e.service_id=v.svc_id)
where s.specification_id=<cfqueryparam cfsqltype="cf_sql_integer" value=#arguments.specificationId#/><!--- *** make project entity --->
<!--- u.usr_id=<cfqueryparam cfsqltype="cf_sql_integer" value=#arguments.usrId#/> --->
<m:filter_build filter=#filter#/>
order by <m:order_build sortCollection=#this.helper.parseNumericOrder(local.titleMap, arguments.orderBy)# fieldCount=0/><!---no sort length limit--->
) inr
where 1=1 <m:filter_build filter=#filter#/>
<!--- order by <m:order_build sortCollection=#this.helper.parseNumericOrder(local.titleMap, arguments.orderBy)# fieldCount=0/> ---><!--- из-за нефиксированного числа колонок труднее становится использовать цифровую нотацию --->
order by <m:order_build sortCollection=#order# fieldCount=0/><!---no sort length limit--->
limit #maxrows#
</cfquery>
<!---<cfdump var=#local.qRead#/><cfabort/> --->
<cfquery name="local.qTotal">
select count(*) as cnt