{"id":298,"date":"2021-01-29T16:22:13","date_gmt":"2021-01-29T16:22:13","guid":{"rendered":"https:\/\/adrianotanaka.com.br\/?p=298"},"modified":"2022-03-11T19:17:46","modified_gmt":"2022-03-11T19:17:46","slug":"oci-search-bar","status":"publish","type":"post","link":"https:\/\/adrianotanaka.com.br\/index.php\/2021\/01\/29\/oci-search-bar\/","title":{"rendered":"OCI &#8211; Search bar e Advanced Resource Query"},"content":{"rendered":"\n<p>A barra de pesquisa do OCI est\u00e1 se tornando cada vez mais \u00fatil e funcional, com ela podemos inclusive pesquisar por um IP e identificar em qual m\u00e1quina ele est\u00e1 vinculado:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"988\" height=\"262\" src=\"https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2021\/01\/image-34.png\" alt=\"\" class=\"wp-image-299\" srcset=\"https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2021\/01\/image-34.png 988w, https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2021\/01\/image-34-300x80.png 300w, https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2021\/01\/image-34-768x204.png 768w\" sizes=\"auto, (max-width: 988px) 100vw, 988px\" \/><\/figure>\n\n\n\n<p>Mas hoje quero falar um pouco sobre a op\u00e7\u00e3o <strong>Advanced Resource Query <\/strong>que potencializa a capacidade de pesquisa, permitindo que montemos nossas pr\u00f3prias consultas, lembrando que ao usar essa op\u00e7\u00e3o, ele vai buscar somente no Tenancy e regi\u00e3o atual.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Recursos suportados<\/h4>\n\n\n\n<p>Devemos consultar <a rel=\"noreferrer noopener\" href=\"https:\/\/docs.oracle.com\/en-us\/iaas\/Content\/Search\/Concepts\/queryoverview.htm#resourcetypes\" target=\"_blank\">aqui<\/a> quais s\u00e3o os recursos suportados pela fun\u00e7\u00e3o de pesquisa, a coluna importante \u00e9 a <strong>Resource Type<\/strong> que vamos usar nas consultas. <\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Sintaxe <\/h4>\n\n\n\n<p>De acordo com a documenta\u00e7\u00e3o da oracle, a sintaxe que precisamos seguir \u00e9 a seguinte:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"false\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">query &lt;resourceType> resources where &lt;conditions> sorted by &lt;fieldName> &lt;order><\/pre>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"false\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">query &lt;resourceType> resources matching &lt;keywords><\/pre>\n\n\n\n<p>Note que ambas come\u00e7am com a palavra query, seguida do resourceType(que podemos consultar <a rel=\"noreferrer noopener\" href=\"https:\/\/docs.oracle.com\/en-us\/iaas\/Content\/Search\/Concepts\/queryoverview.htm#resourcetypes\" target=\"_blank\">aqui<\/a>) e ap\u00f3s isso aplicamos as condi\u00e7\u00f5es, para quem j\u00e1 trabalha com a linguagem SQL vai notar que as duas s\u00e3o bem parecidas.<\/p>\n\n\n\n<p>A principal diferen\u00e7a entre elas \u00e9 que ao usar where, voc\u00ea precisa especificar uma condi\u00e7\u00e3o e ao usar matching ele busca pelo texto em todos os campos que ele da suporte.<\/p>\n\n\n\n<p>Sendo assim, podemos procurar por inst\u00e2ncias que possuam SQL no nome das seguintes formas:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"false\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">query\n  instance resources\n    where displayName=~'SQL'<\/pre>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"false\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">query\n  instance resources\n    matching  'SQL'<\/pre>\n\n\n\n<p>Note que em ambos os exemplos, estou usando o resourceType <strong>instance<\/strong>, na primeira query busco instancias cujo o nome (displayName) contenha (=~) SQL e na segunda query ele busca por SQL em todos os campos.<\/p>\n\n\n\n<p>Essa diferen\u00e7a fica mais evidente quando pesquisamos por todos os recursos do ambiente:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"false\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">query\nall resources\nwhere displayname =~'SQL'<\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"425\" src=\"https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2021\/01\/image-36-1024x425.png\" alt=\"\" class=\"wp-image-302\" srcset=\"https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2021\/01\/image-36-1024x425.png 1024w, https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2021\/01\/image-36-300x124.png 300w, https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2021\/01\/image-36-768x319.png 768w, https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2021\/01\/image-36.png 1208w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Perceba que n\u00e3o passei o tipo de recurso(apesar que na tela de pesquisa \u00e9 poss\u00edvel filtrar) e ele me retornou discos de boot que possuem SQL no nome.<\/p>\n\n\n\n<h5 class=\"wp-block-heading\">Operadores<\/h5>\n\n\n\n<p>Abaixo, listo quais operadores podem ser usados nas querys de acordo com a documenta\u00e7\u00e3o da Oracle, mais uma vez, para quem j\u00e1 mexe com a linguagem SQL vai perceber a semelhan\u00e7a.<\/p>\n\n\n\n<figure class=\"wp-block-table is-style-stripes\"><table><thead><tr><th>peration<\/th><th>Description<\/th><th>Supported Field Types<\/th><th>Case-sensitive?<\/th><th>Example<\/th><\/tr><\/thead><tbody><tr><td><code>=<\/code><\/td><td>Equals, or exact matching for strings<\/td><td>String, integer, rational, Boolean, date-time<\/td><td>No<\/td><td>If the&nbsp;<code>value<\/code>&nbsp;was \u02c8<strong>backUp<\/strong>\u02c8, it would match &#8220;backup&#8221;, &#8220;BACKUP&#8221;, &#8220;BackUp&#8221;, &#8220;backUp&#8221;, or any other variation in casing.<\/td><\/tr><tr><td><code>!=<\/code><\/td><td>Does not equal<\/td><td>String, integer, rational, Boolean, date-time<\/td><td>No<\/td><td>If the&nbsp;<code>value<\/code>&nbsp;was \u02c8<strong>backUp<\/strong>\u02c8, it would match anything that does not equal &#8220;backUp&#8221;, &#8220;backup&#8221;, or any other variation in casing. It also would match anything that does not contain the characters &#8216;backup&#8217; in that order.<\/td><\/tr><tr><td><code>==<\/code><\/td><td>Strictly equals<\/td><td>String<\/td><td>Yes<\/td><td>If the&nbsp;<code>value<\/code>&nbsp;was \u02c8<strong>backUp<\/strong>\u02c8, it would only match &#8220;backUp&#8221; and no other variation in casing.<\/td><\/tr><tr><td><code>!==<\/code><\/td><td>Strictly does not equal<\/td><td>String<\/td><td>Yes<\/td><td>If the&nbsp;<code>value<\/code>&nbsp;was \u02c8<strong>backUp<\/strong>\u02c8, it would match &#8220;backup&#8221;, &#8220;BACKup&#8221;, or anything except &#8220;backUp&#8221;, with that exact casing.<\/td><\/tr><tr><td><code>=~<\/code><\/td><td>Contains<\/td><td>String<\/td><td>No<\/td><td>If the&nbsp;<code>value<\/code>&nbsp;was \u02c8<strong>backUp<\/strong>\u02c8, it would match anything that equals &#8220;backup&#8221;, &#8220;BACKUP&#8221;, &#8220;BackUp&#8221;, &#8220;backUp&#8221;, or any other variation in casing, or contains those characters in that order, alongside other characters.<\/td><\/tr><tr><td><code>&gt;=<\/code><\/td><td>Greater than or equal to<\/td><td>Integer, rational, date-time<\/td><td>Not applicable<\/td><td>For a query where you have&nbsp;<code>size &gt;= 5<\/code>&nbsp;as the condition, all results have a value of&nbsp;<strong>5<\/strong>&nbsp;or greater in the field named&nbsp;<strong>size<\/strong>.<\/td><\/tr><tr><td><code>&gt;<\/code><\/td><td>Greater than<\/td><td>Integer, rational, date-time<\/td><td>Not applicable<\/td><td>For a query where you have&nbsp;<code>size &gt; 5<\/code>&nbsp;as the condition, all results have a value of greater than&nbsp;<strong>5<\/strong>&nbsp;in the field named&nbsp;<strong>size<\/strong>.<\/td><\/tr><tr><td><code>&lt;=<\/code><\/td><td>Less than or equal to<\/td><td>Integer, rational, date-time<\/td><td>Not applicable<\/td><td>For a query where you have&nbsp;<code>size &lt;= 5<\/code>&nbsp;as the condition, all results have a value of&nbsp;<strong>5<\/strong>&nbsp;or less in the field named&nbsp;<strong>size<\/strong>.<\/td><\/tr><tr><td><code>&lt;<\/code><\/td><td>Less than<\/td><td>Integer, rational, date-time<\/td><td>Not applicable<\/td><td>For a query where you have&nbsp;<code>size &lt; 5<\/code>&nbsp;as the condition, all results have a value of&nbsp;<strong>5<\/strong>&nbsp;or less in the field named&nbsp;<strong>size<\/strong>.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">Exemplos do que podemos fazer<\/h4>\n\n\n\n<p>Certo, agora j\u00e1 sabemos da exist\u00eancia dessa op\u00e7\u00e3o de consulta, vimos a sua sintaxe e tamb\u00e9m seus operados mas na realidade qual a vantagem de se usar essa op\u00e7\u00e3o comparada com apenas digitar o nome do recurso na barra de pesquisa?<\/p>\n\n\n\n<p>Abaixo listo alguns exemplos interessantes.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">M\u00e1quinas que foram criadas nos \u00faltimos dias<\/h4>\n\n\n\n<p>Ao trabalhar com data, podemos tanto passar a data inteira(seguindo o padr\u00e3o que a oracle mostra na documenta\u00e7\u00e3o), usar a vari\u00e1vel now e por ultimo fazer opera\u00e7\u00f5es em cima da string de data, as 3 consultas abaixo retornam a mesma coisa<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"false\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">query\n  instance resources\n  where timeCreated &lt; 'now-24h'<\/pre>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"false\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">query\n  instance resources\n  where timeCreated > '2021-01-27 00:00:00 UTC'<\/pre>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"false\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">query\n  instance resources\n  where timeCreated > '2021-01-29 00:00:00 UTC -24h'<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">Aplicando diversas condi\u00e7\u00f5es<\/h4>\n\n\n\n<p>Tamb\u00e9m podemos aplicar mais de uma condi\u00e7\u00e3o em nossa consulta usando os peradores &amp;&amp;(and) e  || (or), juntando tudo, podemos por exemplo consultar quais inst\u00e2ncias foram criadas no \u00faltimos 10 dias e possuem SQL no nome:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"false\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">query\ninstance resources\nwhere timeCreated >'now-10d' &amp;&amp; displayName=~'SQL'<\/pre>\n\n\n\n<p>Podemos tamb\u00e9m juntar diversas condi\u00e7\u00f5es, como por exemplo m\u00e1quinas que foram criadas no \u00faltimos 10 dias e possuem SQL no nome ou m\u00e1quinas que possuam SQL no nome, para isso precisamos agrupar as condi\u00e7\u00f5es entre par\u00eanteses :<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"false\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">query\ninstance resources\nwhere (timeCreated >'now-10d' &amp;&amp; displayName=~'SQL') || displayName=~'SQL'<\/pre>\n\n\n\n<p>Outra funcionalidade que temos \u00e9 a op\u00e7\u00e3o de procurar por mais de um tipo de recurso, aqui mostro como buscar inst\u00e2ncias e discos que possuam SQL no nome:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"false\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">query\ninstance, bootVolume resources\nwhere (timeCreated >'now-10d' &amp;&amp; displayName=~'SQL') || displayName=~'SQL'<\/pre>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>A barra de pesquisa do OCI est\u00e1 se tornando cada vez mais \u00fatil e funcional, com ela podemos inclusive pesquisar por um IP e identificar em qual m\u00e1quina ele est\u00e1 vinculado: Mas hoje quero falar um pouco sobre a op\u00e7\u00e3o Advanced Resource Query que potencializa a capacidade de pesquisa, permitindo que montemos nossas pr\u00f3prias consultas, [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":299,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"material-hide-sections":[],"footnotes":""},"categories":[8,6,1],"tags":[29],"class_list":["post-298","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-oci","category-oracle","category-uncategorized","tag-cloud"],"_links":{"self":[{"href":"https:\/\/adrianotanaka.com.br\/index.php\/wp-json\/wp\/v2\/posts\/298","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/adrianotanaka.com.br\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/adrianotanaka.com.br\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/adrianotanaka.com.br\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/adrianotanaka.com.br\/index.php\/wp-json\/wp\/v2\/comments?post=298"}],"version-history":[{"count":10,"href":"https:\/\/adrianotanaka.com.br\/index.php\/wp-json\/wp\/v2\/posts\/298\/revisions"}],"predecessor-version":[{"id":311,"href":"https:\/\/adrianotanaka.com.br\/index.php\/wp-json\/wp\/v2\/posts\/298\/revisions\/311"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/adrianotanaka.com.br\/index.php\/wp-json\/wp\/v2\/media\/299"}],"wp:attachment":[{"href":"https:\/\/adrianotanaka.com.br\/index.php\/wp-json\/wp\/v2\/media?parent=298"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/adrianotanaka.com.br\/index.php\/wp-json\/wp\/v2\/categories?post=298"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/adrianotanaka.com.br\/index.php\/wp-json\/wp\/v2\/tags?post=298"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}