Los diagramas permiten tener una visión global y detallada de un proyecto o programa en microbit. Los arquitectos usan planos y dibujos para saber que quieren construir. lo mismo pasa con los diagramas en programación de microcontroladores. En este artigo vamos a conocer los símbolos y diagramas usados para programar proyectos hecho con microbit. diagramas son dibujos que indican a los programadores y usuarios, como está construido el proyecto.

Alfonso Pérez

 

La tarjeta microbit es un sistema de cómputo pequeño que puede controlar sistemas y circuitos electrónicos.

 


 

 

Usamos el editor grafico Makecode para programar esta tarjeta.

 


| Clique na imagem para ampliar |

 

 

También, es necesario saber cómo está construido un proyecto, es decir tener un plano de lo que se quiere construir en la tarjeta microbit. Para saber esto, es necesario conocer cómo construir diagramas y cuales son usados en proyectos con microbit. La siguiente es una lista de los diagramas usados en proyectos con microbit:

• Diagramas de Casos de Usos.

• Diagramas de Actividad.

• Diagrama de Datos.

• Diagramas de Estado.

Algunos de estos diagramas son usados para computadoras grandes y como la tarjeta microbit es un computador pequeño y el ambiente de desarrollo: “Makecode” es gráfico, han sido modificado para adaptarlos a estas características.

 

 

DIAGRAMAS DE CASOS DE USO.

 

Los diagramas de: “Casos de Uso”, son usado para indicar o informar de una manera muy global lo que el proyecto debe hacer. En un diagrama de caso de uso, hay 3 elementos usados para su elaboración:

• Actor.

• Caso de Uso.

• Sistema.

El “Actor” puede ser entendido como la persona que va a utilizar el proyecto. En algunos libros o textos lo llaman el: “Usuario”. El actor se representa en los diagramas de casos de uso, con una figura como la siguiente:

 


 

 

 

El “Caso de Uso” puede ser entendido como: los procesos que ejecutara el actor o usuario y se representa en los diagramas de casos de uso, con una figura como la siguiente, donde “Xxxxxx”: representa algún texto describiendo el proceso que realizara el proyecto:

 


 

 

 

El “Sistema” puede ser entendido como procesos realizados por la tarjeta microbit y se representa en los diagramas de casos de uso, con una figura como la siguiente:

 


 

 

 

Un ejemplo de diagrama de casos de uso puede ser muy similar al mostrado en la siguiente figura:

 


| Clique na imagem para ampliar |

 

 

Vamos a realizar un proyecto para entender em la practica como desarrollar un diagrama de casos de uso. Supongamos un proyecto de una “linterna” donde el usuario la encienda y apague. Además, cuando la linterna este apagada, se muestre la temperatura. Siendo así, tenemos 3 procesos a ejecutar:

1- Encender la linterna.

2- Apagar la linterna.

3- Mostrar la temperatura.

El diagrama de Casos de Uso puede ser como el mostrado en la siguiente figura:

 


| Clique na imagem para ampliar |

 

 

 

Después de haber hecho el diagrama de casos de uso, podemos hacer el diagrama de actividades, donde se muestran las acciones que el proyecto debe ejecutar, desde un punto de vista del programador.

 

 

DIAGRAMAS DE ACTIVIDAD.

 

El “Diagrama de Actividades” muestra las acciones que el proyecto debe ejecutar. Los elementos básicos usados en un diagrama son:

• Inicio.

• Actividad.

• Conector.

• Unión.

• Decisión.

• Condición.

• Finalización.

 

El “inicio” representa el comienzo del proyecto y su símbolo de representación es:

 


 

 

 

La “Actividad” representa brevemente un proceso y su símbolo de representación es:

 


 

 

 

El “conector” es una flecha que indica cuando una actividad comienza o finaliza. Su símbolo de representación es:

 


 

 

 

El “unión” son flechas y barras que pueden indicar actividades en paralelo. Su símbolo de representación es:

 

 


| Clique na imagem para ampliar |

 

 

La “decisión” es usado para representar 2 caminos a seguir. Normalmente las decisiones dependen de una condición, es decir se ejecutará el proceso si se cumple la condición. Su símbolo de representación es:

 


 

 

 

La “condición” es una regla lógica o aritmética que se debe cumplir, para que la actividad o el proceso se realice. Su símbolo de representación es:

 


 

 

 

La “Finalización” es usada para representar el final de las actividades y su símbolo de representación es:

 


 

 

 

Como dicho anteriormente, el diagrama de actividades muestra los procesos que el proyecto debe ejecutar. Es necesario relacionar algunos elementos del diagrama de actividades con los bloques disponibles en el ambiente de desarrollo “Makecode”.

 

 

Flujos o secuencias.

 

Para entender porque el diagrama de actividades usa flujos o secuencias, es necesario entender un poco, como la tarjeta microbit ejecuta los bloques de programación. El orden siempre es de arriba hacia abajo. También, es muy importante entender el símbolo de: “decisión”.

 

 


 

 

 

En la anterior secuencia, el programa hace una evaluación, si el resultado es falso, se ejecuta el bloque, si es verdadero, salta (jump) el bloque y continua la secuencia mas abajo. También, Se puede hacer una evaluación, como la siguiente:

 


 

 

 

Vamos a ver un ejemplo práctico. Supongamos que tenemos una variable booleana llamada: “LinternaPrendida” y cuando esta tenga un valor de: “falso”, muestre la temperatura. La secuencia será como la siguiente:

 


 

 

 

Es decir: cuando la linterna este prendida, no hay que mostrar la temperatura. Los bloques para hacer esto serian así:

 


 

 

 

Recordemos que los bloques para decisiones (condicionales), se encuentran en el menú:” Lógica”, como muestra la siguiente imagen:

 

 


 

 

 

Es muy importante saber como crear variables booleanas. Para hacer esto vaya al menú: “Variables” y cree una variable como mostrado en la siguiente imagen:

 


 

 

 

Después, seleccione el bloque: “fijar LinternaPrendida a” y arrástrelo hasta encajarlo en el bloque: “al iniciar” como muestra la siguiente imagen:

 


 

 

 

Ahora, vaya al menú: “Lógica” y seleccione un bloque que devuelve un valor booleano, arrástrelo hasta el bloque: “fijar LinternaPrendida a”, como mostrado en la siguiente imagen:

 


| Clique na imagem para ampliar |

 

 

Otro bloque usado para toma de decisiones es: “si entonces”, como mostrado en la siguiente imagen:

 


 

 

 

Este flujo muestra cómo se ejecutará algún proceso, tanto en la verificación falsa como también en la verdadera. Otra manera de dibujar este flujo es mostrada en la siguiente figura:

 


| Clique na imagem para ampliar |

 

 

La forma como se dibuje depende del estilo que adopte cada programador, más las 2 secuencias o flujos son válidos. El bloque para hacer este tipo de verificación esta en el menú: “Lógica” y es mostrado en la siguiente imagen:

 

 


 

 

 

Para usar este bloque en la práctica, supongamos que queremos retardar una determina acción por un tiempo. Podemos crear una variable de tipo entero y mientras sea mayor a cero (0) decrementarla. Cuando la variable llegue a cero, se saltará a la otra actividad. La siguiente figura ilustra esto:

 


| Clique na imagem para ampliar |

 

 

Los bloques usados para realizar este diagrama serian similar al mostrado en la siguiente figura:

 


 

 

 

Note que cuando la variable: “timer” valga 1, será la ultima vez que pase por esa verificación, pues aun es mayor a cero. En la siguiente pasada por ese proceso, la variable vale cero y se cumple la otra condición.

Otro tipo de secuencia usado en microbit, se realiza cuando se tienen que hacer múltiples verificaciones como mostrado en la siguiente figura:

 


 

 

 

Como un ejemplo práctico podemos pensar en una variable de tipo entero llamada: “contador” la cual queremos realice alguna actividad cuando esta valga: 2, 7, 8 y 12. El diagrama puede ser similar al mostrado en la siguiente figura:

 

 


| Clique na imagem para ampliar |

 

 

Para hacer esto con los bloques de Makecode, vaya al menú: “Logica” seleccione el bloque: “si entonces, si no”, como mostrado en la siguiente imagen:

 

 


| Clique na imagem para ampliar |

 

 

Después, de click en el símbolo: “+” hasta que sea similar al mostrado en la siguiente imagen:

 


 

 

 

Ahora vaya a los bloques de comparación y arrástrelos como mostrado en la siguiente imagen:

 

 


| Clique na imagem para ampliar |

 

 

Ahora hacer lo mismo para los otros bloques como mostrado en la siguiente imagen:

 

 


 

 

 

Cree una variable llamada: “contador” y arrástrela hasta el bloque: “si no, si entonces” y edite los valores a comparar como mostrado en la siguiente imagen:

 


 

 

 

Ya esta listo para colocar los procesos o bloques a realizar cuando la condición sea verdadera. Otra manera de hacer el diagrama de flujo puede ser como el mostrado en la siguiente imagen:

 

 


 

 

 

Se entiende que los conectores tienen una condición para que se puedan ejecutar. Si le parece también se puede resumir o reducir al diagrama mostrado en la siguiente imagen.

 

 


 

 

 

Tomando como ejemplo el proyecto de la “Linterna”, visto en el diagrama de casos de uso, desarrollaremos a partir de este proyecto, el diagrama de actividades. El siguiente diagrama muestra las actividades que el proyecto “Linterna” debe procesar:

 


| Clique na imagem para ampliar |

 

 

Como vemos hay una actividad para el inicio. Después, entramos a una unión donde hay 3 actividades que se pueden ejecutar en paralelo. Una actividad para mostrar la temperatura, otra actividad para encender la linterna y otra actividad para apagar la linterna. Después, entramos en otra unión para de ahí llegar a la unión superior y repetir el bucle (loop). Podemos observar que las actividades son muy similares a los casos de uso. Se puede decir que un diagrama de casos de uso, lo puede comprender cualquier persona. El diagrama de actividades lo entienden los programadores.

Vamos a agregar una característica al proyecto “Linterna”: Que, al apagar la linterna, la tarjeta microbit demore 10 segundos para mostrar la temperatura. Para hacer esto crearemos una variable booleana llamada: “LinternaPrendida” y una variable de tipo entero llamada: “timer”. Así, se puede verificar cuando la linterna este apagada y hacer un retardo de 10 segundo para mostrar la temperatura. La actividad: “Mostrar temperatura” puede desarrollarse en mas profundidad y ser algo como mostrado en el siguiente diagrama:

 


 

 

 

Los diagramas de actividad son muy flexibles a la hora de ser desarrollados. Por ejemplo, el siguiente diagrama es similar al visto anteriormente.

 


 

 

 

El programa para el proyecto: “Linterna” sería similar a este:

 


| Clique na imagem para ampliar |

 

 

 


 

 

 

Las siguientes son las pantallas que veremos en el proyecto: “Linterna”.

 


| Clique na imagem para ampliar |

 

 

 

DIAGRAMAS DE DATOS.

 

Los diagramas de datos muestran las variables usadas en el proyecto. Por ejemplo, para el proyecto: “linterna”, usamos 2 variables, una de tipo booleano llamada: “LinternaPrendida” y otra de tipo entero llamada: “timer”. El diagrama de datos puede ser como el siguiente:

 

 


 

 

 

Si el proyecto es muy grande, puede agrupar las variables dentro de cuadros o rectángulos para clasificarlas. Después, podemos nombrar el cuadrado o rectángulo para generalizar que dichas variables pertenecen a un determina clase, como mostrado en el siguiente ejemplo de un sensor de temperatura con alarmas de nivel bajo y alto:

 


 

 

 

 

DIAGRAMAS DE ESTADO.

 

Los Diagramas de Estado son usados para describir el comportamiento de un proyecto. Este diagrama puede darle al proyecto una cierta inteligencia al poder programar la manera como queremos se comporte el proyecto. El siguiente diagrama muestra un estilo de dibujo para los diagramas de estado:

 


| Clique na imagem para ampliar |

 

 

Este es otro estilo utilizado en los textos de programación:

 


| Clique na imagem para ampliar |

 

 

Por ser importante conocer bien los diagramas de estado, en un próximo capitulo serán estudiados. Como conclusión podemos familiarizarnos con los diferentes diagramas vistos y usarlos para el desarrollo de proyectos. También puedes usar la creatividad para adaptar estos diagramas a tu modo o estilo de programar. ¡Buenos proyectos!

 

 

 

 

18.97MBMemory Usage47.59msRequest 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
[]
$_SERVER
array:51 [ "USER" => "apache" "HOME" => "/usr/share/httpd" "SCRIPT_NAME" => "/index.php" "RE...
session
array:3 [ "counter" => 1 "timer" => array:3 [ "start" => 1747349913 "last" => 1747349913...
registry
array:3 [ "data" => [] "initialized" => false "separator" => "." ]
user
array:21 [ "id" => 0 "name" => null "username" => null "email" => null "password" => "***r...
  • afterLoad (85.39KB) (1.24ms)
  • afterInitialise (1.14MB) (5.89ms)
  • afterRoute (123.27KB) (1.34ms)
  • beforeRenderComponent com_content (100.74KB) (617μs)
  • Before Access::preloadComponents (all components) (33.45KB) (383μs)
  • After Access::preloadComponents (all components) (107.06KB) (399μs)
  • Before Access::preloadPermissions (com_content) (1.57KB) (11μs)
  • After Access::preloadPermissions (com_content) (16.22MB) (20.32ms)
  • Before Access::getAssetRules (id:26959 name:com_content.article.30601) (514.65KB) (720μs)
  • After Access::getAssetRules (id:26959 name:com_content.article.30601) (7.38KB) (72μs)
  • afterRenderComponent com_content (454.11KB) (7.83ms)
  • afterDispatch (2.25KB) (65μs)
  • beforeRenderRawModule mod_articles_category (Banco de Circuitos) (359.33KB) (1.83ms)
  • afterRenderRawModule mod_articles_category (Banco de Circuitos) (79.43KB) (459μs)
  • beforeRenderRawModule mod_finder (Busca_inteligente) (5.9KB) (94μs)
  • afterRenderRawModule mod_finder (Busca_inteligente) (64.91KB) (1.33ms)
  • beforeRenderModule mod_articles_category (Banco de Circuitos) (10.1KB) (682μs)
  • afterRenderModule mod_articles_category (Banco de Circuitos) (5.47KB) (95μs)
  • beforeRenderModule mod_finder (Busca_inteligente) (6.39KB) (207μs)
  • afterRenderModule mod_finder (Busca_inteligente) (4.75KB) (51μs)
  • afterRender (289.77KB) (3.83ms)
  • 1 x After Access::preloadPermissions (com_content) (16.22MB) (42.71%)
    20.32ms
    1 x afterRenderComponent com_content (454.11KB) (16.44%)
    7.83ms
    1 x afterInitialise (1.14MB) (12.39%)
    5.89ms
    1 x afterRender (289.77KB) (8.04%)
    3.83ms
    1 x beforeRenderRawModule mod_articles_category (Banco de Circuitos) (359.33KB) (3.85%)
    1.83ms
    1 x afterRoute (123.27KB) (2.82%)
    1.34ms
    1 x afterRenderRawModule mod_finder (Busca_inteligente) (64.91KB) (2.8%)
    1.33ms
    1 x afterLoad (85.39KB) (2.61%)
    1.24ms
    1 x Before Access::getAssetRules (id:26959 name:com_content.article.30601) (514.65KB) (1.51%)
    720μs
    1 x beforeRenderModule mod_articles_category (Banco de Circuitos) (10.1KB) (1.43%)
    682μs
    1 x beforeRenderComponent com_content (100.74KB) (1.3%)
    617μs
    1 x afterRenderRawModule mod_articles_category (Banco de Circuitos) (79.43KB) (0.96%)
    459μs
    1 x After Access::preloadComponents (all components) (107.06KB) (0.84%)
    399μs
    1 x Before Access::preloadComponents (all components) (33.45KB) (0.8%)
    383μs
    1 x beforeRenderModule mod_finder (Busca_inteligente) (6.39KB) (0.43%)
    207μs
    1 x afterRenderModule mod_articles_category (Banco de Circuitos) (5.47KB) (0.2%)
    95μs
    1 x beforeRenderRawModule mod_finder (Busca_inteligente) (5.9KB) (0.2%)
    94μs
    1 x After Access::getAssetRules (id:26959 name:com_content.article.30601) (7.38KB) (0.15%)
    72μs
    1 x afterDispatch (2.25KB) (0.14%)
    65μs
    1 x afterRenderModule mod_finder (Busca_inteligente) (4.75KB) (0.11%)
    51μs
    1 x Before Access::preloadPermissions (com_content) (1.57KB) (0.02%)
    11μs
21 statements were executed, 5 of which were duplicates, 16 unique12.41ms1.64MB
  • SELECT @@SESSION.sql_mode;35μs968B/libraries/src/Session/MetadataManager.php:184Copy
  • SELECT `session_id` FROM `incbmx_session` WHERE `session_id` = :session_id LIMIT 178μs1.3KBParams/libraries/src/Session/MetadataManager.php:187Copy
  • INSERT INTO `incbmx_session` (`session_id`,`guest`,`time`,`userid`,`username`,`client_id`) VALUES (:session_id, :guest, :time, :user_id, :username, :client_id)199μs944BParams/libraries/src/Session/MetadataManager.php:260Copy
  • SELECT `id`,`rules` FROM `incbmx_viewlevels`51μs656B/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` = :guest78μ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`196μ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)233μ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.83ms1.48MBParams/libraries/src/Access/Access.php:301Copy
  • SHOW FULL COLUMNS FROM `incbmx_content`352μs2.39KB/libraries/vendor/joomla/database/src/Mysqli/MysqliDriver.php:587Copy
  • UPDATE `incbmx_content` SET `hits` = (`hits` + 1) WHERE `id` = '30601'209μ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)190μs62.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`194μ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)257μ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`181μ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 ASC410μ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`303μs3.92KBParams/libraries/src/Categories/Categories.php:375Copy
  • SELECT `name`,`element` FROM `incbmx_extensions` WHERE `type` = 'plugin' AND `folder` = 'finder' AND `enabled` = 1157μ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)124μs648B/administrator/components/com_finder/src/Indexer/Taxonomy.php:325Copy
  • SELECT * FROM `incbmx_schemaorg` WHERE `itemId` = :itemId AND `context` = :context73μ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)182μs62.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` = 177μs1.37KBParams/administrator/components/com_scheduler/src/Model/TasksModel.php:465Copy