Azure Blob tags: Werken met getallen
Azure Blob tags zijn een bijzonder fijne functie. Ze worden gebruikt om bestanden in een Blob storage te indexeren op basis van zelf gedefinieerde metadata. Blobs kunnen vervolgens worden doorzocht met deze metadata met behulp van eenvoudige vergelijkingsoperators zoals =, !=, < en >. Was het maar zo dat ons lokale bestandssysteem dit ook zou ondersteunen, dat zou het vinden van bestanden op mijn computer veel eenvoudiger maken.
Om een globaal beeld te geven, dit is waar het uiteindelijk op neerkomt in code met de .NET Azure Storage SDK.
Dankzij deze technologie kon ik snel een applicatie ontwikkelen voor het uploaden, zoeken, bijwerken en exporteren van foto’s van facturen als uitbreiding op een accountancy applicatie. De ervaring met hoe goed Azure Blob tags werken, zorgde ervoor dat ik het iedereen wilde vertellen. Vandaar deze blog.
Azure Blob tags bestaan al een behoorlijke tijd. De documentatie is voldoende om prettig en succesvol te experimenteren. De beperkingen kunnen in het begin wat onduidelijk zijn, maar worden snel helder.
Ik ga niet verder in op wat Azure Blob tags precies zijn of hoe je ze basismatig gebruikt, want ik ga ervan uit dat je dit onderwerp al kent als je deze pagina hebt gevonden. Zo niet, lees dan eerst even een inleiding over Azure Blob tags.
Dit artikel is vooral nuttig wanneer je al een tijd moeite hebt om Azure Blobs te vinden met numerieke Blob tags en nog steeds foutmeldingen of onverwachte resultaten krijgt. Het kan je ook helpen om beter bekend te raken met enkele implementatiedetails van Azure Blob tags en de gevolgen daarvan voor de bruikbaarheid.
Range operators
Alle tag keys zijn tekst. Voor relationele of range operators gebruikt Microsoft lexicografische sortering. Dat werkt uitstekend voor datums en tekst, maar levert uitdagingen op bij het zoeken naar nummers.
Al snel, wanneer je allerlei numerieke waarden probeert te doorzoeken met range operators, zal de beruchte “invalid range” foutmelding iedere ambitieuze engineer frustreren. Een voorbeeld zal je waarschijnlijk direct bekend voorkomen.
Problemen tegenkomen
Omdat ik werkte met facturen voor een accountancy applicatie moest ik voor elke factuurafbeelding de prijs als metadata meegeven. Ik moest dus de mogelijkheid bieden om op prijs te zoeken. Dat deed ik door alle uploads netjes te taggen met een prijs, gewoon een normale numerieke waarde. Toen liep ik tegen twee problemen aan.
Probleem 1: Invalid Range Query Error
Wat voor ons een eenvoudige query lijkt, bleek onmogelijk:
“price” > ‘400’ AND “price” < ‘1000’
Een voorbeeld van wat wél werkt:
“price” > ‘200’ AND “price” < ‘800’
Probleem 2: Range Query geeft onverwachte resultaten
Toen de reeks prijswaarden groeide, merkte ik dat geldige numerieke range queries verkeerde resultaten begonnen te geven. Zo kreeg ik bij een query tussen 2500 en 4100 ineens waarden zoals 260 en 310. Zonder een strategie levert zoeken in numerieke tags simpelweg onbetrouwbare resultaten op.
Lexicografische sortering
Laat me uitleggen waarom dit allemaal gebeurt voordat ik een volledig getest trucje deel dat het mogelijk maakt om getallen tot op decimale nauwkeurigheid correct terug te vinden.
In het Nederlands zeggen we: een gewaarschuwd mens telt voor twee. In het Engels zegt men achteraf: I told you so. Microsoft heeft het tenslotte zelf duidelijk gezegd:
“Be familiar with lexicographical ordering when setting and querying on tags.” – Microsoft Docs
Bij lexicografische sortering wordt 400 niet gezien als lager dan 1000. Daarom werkte mijn query logischerwijs niet. Het was geen mysterie, maar een voorspelbare uitkomst binnen lexicografische regels.
Oplossing: de werk-met-datums truc
Hoe vreemd het ook klinkt, blobs taggen met datums werkt uitzonderlijk goed. Gebruik simpelweg het juiste formaat zoals 2022 12 31 20:45:12Z. Wil je een blob met precies die datum vinden, dan werkt dit perfect:
“uploadTime” > ‘2022 12 31 20:45:11Z’ AND “uploadTime” < ‘2022 12 31 20:45:13Z’
De truc: zet je numerieke waarde om in een datumtijd waarde en zoek daarmee. Simpel, vreemd, maar het werkt naadloos en loste mijn probleem volledig op.
Ik kan nu facturen taggen met prijzen zoals 283.26. Voor elke decimale waarde gebruik ik een helpermethode.
De methode volgt drie stappen:
- Vermenigvuldig de waarde met een groot getal, zodat elke 0.01 verschil minstens één seconde wordt.
- Maak een DateTime instantie met deze vermenigvuldigde waarde, die het aantal ticks voorstelt.
- Formatteer deze datum naar een tekstwaarde volgens het eerder genoemde formaat.
Klaar. Veel plezier met het creatief gebruiken van Azure Blob tags voor numerieke waarden.
Handige links
Azure Blob Storage Index Tags
Manage and find Azure Blob data with blob index tags
Meer blogposts
-
Exploring the essentials of professional software engineering
Jelle verkende in deze serie wat een software engineer professioneel maakt en deelt inzichten uit eigen ervaring. Hieronder staat een korte terugblik op de besproken onderwerpen.
ContenttypeBlog
-
The Software Engineer Oath
In dit laatste deel blikken we terug op de hele reeks, van codekwaliteit tot ethiek, teamwork, professionaliteit en de introductie van Dijkstra’s Eed voor verantwoord software-engineeringschap.
ContenttypeBlog
-
The development process Part 2
Deze blog laat zien hoe succesvolle softwareontwikkeling draait om mensen: samenwerking, teamdynamiek, psychologische veiligheid en ontwikkelaars die actief bijdragen aan productvisie, groei en verandering.ContenttypeBlog
Altijd op de hoogte met onze tech-updates!
Schrijf je in en ontvang om de week een update met de nieuwste kennis en ontwikkelingen.