palantir foundry - Slate - creando una función en TypeScript para filtrar y devolver un objeto con el valor máximo de una propiedad
echa un vistazo a NUEVA PREGUNTA RELACIONADA:
Quiero filtrar un conjunto de objetos para obtener el número más grande de una columna.
No sé cómo resolverlo. Intento con max, etc. Pero creo que es un problema de habilidad. Aquí está mi código hasta ahora:
@Function()
public async largestNumber(): Promise<Long> {
const objResult = Objects.search()
.dataMain()
.filter(data_column => data_column.lngPlanningNumber.range. )
.gt(100)
.take(1);
return objResult.max();
}
Esta función devuelve objetos con valores NULL para la propiedad lngPlanningNumber, los cuales me gustaría filtrar.
ACTUALIZACIÓN:
La propiedad 'isNotNull' no existe en el tipo 'INumericPropertyFilter'.
para
.filter(data_column => data_column.lngPlanningNumber.isNotNull()) // filter out NULL values
La propiedad 'take' no existe en el tipo 'Promise
'.
para
.take(1);
NUEVA PREGUNTA RELACIONADA: mi código
@Function()
@Edits(XYZ)
public async fctLargestNumber(): Promise<XYZ[]> {
const maxObject = Objects.search()
.xYZ()
// .groupBy(e => e.lngPlanningNumber.topValues())
// .segmentBy(e => e.lngPlanningNumber.topValues())
// .filter(data_column => data_column.lngPlanningNumber.byIRanges({ min: 100000, max: 999999 }))
.orderBy(data_column => data_column.lngPlanningNumber.desc())
.takeAsync(1)
//.valueOf();
return maxObject;
no, recibo una salida como esta:
[
{"typeId":"my-collection","primaryKey":{"id_pk":"ee1b1ac1-008b-479b-a748-01e8702927c9"}}
]
La pregunta ahora es, ¿cómo puedo recibir mi resultado?
- ¿Cómo puedo seleccionar el valor de la clave principal?
- ¿Cómo puedo buscar el resultado solicitado (entero) de la columna "lngPlanningNumber" que pertenece a este id?
La Promesa me hace sentir curiosidad. Gracias
Respuesta #1
Puedo confirmar que para las propiedades numéricas solo encontrarás los filtros exactMatch y range. Los valores nulos deberían eliminarse automáticamente al usar estos filtros.
Siempre puedes intentar hacer un rango que abarque todos tus valores:
const flight: ExampleDataFlight[] = Objects.search().exampleDataFlight()
.filter(row => row.taxiOut.range().gte(-99999).lte(99999))
.all();
Con respecto a la propiedad take(1), requiere ordenar para que aparezca. Aquí hay un ejemplo donde usé aleatoriamente airtime para forzar el orderBy, si solo quieres hacer take(1) puedes usar cualquier propiedad aquí.
const flight: ExampleDataFlight[] = Objects.search().exampleDataFlight()
.filter(row => row.taxiOut.range().gte(-99999).lte(99999))
.orderBy(row => row.airTime.asc())
.take(1);
Respuesta #2
Puedes lograr esto filtrando el conjunto de objetos, ordenando de forma descendente la columna deseada y luego take(1) o takeAsync(1).
@Function()
public async largestObject(): Promise<DataMain[]> {
return Objects.search()
.dataMain()
.filter(data_column => data_column.lngPlanningNumber.isNotNull())
..orderBy(data_column => data_column.lngPlanningNumber.desc())
. takeAsync(1);
}
