Los diagramas de estado permiten controlar la manera como un proyecto se quiere comportar, es decir, que actividades o acciones realice ante determinados eventos. en este capítulo aprenderemos como diagramar los estados de un proyecto y como codificar o programar en bloques estos diagramas.

Los diagramas de estado definen el comportamiento de un proyecto, o sea, como queremos que reaccione el programa o proyecto frente a determinados eventos. Para hacer esto, es necesario desarrollar o crear un diagrama de estados. Antes de ver un ejemplo práctico de esto, es necesario conocer los componentes, con los que se pueden construir los diagramas de estado

 

 

Eventos.

 

Los eventos son sucesos o acontecimientos que se dan en la tarjeta microbit. Por ejemplo: cuando es presionado un botón o cuando es agitada la tarjeta o cuando un valor o expresión es verdadero o cuando un temporizador finalizo, etc. Los eventos más comunes en la tarjeta microbit son:

Agitar la tarjeta.

Presionar el botón "A".

Presionar el botón "B".

Presionar los botones "A y B" a la vez.

Temporizador termino.

 

 

Estado.

 

Es una condición o momento en el que se encuentra el programa o proyecto. Por ejemplo, en un proyecto de un “tocador de música”, un estado puede ser, cuando esta ejecutado o tocando una música, otro estado puede ser cuando esta pausado, otro estado puede ser cuando está parado, listo para comenzar a tocar una música, etc. Los estados se representan con un rectángulo arredondeado como muestra la siguiente figura:

 


 

 

 

Hay otro estilo para representar los estados en un diagrama, en forma de circulo como mostrado en la siguiente figura:

 


 

 

 

Para indicar el estado inicial en un diagrama, se usa un elemento como el siguiente:

 


 

 

 

Para indicar el estado final en un diagrama, se usa un elemento como el siguiente:

 


 

 

 

 

 

Transiciones.

 

Una transición es el cambio de un estado para otro y se representa con una línea continua, dirigida de un estado a otro, es decir, el estado de origen y el estado destino. La siguiente son formas de dibujar una transición:

 


| Clique na imagem para ampliar |

 

 

 

Acciones.

 

Acciones son bloques que ejecutan alguna tarea o proceso en la tarjeta microbit. Son muy similares a las actividades en los diagramas de actividad. Las acciones en los diagramas de estado se representan con texto y se antepone el carácter: “/”, como muestra la siguiente figura:

 


 

 

 

 

EJEMPLO PRACTICO DE DIAGRAMA DE ESTADOS.

 

Un ejemplo práctico de estados, puede ser un proyecto donde tengamos que ejecutar varios proyectos en un mismo programa. Así, supongamos que tenemos 3 proyectos llamados:

Linterna.

Emoji.

Barrera.

Entonces, tenemos 3 estados, uno para la linterna, otro para el emoji y otro para la barrera. El diagrama inicial puede ser como el mostrado en la siguiente figura:

 


| Clique na imagem para ampliar |

 

 

Ahora, es necesario definir el comportamiento en cada estado. Así, cuando linterna, los botones: "A y B", prenden y apagan la linterna, respectivamente. Cuando emoji, los botones: "A y B", mostraran una cara feliz y otro tiste, respectivamente. Cuando barrera, los botones: "A y B", indicaran si puedes continuar o si debes detenerte, respectivamente.

Para cambiar entre estados, es necesario agitar la tarjeta. Inicialmente, el programa comenzara con el proyecto: “Linterna”. Si la tarjeta microbit es agitada, entonces pasara al proyecto: “Emoji”. Si vuelve a ser agitada, pasara al proyecto: "barrera". Si vuelve a ser agitada, volverá al proyecto: "Linterna" y así, continuará repitiendo la misma secuencia. Para hacer la explicación de los diagramas de estado, más didáctica, vamos a desarrollar primero esta parte, así será mejor comprendida. El siguiente es el diagrama de estado para lo explicado hasta aquí.

 


| Clique na imagem para ampliar |

 

 

Para ver el funcionamiento del cambio de estado, he agregado un bloque: “mostrar número”, y así ver su funcionamiento. El programa para lo visto hasta aquí seria así:

 


| Clique na imagem para ampliar |

 

 

Cuando se programan diagramas de estado, es necesario crear una variable llamada: “estado” y una función llamada: “maquina”. Es necesario que, por cada estado, haya un bloque: “si no, si entonces”. El programa trabaja así: Cuando es agitada la tarjeta, se llama el siguiente bloque:

 


 

 

 

Dentro de este bloque, es llamada la función: “llamada maquina” y se le da un parámetro de texto con el valor: “AGITO”. Así, dentro de la función: “llamada maquina” es evaluada la variable: “estado” y dependiendo del estado en que se encuentre se hace la transición al siguiente estado, con el bloque: “fijar a”

 


 

 

 

En cada subproyecto, los botones "A y B" actuaran o se comportaran como deseamos. Para describir este comportamiento en el diagrama de estados, usamos: "las líneas de transición". El diagrama de estado, con los eventos de los botones: “A y B”, sería como el siguiente:

 


| Clique na imagem para ampliar |

 

 

En el anterior diagrama se describen los eventos, pero están faltando las acciones que se deben ejecutar en cada evento. El siguiente diagrama, describe las acciones a ejecutar en cada estado:

 


| Clique na imagem para ampliar |

 

 

Observa, como dependiendo del subproyecto, el evento del botón: "A y B", se comportan de una manera diferente. Esto se logra, gracias al bloque: "si no, si entonces" y a la variable: "estado", la cual se encarga de saltar al correspondiente subproyecto, llamando la función correspondiente. Una técnica en diagrama de estados es crear una función por cada estado y así, dependiendo del valor de la variable: “estado”, se llamará la apropiada función. Dentro de cada una de estas funciones, hay otros bloques: "si no, si entonces", los cuales se encargan de evaluar, cual EVENTO fue el que se acabó de realizar. Para entender cómo se procesan los eventos, haremos un programa para ver esto:

 

 


 

 

 

 


 

 

 

 

 


 

 

 

 


 

 

 

Para probar el anterior programa, en el bloque: “al iniciar”, inicialice la variable: “estado” con un valor como: “Linterna o Emoji o Barrera”. Si desea puede mostrar un numero en pantalla y así, saber en qué estado esta, como mostrado en la siguiente imagen:

 


 

 

 

Ahora, es necesario que tanto, las transiciones hacia otros estados y las acciones ejecutadas en cada estado estén juntas, para que el programa trabaje correctamente. Hemos visto estos 2 procesos independientemente, con fines de comprender como funciona cada uno, pero en un diagrama de estados completo, estas 2 características deben estar juntas. Entonces el diagrama completo para el proyecto que estamos haciendo seria como el siguiente:

 

 


| Clique na imagem para ampliar |

 

 

Al codificar o escribir en bloques, el diagrama de estado visto, da como resultado un programa similar al siguiente:

 


| Clique na imagem para ampliar |

 

 

 


 

 

 

 


 

 

 

 


 

 

 

 


 

 

 

Resumiendo: los eventos llaman a función: "llamada Maquina", la cual recibe como parámetro un texto indicando el evento. Podemos notar que, dentro de esta función, primero evaluamos el estado y llamamos la respectiva función, pasando como parámetro el evento. Luego evaluamos si se ajito la tarjeta microbit, o si se presionó el botón: "A o B" y se ejecutan las respectivas acciones y transiciones. La siguiente imagen muestran las figuras que se visualizaran dependiendo del estado y del botón presionado:

 


| Clique na imagem para ampliar |

 

 

El ejemplo visto, nos da una idea de cómo funcionan los estados y poder hacer proyectos interesantes.

 

 

SEMAFORO CON BOTON PEATONAL.

 

Un ejemplo que demuestra el comportamiento de un proyecto puede ser un "semáforo" con botonera. Estos semáforos normalmente son instalados en calles donde los peatones no tienen una frecuencia constante y solo de vez en cuando es necesario colocar el semáforo en rojo, para que así, los peatones puedan pasar la calle. Así, el semáforo normalmente siempre esta verde y cuando es presionado el botón "A", se dispara un temporizador con un tiempo de 10 segundos. Cuando este temporizador llegue al final, se dispara un evento: TIMER, el cual hace la transición para el estado: "Amarillo" y apaga la luz verde y prende la luz amarilla. La variable: “timer” es cargada con 3 segundos. Transcurrido ese tiempo, se dispara el evento: TIMER, apagando la luz amarilla y prendiendo la luz roja. También, dispara el temporizador: timer, el cual finaliza después de 20 segundos y genera el evento: TIMER, el cual hace la transición para el estado: "verde". Note que, en esta transición, no se carga el timer.

El diagrama de estado para este proyecto sería similar al siguiente:

 

 


| Clique na imagem para ampliar |

 

 

El programa para el diagrama de estado del proyecto semáforo con botonera, sería similar al siguiente:

 


 

 

 

 


 

 

 

 


 

 

 

 


 

 

 

 


 

 

 

 


 

 

 

 


| Clique na imagem para ampliar |

 

 

Note que en el estado: “Verde”, el evento del botón: “A”, tiene una condición para que se pueda ejecutar. La condición es que la variable: “timer”, sea igual a cero. Esto se hace para evitar que el temporizador se siga reprogramando. Observa la siguiente figura:

 


 

 

 

 

SECUENCIAS CON ESTADOS.

 

Con estados es posible hacer secuencias, las cuales pueden ser usadas en procesos industriales, juegos, claves, laberintos, etc. Veamos un ejemplo práctico donde es necesario seguir una serie de eventos en una determinada secuencia para llegar al final con éxito. Observa el siguiente diagrama de estados:

 


| Clique na imagem para ampliar |

 

 

En este diagrama, se han creado 5 pasos o estados con una secuencia de eventos. Si la secuencia se cumple, se va encendiendo una columna de display de LED 5x5. Si todo el proceso se cumple, se mostrará una imagen indicando el éxito de la secuencia. Si la secuencia no se cumple, el display es limpiado. El programa para este diagrama de estados, sería similar al siguiente:

 


| Clique na imagem para ampliar |

 

 

 


| Clique na imagem para ampliar |

 

 

 


| Clique na imagem para ampliar |

 

 

 


| Clique na imagem para ampliar |

 

 

La siguiente imagen muestra las figuras que se mostraran en la pantalla LED:

 


| Clique na imagem para ampliar |

 

 

Finalmente, podemos observar cómo los eventos marcan el momento en que algo tiene que suceder en la tarjeta microbit. También, dependiendo del estado, determinados eventos hacen transición para otros estados, o ejecutan alguna acción, pero no hacen ninguna transición, o algunos eventos no son tratados en el estado.

Tener un diagrama donde podamos determinar el comportamiento que deseamos, hace fácil hacer modificaciones para dar nuevas características al proyecto.

 

 

 

18.953MBMemory Usage44.76msRequest Duration
Joomla! Version5.2.3
PHP Version8.3.20
Identityguest
Response200
Templatecassiopeia
Database
Server
mysql
Version
10.5.22-MariaDB
Collation
latin1_swedish_ci
Conn Collation
utf8mb4_general_ci
$_GET
[]
$_POST
[]
$_SESSION
array:1 [ "joomla" => "***redacted***" ]
$_COOKIE
array:1 [ "c2123392c06423339225f3431360b7e6" => "6vhs81of0h2rmlb37kbuac6f0e" ]
$_SERVER
array:52 [ "USER" => "apache" "HOME" => "/usr/share/httpd" "SCRIPT_NAME" => "/index.php" "RE...
session
array:3 [ "counter" => 2 "timer" => array:3 [ "start" => 1751704875 "last" => 1751704875...
registry
array:3 [ "data" => [] "initialized" => false "separator" => "." ]
user
array:21 [ "id" => 0 "name" => null "username" => null "email" => null "password" => "***r...
  • afterLoad (85.55KB) (303μs)
  • afterInitialise (1.14MB) (3.82ms)
  • afterRoute (123.27KB) (853μs)
  • beforeRenderComponent com_content (100.79KB) (461μs)
  • Before Access::preloadComponents (all components) (33.45KB) (226μs)
  • After Access::preloadComponents (all components) (107.06KB) (398μs)
  • Before Access::preloadPermissions (com_content) (1.57KB) (10μs)
  • After Access::preloadPermissions (com_content) (16.22MB) (22.46ms)
  • Before Access::getAssetRules (id:26962 name:com_content.article.30603) (514.65KB) (1.04ms)
  • After Access::getAssetRules (id:26962 name:com_content.article.30603) (7.38KB) (44μs)
  • afterRenderComponent com_content (446.09KB) (6.78ms)
  • afterDispatch (2.25KB) (62μs)
  • beforeRenderRawModule mod_articles_category (Banco de Circuitos) (358.44KB) (1.65ms)
  • afterRenderRawModule mod_articles_category (Banco de Circuitos) (79.43KB) (373μs)
  • beforeRenderRawModule mod_finder (Busca_inteligente) (5.9KB) (96μs)
  • afterRenderRawModule mod_finder (Busca_inteligente) (64.9KB) (1.23ms)
  • beforeRenderModule mod_articles_category (Banco de Circuitos) (9.27KB) (596μs)
  • afterRenderModule mod_articles_category (Banco de Circuitos) (5.47KB) (71μs)
  • beforeRenderModule mod_finder (Busca_inteligente) (6.64KB) (204μs)
  • afterRenderModule mod_finder (Busca_inteligente) (4.75KB) (52μs)
  • afterRender (289.75KB) (3.87ms)
  • 1 x After Access::preloadPermissions (com_content) (16.22MB) (50.18%)
    22.46ms
    1 x afterRenderComponent com_content (446.09KB) (15.16%)
    6.78ms
    1 x afterRender (289.75KB) (8.65%)
    3.87ms
    1 x afterInitialise (1.14MB) (8.55%)
    3.82ms
    1 x beforeRenderRawModule mod_articles_category (Banco de Circuitos) (358.44KB) (3.68%)
    1.65ms
    1 x afterRenderRawModule mod_finder (Busca_inteligente) (64.9KB) (2.74%)
    1.23ms
    1 x Before Access::getAssetRules (id:26962 name:com_content.article.30603) (514.65KB) (2.33%)
    1.04ms
    1 x afterRoute (123.27KB) (1.91%)
    853μs
    1 x beforeRenderModule mod_articles_category (Banco de Circuitos) (9.27KB) (1.33%)
    596μs
    1 x beforeRenderComponent com_content (100.79KB) (1.03%)
    461μs
    1 x After Access::preloadComponents (all components) (107.06KB) (0.89%)
    398μs
    1 x afterRenderRawModule mod_articles_category (Banco de Circuitos) (79.43KB) (0.83%)
    373μs
    1 x afterLoad (85.55KB) (0.68%)
    303μs
    1 x Before Access::preloadComponents (all components) (33.45KB) (0.51%)
    226μs
    1 x beforeRenderModule mod_finder (Busca_inteligente) (6.64KB) (0.46%)
    204μs
    1 x beforeRenderRawModule mod_finder (Busca_inteligente) (5.9KB) (0.21%)
    96μs
    1 x afterRenderModule mod_articles_category (Banco de Circuitos) (5.47KB) (0.16%)
    71μs
    1 x afterDispatch (2.25KB) (0.14%)
    62μs
    1 x afterRenderModule mod_finder (Busca_inteligente) (4.75KB) (0.12%)
    52μs
    1 x After Access::getAssetRules (id:26962 name:com_content.article.30603) (7.38KB) (0.1%)
    44μs
    1 x Before Access::preloadPermissions (com_content) (1.57KB) (0.02%)
    10μs
21 statements were executed, 5 of which were duplicates, 16 unique12.36ms1.63MB
  • SELECT @@SESSION.sql_mode;34μs968B/libraries/src/Session/MetadataManager.php:184Copy
  • SELECT `session_id` FROM `incbmx_session` WHERE `session_id` = :session_id LIMIT 165μs1.31KBParams/libraries/src/Session/MetadataManager.php:187Copy
  • UPDATE `incbmx_session` SET `guest` = :guest , `time` = :time , `userid` = :user_id , `username` = :username , `client_id` = :client_id WHERE `session_id` = :session_id67μs992BParams/libraries/src/Session/MetadataManager.php:316Copy
  • SELECT `id`,`rules` FROM `incbmx_viewlevels`54μs608B/libraries/src/Access/Access.php:955Copy
  • SELECT `b`.`id` FROM `incbmx_usergroups` AS `a` LEFT JOIN `incbmx_usergroups` AS `b` ON `b`.`lft` <= `a`.`lft` AND `b`.`rgt` >= `a`.`rgt` WHERE `a`.`id` = :guest84μs1.64KBParams/libraries/src/Access/Access.php:868Copy
  • SELECT `c`.`id`,`c`.`asset_id`,`c`.`access`,`c`.`alias`,`c`.`checked_out`,`c`.`checked_out_time`,`c`.`created_time`,`c`.`created_user_id`,`c`.`description`,`c`.`extension`,`c`.`hits`,`c`.`language`,`c`.`level`,`c`.`lft`,`c`.`metadata`,`c`.`metadesc`,`c`.`metakey`,`c`.`modified_time`,`c`.`note`,`c`.`params`,`c`.`parent_id`,`c`.`path`,`c`.`published`,`c`.`rgt`,`c`.`title`,`c`.`modified_user_id`,`c`.`version`, CASE WHEN CHAR_LENGTH(`c`.`alias`) != 0 THEN CONCAT_WS(':', `c`.`id`, `c`.`alias`) ELSE `c`.`id` END as `slug` FROM `incbmx_categories` AS `s` INNER JOIN `incbmx_categories` AS `c` ON (`s`.`lft` <= `c`.`lft` AND `c`.`lft` < `s`.`rgt`) OR (`c`.`lft` < `s`.`lft` AND `s`.`rgt` < `c`.`rgt`) WHERE (`c`.`extension` = :extension OR `c`.`extension` = 'system') AND `c`.`published` = 1 AND `s`.`id` = :id ORDER BY `c`.`lft`202μs3.98KBParams/libraries/src/Categories/Categories.php:375Copy
  • SELECT `id`,`name`,`rules`,`parent_id` FROM `incbmx_assets` WHERE `name` IN (:preparedArray1,:preparedArray2,:preparedArray3,:preparedArray4,:preparedArray5,:preparedArray6,:preparedArray7,:preparedArray8,:preparedArray9,:preparedArray10,:preparedArray11,:preparedArray12,:preparedArray13,:preparedArray14,:preparedArray15,:preparedArray16,:preparedArray17,:preparedArray18,:preparedArray19,:preparedArray20,:preparedArray21,:preparedArray22,:preparedArray23,:preparedArray24,:preparedArray25,:preparedArray26,:preparedArray27,:preparedArray28,:preparedArray29,:preparedArray30,:preparedArray31,:preparedArray32,:preparedArray33,:preparedArray34,:preparedArray35,:preparedArray36,:preparedArray37,:preparedArray38,:preparedArray39)227μs7.44KBParams/libraries/src/Access/Access.php:357Copy
  • SELECT `id`,`name`,`rules`,`parent_id` FROM `incbmx_assets` WHERE `name` LIKE :asset OR `name` = :extension OR `parent_id` = 08.97ms1.48MBParams/libraries/src/Access/Access.php:301Copy
  • SHOW FULL COLUMNS FROM `incbmx_content`291μs2.39KB/libraries/vendor/joomla/database/src/Mysqli/MysqliDriver.php:587Copy
  • UPDATE `incbmx_content` SET `hits` = (`hits` + 1) WHERE `id` = '30603'170μs48B/libraries/src/Table/Table.php:1348Copy
  • SELECT `a`.`id`,`a`.`asset_id`,`a`.`title`,`a`.`alias`,`a`.`introtext`,`a`.`fulltext`,`a`.`state`,`a`.`catid`,`a`.`created`,`a`.`created_by`,`a`.`created_by_alias`,`a`.`modified`,`a`.`modified_by`,`a`.`checked_out`,`a`.`checked_out_time`,`a`.`publish_up`,`a`.`publish_down`,`a`.`images`,`a`.`urls`,`a`.`attribs`,`a`.`version`,`a`.`ordering`,`a`.`metakey`,`a`.`metadesc`,`a`.`access`,`a`.`hits`,`a`.`metadata`,`a`.`featured`,`a`.`language`,`fp`.`featured_up`,`fp`.`featured_down`,`c`.`title` AS `category_title`,`c`.`alias` AS `category_alias`,`c`.`access` AS `category_access`,`c`.`language` AS `category_language`,`fp`.`ordering`,`u`.`name` AS `author`,`parent`.`title` AS `parent_title`,`parent`.`id` AS `parent_id`,`parent`.`path` AS `parent_route`,`parent`.`alias` AS `parent_alias`,`parent`.`language` AS `parent_language`,ROUND(`v`.`rating_sum` / `v`.`rating_count`, 1) AS `rating`,`v`.`rating_count` AS `rating_count` FROM `incbmx_content` AS `a` INNER JOIN `incbmx_categories` AS `c` ON `c`.`id` = `a`.`catid` LEFT JOIN `incbmx_content_frontpage` AS `fp` ON `fp`.`content_id` = `a`.`id` LEFT JOIN `incbmx_users` AS `u` ON `u`.`id` = `a`.`created_by` LEFT JOIN `incbmx_categories` AS `parent` ON `parent`.`id` = `c`.`parent_id` LEFT JOIN `incbmx_content_rating` AS `v` ON `a`.`id` = `v`.`content_id` WHERE ( (`a`.`id` = :pk AND `c`.`published` > 0) AND (`a`.`publish_up` IS NULL OR `a`.`publish_up` <= :publishUp)) AND (`a`.`publish_down` IS NULL OR `a`.`publish_down` >= :publishDown) AND `a`.`state` IN (:preparedArray1,:preparedArray2)274μs54.13KBParams/components/com_content/src/Model/ArticleModel.php:215Copy
  • SELECT `c`.`id`,`c`.`asset_id`,`c`.`access`,`c`.`alias`,`c`.`checked_out`,`c`.`checked_out_time`,`c`.`created_time`,`c`.`created_user_id`,`c`.`description`,`c`.`extension`,`c`.`hits`,`c`.`language`,`c`.`level`,`c`.`lft`,`c`.`metadata`,`c`.`metadesc`,`c`.`metakey`,`c`.`modified_time`,`c`.`note`,`c`.`params`,`c`.`parent_id`,`c`.`path`,`c`.`published`,`c`.`rgt`,`c`.`title`,`c`.`modified_user_id`,`c`.`version`, CASE WHEN CHAR_LENGTH(`c`.`alias`) != 0 THEN CONCAT_WS(':', `c`.`id`, `c`.`alias`) ELSE `c`.`id` END as `slug` FROM `incbmx_categories` AS `s` INNER JOIN `incbmx_categories` AS `c` ON (`s`.`lft` <= `c`.`lft` AND `c`.`lft` < `s`.`rgt`) OR (`c`.`lft` < `s`.`lft` AND `s`.`rgt` < `c`.`rgt`) WHERE (`c`.`extension` = :extension OR `c`.`extension` = 'system') AND `c`.`access` IN (:preparedArray1,:preparedArray2) AND `c`.`published` = 1 AND `s`.`id` = :id ORDER BY `c`.`lft`245μs3.92KBParams/libraries/src/Categories/Categories.php:375Copy
  • SELECT `m`.`tag_id`,`t`.* FROM `incbmx_contentitem_tag_map` AS `m` INNER JOIN `incbmx_tags` AS `t` ON `m`.`tag_id` = `t`.`id` WHERE `m`.`type_alias` = :contentType AND `m`.`content_item_id` = :id AND `t`.`published` = 1 AND `t`.`access` IN (:preparedArray1,:preparedArray2)293μs3.98KBParams/libraries/src/Helper/TagsHelper.php:388Copy
  • SELECT `c`.`id`,`c`.`asset_id`,`c`.`access`,`c`.`alias`,`c`.`checked_out`,`c`.`checked_out_time`,`c`.`created_time`,`c`.`created_user_id`,`c`.`description`,`c`.`extension`,`c`.`hits`,`c`.`language`,`c`.`level`,`c`.`lft`,`c`.`metadata`,`c`.`metadesc`,`c`.`metakey`,`c`.`modified_time`,`c`.`note`,`c`.`params`,`c`.`parent_id`,`c`.`path`,`c`.`published`,`c`.`rgt`,`c`.`title`,`c`.`modified_user_id`,`c`.`version`, CASE WHEN CHAR_LENGTH(`c`.`alias`) != 0 THEN CONCAT_WS(':', `c`.`id`, `c`.`alias`) ELSE `c`.`id` END as `slug` FROM `incbmx_categories` AS `s` INNER JOIN `incbmx_categories` AS `c` ON (`s`.`lft` <= `c`.`lft` AND `c`.`lft` < `s`.`rgt`) OR (`c`.`lft` < `s`.`lft` AND `s`.`rgt` < `c`.`rgt`) WHERE (`c`.`extension` = :extension OR `c`.`extension` = 'system') AND `c`.`access` IN (:preparedArray1,:preparedArray2) AND `c`.`published` = 1 AND `s`.`id` = :id ORDER BY `c`.`lft`173μs3.92KBParams/libraries/src/Categories/Categories.php:375Copy
  • SELECT DISTINCT a.id, a.title, a.name, a.checked_out, a.checked_out_time, a.note, a.state, a.access, a.created_time, a.created_user_id, a.ordering, a.language, a.fieldparams, a.params, a.type, a.default_value, a.context, a.group_id, a.label, a.description, a.required, a.only_use_in_subform,l.title AS language_title, l.image AS language_image,uc.name AS editor,ag.title AS access_level,ua.name AS author_name,g.title AS group_title, g.access as group_access, g.state AS group_state, g.note as group_note FROM incbmx_fields AS a LEFT JOIN `incbmx_languages` AS l ON l.lang_code = a.language LEFT JOIN incbmx_users AS uc ON uc.id=a.checked_out LEFT JOIN incbmx_viewlevels AS ag ON ag.id = a.access LEFT JOIN incbmx_users AS ua ON ua.id = a.created_user_id LEFT JOIN incbmx_fields_groups AS g ON g.id = a.group_id LEFT JOIN `incbmx_fields_categories` AS fc ON fc.field_id = a.id WHERE ( (`a`.`context` = :context AND (`fc`.`category_id` IS NULL OR `fc`.`category_id` IN (:preparedArray1,:preparedArray2,:preparedArray3)) AND `a`.`access` IN (:preparedArray4,:preparedArray5)) AND (`a`.`group_id` = 0 OR `g`.`access` IN (:preparedArray6,:preparedArray7)) AND `a`.`state` = :state) AND (`a`.`group_id` = 0 OR `g`.`state` = :gstate) AND `a`.`only_use_in_subform` = :only_use_in_subform ORDER BY a.ordering ASC424μs4.81KBParams/libraries/src/MVC/Model/BaseDatabaseModel.php:164Copy
  • SELECT `c`.`id`,`c`.`asset_id`,`c`.`access`,`c`.`alias`,`c`.`checked_out`,`c`.`checked_out_time`,`c`.`created_time`,`c`.`created_user_id`,`c`.`description`,`c`.`extension`,`c`.`hits`,`c`.`language`,`c`.`level`,`c`.`lft`,`c`.`metadata`,`c`.`metadesc`,`c`.`metakey`,`c`.`modified_time`,`c`.`note`,`c`.`params`,`c`.`parent_id`,`c`.`path`,`c`.`published`,`c`.`rgt`,`c`.`title`,`c`.`modified_user_id`,`c`.`version`, CASE WHEN CHAR_LENGTH(`c`.`alias`) != 0 THEN CONCAT_WS(':', `c`.`id`, `c`.`alias`) ELSE `c`.`id` END as `slug` FROM `incbmx_categories` AS `s` INNER JOIN `incbmx_categories` AS `c` ON (`s`.`lft` <= `c`.`lft` AND `c`.`lft` < `s`.`rgt`) OR (`c`.`lft` < `s`.`lft` AND `s`.`rgt` < `c`.`rgt`) WHERE (`c`.`extension` = :extension OR `c`.`extension` = 'system') AND `c`.`access` IN (:preparedArray1,:preparedArray2) AND `c`.`published` = 1 AND `s`.`id` = :id ORDER BY `c`.`lft`196μs3.92KBParams/libraries/src/Categories/Categories.php:375Copy
  • SELECT `name`,`element` FROM `incbmx_extensions` WHERE `type` = 'plugin' AND `folder` = 'finder' AND `enabled` = 1169μs1.89KB/administrator/components/com_finder/src/Helper/LanguageHelper.php:135Copy
  • SELECT `title` FROM `incbmx_finder_taxonomy` WHERE `parent_id` = 1 AND `state` = 1 AND `access` IN (1,5)96μs648B/administrator/components/com_finder/src/Indexer/Taxonomy.php:325Copy
  • SELECT * FROM `incbmx_schemaorg` WHERE `itemId` = :itemId AND `context` = :context59μs1.55KBParams/plugins/system/schemaorg/src/Extension/Schemaorg.php:403Copy
  • SELECT `a`.`id`,`a`.`asset_id`,`a`.`title`,`a`.`alias`,`a`.`introtext`,`a`.`fulltext`,`a`.`state`,`a`.`catid`,`a`.`created`,`a`.`created_by`,`a`.`created_by_alias`,`a`.`modified`,`a`.`modified_by`,`a`.`checked_out`,`a`.`checked_out_time`,`a`.`publish_up`,`a`.`publish_down`,`a`.`images`,`a`.`urls`,`a`.`attribs`,`a`.`version`,`a`.`ordering`,`a`.`metakey`,`a`.`metadesc`,`a`.`access`,`a`.`hits`,`a`.`metadata`,`a`.`featured`,`a`.`language`,`fp`.`featured_up`,`fp`.`featured_down`,`c`.`title` AS `category_title`,`c`.`alias` AS `category_alias`,`c`.`access` AS `category_access`,`c`.`language` AS `category_language`,`fp`.`ordering`,`u`.`name` AS `author`,`parent`.`title` AS `parent_title`,`parent`.`id` AS `parent_id`,`parent`.`path` AS `parent_route`,`parent`.`alias` AS `parent_alias`,`parent`.`language` AS `parent_language`,ROUND(`v`.`rating_sum` / `v`.`rating_count`, 1) AS `rating`,`v`.`rating_count` AS `rating_count` FROM `incbmx_content` AS `a` INNER JOIN `incbmx_categories` AS `c` ON `c`.`id` = `a`.`catid` LEFT JOIN `incbmx_content_frontpage` AS `fp` ON `fp`.`content_id` = `a`.`id` LEFT JOIN `incbmx_users` AS `u` ON `u`.`id` = `a`.`created_by` LEFT JOIN `incbmx_categories` AS `parent` ON `parent`.`id` = `c`.`parent_id` LEFT JOIN `incbmx_content_rating` AS `v` ON `a`.`id` = `v`.`content_id` WHERE ( (`a`.`id` = :pk AND `c`.`published` > 0) AND (`a`.`publish_up` IS NULL OR `a`.`publish_up` <= :publishUp)) AND (`a`.`publish_down` IS NULL OR `a`.`publish_down` >= :publishDown) AND `a`.`state` IN (:preparedArray1,:preparedArray2)188μs54.17KBParams/components/com_content/src/Model/ArticleModel.php:215Copy
  • SELECT SUM(CASE WHEN `a`.`next_execution` <= :now THEN 1 ELSE 0 END) AS due_count,SUM(CASE WHEN `a`.`locked` IS NULL THEN 0 ELSE 1 END) AS locked_count FROM `incbmx_scheduler_tasks` AS `a` WHERE `a`.`state` = 176μs1.37KBParams/administrator/components/com_scheduler/src/Model/TasksModel.php:465Copy