Skip to main content

Contacto con los hoteles

5 Tareas

30 minutos

Visible to: All users
Avanzado Pega Platform 8.6 Español

Escenario

FSG quiere asegurarse de que cada hotel con el que tiene acuerdos para reservar habitaciones para eventos sea tratado de la forma más equitativa posible. FSG quiere identificar los hoteles que se encuentran en un radio de 5 millas (u 8 kilómetros) de un evento en el último mes y a los que no se les ha pedido que reserven un bloque de habitaciones para un evento. FSG tiene previsto usar esta información para enviar un correo electrónico a dichos hoteles e informarles que FSG le da prioridad a la solicitud de habitaciones a la mayor brevedad posible.

La siguiente tabla incluye las credenciales que necesita para completar el reto.

Función Nombre de usuario Contraseña
Admin admin@booking reglas

Cree una consulta que genere la información de los contactos del hotel de acuerdo con los requerimientos del negocio. Exponga cualquier propiedad que no esté expuesta actualmente y que el reporte emita o que deba exponerse para realizar las uniones.

Debe iniciar su propia instancia de Pega para completar este Título del desafío.

La inicialización puede demorar hasta 5 minutos. Le pedimos que tenga paciencia.

Tareas detalladas

1 Identificar opciones de diseño

Un enfoque de fuerza bruta puede identificar cada uno de los eventos que se lleva a cabo en el último mes y posteriormente iterar la lista de eventos. Para cada evento, capture los pyGUID de los hoteles contactados. A continuación, la página de datos D_AddressesWithinDistance buscará los registros IsFor=Hotel en un radio de 5 millas del lugar donde se lleva a cabo el evento. A continuación, se capturan los valores de referencia en el conjunto de resultados D_AddressesWithinDistance. Cualquier referencia que no esté en la lista de los pyGUID de FSG-Data-Hotel se mantiene; cualquier referencia que coincida con un pyGUID de FSG-Data-Hotel se ignora. Toda referencia restante se usa para buscar un registro de FSG-Data-Hotel. Capture la información de contacto (pyFirstName, pyLastName y pyEmail1) de cada FSG-Data-Contact al que se hace referencia.

Un problema de este enfoque iterativo es que es posible que se lleven a cabo varios eventos en el mismo lugar en el último mes. Además, dos lugares pueden estar en un radio de 10 millas (16 kilómetros) el uno del otro, lo que significa que puede producirse una superposición en un radio de 5 millas (8 kilómetros) de cada lugar. Es posible que se haya contactado al mismo hotel para eventos diferentes en el último mes; un solo contacto es suficiente para descartar dicho hotel. La meta es encontrar hoteles que no hayan sido contactados.

Hotels in/out of range of venues

La página de datos D_AddressesWithinDistance tiene una actividad que invoca una regla Connect-SQL. La regla contiene una consulta basada en la fórmula de Haversine. La segunda subselección de la tabla, la que se denomina “p” en la fórmula de Haversine, pide actualmente las coordenadas de una sola ubicación.

Por otra parte, una subselección de la tabla puede enumerar las latitudes y longitudes de cada lugar para cada evento que se haya llevado a cabo en el último mes. En lugar de unirse a una fila, como se hace ahora, la unión puede moverse a través de varias coordenadas de direcciones de lugares.

Definición actual de la subselección de la table “p”

JOIN ( 

SELECT {AddressPage.Latitude Decimal } AS latpoint,

{AddressPage.Longitude Decimal } AS longpoint,

{AddressPage.Distance Decimal } AS radius,

{AddressPage.pyNote Decimal } AS distanceunit,

{AddressPage.IsFor } AS isfor

) AS p ON p.isfor = z.isfor

Definición posible de la subselección de la tabla “p”

JOIN (

SELECT VenueAddress.latitude AS latpoint,  VenueAddress.longitude AS longpoint

FROM pegadata.p_fsg_data_address AS VenueAddress

INNER JOIN pegadata.pc_fsg_booking_work AS BookEvent

ON BookEvent.{exposedVenueGUID}= VenueAddress.reference

AND BookEvent.pxobclass = 'FSG-Booking-Work-BookEvent

WHERE BookEvent.{exposedEventStartDt}  -- is within the past month

) AS p ON 1 = 1'

Nota: Se eliminan Radius, distanceunit e isfor porque pueden definirse en otra parte.

La modificación de la fórmula de Haversine no filtra las direcciones de los hoteles con los que se haya contactado durante el último mes. Esta modificación debe realizarse en otro lugar de la consulta.

La solución requiere la implementación de la siguiente expresión: 

HotelAddressesNotContacted ::= AllAddressesWithinDistance EXCEPT HotelAddressesContacted

Las opciones son las siguientes:

  • (A) Almacenar el historial de lugares y hoteles contactados en el esquema CustomerData.
  • (B) Buscar una forma de “insertar” listas de claves de lugares y hoteles (pyGUID) en una consulta Connect-SQL en la que cada lista de los pyGUID se obtiene del esquema PegaData.

En un futuro lanzamiento de Pega Platform™, es posible que no se permitan las consultas de reglas Connect-SQL frente a las tablas del esquema PegaData en las que estén presentes columnas específicas de Pega Platform, las que empiezan con px, py o pz. La tabla FSG-Data-Address se define en el esquema CustomerData y no tiene columnas específicas de Pega Platform. Como resultado, se puede hacer referencia a dicha tabla en las consultas de reglas Connect-SQL. Sin embargo, la tabla de pozo de trabajo para los tipos de caso de la aplicación de reservas no debe consultarse mediante las reglas Connect-SQL porque dicha tabla contiene columnas, como pzInsKey y pzPvStream.

El reto con el enfoque (A) es que el almacenamiento de los pyGUID y date-times históricos en el esquema CustomerData requiere trabajo extra porque es el equivalente a usar una tabla temporal. El enfoque (A) también podría dar lugar a la pérdida de la integridad de los datos, ya que la misma información se almacenaría en varias ubicaciones.

Por otro lado, con el enfoque (B), es posible insertar SQL usando una sintaxis, como: {Asis: property-name}. El siguiente ejemplo es una expresión revisada de HotelAddressesNotContacted.

HotelAddressesNotContacted ::= AllAddressesWithinDistance WHERE Reference NOT IN ({Asis:D_HotelsContacted.AsisExpression })

A continuación, se muestra un ejemplo del valor de propiedad AsisExpression.

'5de1376c-aa4d-41dc-acd2-c5cd44eb3f61','d45d7130-471b-4138-87f2-efb689983ee2','6584d826-06e6-4c47-b4ee-2a9c6cd62e7d','f7620988-c687-474f-8b3d-27bb0371680e','6681b769-f2de-45cb-aa7a-e89526765f34','44eb05f1-9c16-48e7-b363-7eaeb63e08e2'

El número de los pyGUID del hotel debe ser lo suficientemente pequeño como para que toda la declaración SQL no exceda la longitud máxima permitida de la base de datos. Si bien el ejemplo anterior puede parecer largo debido a la longitud de 32 caracteres hexadecimales de un GUID, es difícil exceder la longitud máxima permitida de una declaración SQL. Por ejemplo, la longitud máxima de una declaración SQL en PostgresSQL es ahora de 2.147.483.648 caracteres o aproximadamente 2 GB.

Una página de datos D_HotelsContacted que se aplica a FSG-Data-Address podría modelarse después de D_AddressesWithinDistance. Para ello, la actividad Connect_SQL_pr_fsg_data_address se copia primero en Connect_SQL_HotelsNotContacted

La actividad Connect_SQL_HotelsNotContacted usa primero una página de datos D_HotelsContacted que invoca una definición de reportes que obtiene la lista de los GUID de los hoteles contactados en el último mes. Después, la página de datos D_HotelsContacted procesa posteriormente la lista de páginas de pxResults() para construir el valor de una propiedad llamada AsisExpression.

La solución para derivar AllAddressesWithinDistance (de un lugar de eventos) requiere un tratamiento similar. La meta es resolver el lado derecho de la siguiente expresión. En este caso, quiere usar “IN” en lugar de “NOT IN”.

AllAddressesWithinDistance ::= SELECT latitude AS latpoint, longitude AS longpoint FROM pegadata.p_fsg_data_address WHERE Reference IN ({D_VenuesUsed.AsIsExpression})

Este valor AsIsExpression es la secuencia de valores de pyGUID de la dirección del lugar asociado con los eventos de FSG que se llevaron a cabo en el último mes. El siguiente valor es un ejemplo del valor de propiedad D_VenuesUsed.AsisExpression . El valor D_VenuesUsed.AsisExpression es más corto que el valor D_HotelsContacted.AsisExpression porque se pueden contactar varios hoteles por evento.

'7e99dbc3-4e54-4419-a15f-f2ca1f0be265','b7206d9a-36d9-45c2-9849-c5fcd995dadb','d8825749-e2fb-46b3-97aa-3ead12b89584'

2 Exponer propiedades

 

Event.StartDT

Como se describió anteriormente, las páginas de datos que derivan los valores de AsIsExpression de los pyGUID de la dirección del lugar y del hotel tienen como origen una definición de reportes. Estas definiciones de reportes, VenueAddressLatLong y HotelAddressLatLong, solo deben examinar los eventos que comenzaron en el mes anterior. Exponer la propiedad .Event.StartDT del caso BookEvent como una propiedad a nivel de caso es un uso simple de Optimize for reporting (Optimizar para creación de reportes). El resultado se muestra a continuación.

Book Event Join

Una parte del filtro dentro de cada definición de reportes es: EVENT.Event.StartDT mayor que el mes anterior.

.RoomsRequest.HotelGUID

Actualmente, el GUID de cada hotel contactado existe dentro del grupo de campos abstracto RoomsRequest de cada caso RoomsRequest. Recuerde que su grupo de campos se comparte entre las aplicaciones de Hotel y HotelProxy a través de un componente. A diferencia del caso BookEvent que tiene una propiedad VenueGUID expuesta, el caso RoomsRequest no tiene una propiedad .HotelGUID expuesta a nivel de caso.

La propiedad HotelGUID expuesta debe residir en la clase FSG-Booking-Work-RoomsRequest, no es la clase FSG-Hotel-Work-RoomsRequest de la aplicación de hotel incorporada. Es simple definir una propiedad HotelGUID en FSG-Booking-Work-RoomsRequest. El valor de dicha propiedad se puede establecer usando una expresión Rule-Declare-Expression definida como .HotelGUID = .RoomsRequest.HotelGUID.

3 Crear páginas de datos

En la tarea anterior, se mencionaron las definiciones de reportes VenueAddressLatLong y HotelAddressLatLong. La forma en que se definen dichas definiciones de reportes se puede ver en la solución proporcionada. Y como debe ser, las condiciones de filtro con la pestaña Query (Consulta) son idénticas.

Debido a que el caso RoomsRequest es un caso hijo de BookEvent, la definición del alias EVENT sería diferente para las dos definiciones de reportes.  Recuerde que FSG-Data-Address hace referencia a FSG-Data-Location, no a un caso.

Definición de reportes Alias Clase Definición
VenueAddressLatLong EVENTO FSG-Booking-Work-BookEvent Reference = EVENT.VenueGUID
HotelAddressLatLong HABITACIONES FSG-Booking-Work-RoomsRequest .Reference = ROOMS.RoomsRequest.HotelGUID
  EVENTO FSG-Booking-Work-BookEvent ROOMS.pxCoverInsKey = EVENT.pzInsKey

El resto de la solución se resume en la siguiente tabla.  Tenga en cuenta que el data transform de respuesta, GenerateAsisExpressionFromAddressReference, establece pyNote.

Página de datos Definición de reportes Data transform de respuesta
D_HotelsContacts HotelAddressLatLong GenerateAsisExpressionFromAddressReference
D_VenueUsed VenueAddressLatLong GenerateAsisExpressionFromAddressReference

4 Crear la regla Connect-SQL

El último paso es definir las reglas Connect-SQL de HotelsNotContacted. El contenido de la pestaña Browse (Examinar) se muestra a continuación.

Tenga en cuenta que la propiedad pyNote de AdddressPage se decide mediante la expresión ternaria: (param.dist_unit = "km" ? "111.045" : "69.407").

  • SELECT
    pyGUID AS "pyGUID",
    Reference AS "Reference", IsFor AS "IsFor", Street AS "Street", City AS "City", State AS "State", PostalCode AS "PostalCode", Country AS "Country", Latitude AS "Latitude", Longitude AS "Longitude", Distance AS "Distance"
    FROM (
    SELECT z.pyguid AS pyGUID,
    z.reference AS Reference,
    z.isfor AS IsFor,
    z.street AS Street,
    z.city AS City,
    z.state AS State,
    z.postalcode AS PostalCode,
    z.country AS Country,
    z.latitude AS Latitude,
    z.longitude AS Longitude, {AddressPage.pyNote Decimal }
    * DEGREES(ACOS(COS(RADIANS(p.latpoint))
    * COS(RADIANS(z.latitude))
    * COS(RADIANS(p.longpoint - z.longitude))
    + SIN(RADIANS(p.latpoint))
    * SIN(RADIANS(z.latitude)))) AS Distance
    FROM {Class:FSG-Data-Address} AS z
    JOIN (
    SELECT latitude AS latpoint, longitude AS longpoint
    FROM {Class:FSG-Data-Address}
    WHERE reference IN ({Asis:D_VenuesUsed.pyNote}) ) AS p ON 1 = 1 ) AS d
    WHERE distance <= {AddressPage.Distance Decimal }
    AND reference NOT IN ({Asis:D_HotelsContacted.pyNote})
    AND isFor = 'Hotel'
    ORDER BY distance
    LIMIT 15

5 Confirme su trabajo

Para demostrar que la solución funciona, es necesario que haya al menos dos hoteles en el radio especificado de un lugar. A uno de los hoteles se le pide que proporcione habitaciones. Al segundo hotel no se le pide que proporcione habitaciones. Cuando se ejecuta la consulta, el segundo hotel aparece en el conjunto de resultados.

  1. Ubique la actividad Code-Pega-List Connect_SQL_HotelsNotContacted.
  2. Click Actions > TraceHaga clic en (Permitir acceso a la ubicación)
  3. Haga clic en Actions > Run (Permitir acceso a la ubicación).
  4. Introduzca 5 como la distancia y mi como dist_unit.
  5. Opcional: Introduzca 8 como la distancia y km como dist_unit.

Para cada página en D_Hotels, invoque la página de datos D_Hotel Lookup usando “reference” como el parámetro pyGUID. La consulta devuelve la dirección de los hoteles que no se contactaron. La identificación del hotel y del contacto del hotel requiere la iteración de la lista de páginas de pyTempListPage.pxResults().



Disponible en la siguiente misión:

If you are having problems with your training, please review the Pega Academy Support FAQs.

¿Le ha resultado útil este contenido?

¿Quiere ayudarnos a mejorar este contenido?

We'd prefer it if you saw us at our best.

Pega Academy has detected you are using a browser which may prevent you from experiencing the site as intended. To improve your experience, please update your browser.

Close Deprecation Notice