Lädt...


🔧 NoFlyList: How NoFlyList Optimizes Tag Queries


Nachrichtenbereich: 🔧 Programmierung
🔗 Quelle: dev.to

Database-Specific Strategies

NoFlyList automatically detects your database type and uses optimized queries:

class Product < ApplicationRecord
  include NoFlyList::TaggableRecord
  has_tags :categories
end

# This generates different SQL for each database
Product.with_any_categories("electronics", "gaming")

PostgreSQL Optimization

PostgreSQL query:

# Using array operators and CTE for better performance
SELECT "products".*
FROM "products"
WHERE "products"."id" IN (
  SELECT DISTINCT "products"."id"
  FROM products
  INNER JOIN "product_taggings" ON "product_taggings"."taggable_id" = "products"."id"
  INNER JOIN "product_tags" ON "product_tags"."id" = "product_taggings"."tag_id"
  WHERE "product_taggings"."context" = 'category'
  AND "product_tags"."name" = ANY(ARRAY['electronics', 'gaming'])
)

MySQL Optimization

MySQL query:

# Using FIND_IN_SET and subqueries
SELECT `products`.*
FROM `products`
WHERE `products`.`id` IN (
  SELECT `products`.`id`
  FROM products
  INNER JOIN `product_taggings` ON `product_taggings`.`taggable_id` = `products`.`id`
  INNER JOIN `product_tags` ON `product_tags`.`id` = `product_taggings`.`tag_id`
  WHERE `product_taggings`.`context` = 'category'
  AND `product_tags`.`name` IN ('electronics', 'gaming')
  GROUP BY `products`.`id`
)

SQLite Optimization

SQLite query:

# Optimized for SQLite's simpler query planner
SELECT "products".*
FROM "products"
WHERE "products"."id" IN (
  SELECT "products"."id"
  FROM products
  INNER JOIN product_taggings ON product_taggings.taggable_id = products.id
  INNER JOIN product_tags ON product_tags.id = product_taggings.tag_id
  WHERE product_taggings.context = 'category'
  AND product_tags.name IN ('electronics', 'gaming')
)

Complex Queries

# Finding products with ALL specified tags
Product.with_all_categories("electronics", "gaming")

# PostgreSQL uses:
SELECT "products".*
FROM "products"
WHERE "products"."id" IN (
  SELECT "products"."id"
  FROM products
  INNER JOIN "product_taggings" ON "product_taggings"."taggable_id" = "products"."id"
  INNER JOIN "product_tags" ON "product_tags"."id" = "product_taggings"."tag_id"
  WHERE "product_taggings"."context" = 'category'
  AND "product_tags"."name" IN ('electronics', 'gaming')
  GROUP BY "products"."id"
  HAVING COUNT(DISTINCT "product_tags"."name") = 2
)

# Finding products without specific tags
Product.without_any_categories("discontinued")

# Finding products with exact tag set
Product.with_exact_categories(["electronics", "gaming"])

Performance Tips

  1. Index Optimization:
class CreateProductTags < ActiveRecord::Migration[7.2]
  def change
    add_index :product_tags, :name
    add_index :product_taggings, [:taggable_id, :taggable_type, :context]
  end
end

Unlike AATO, the gem support multiple database connections and mixed adapters.

  1. Counter Cache:
class Product < ApplicationRecord
  has_tags :categories, counter_cache: true
end
  1. Eager Loading:
# Efficient loading of products with their tags
Product.includes(:categories)
       .with_any_categories("electronics")

Debugging Queries

Use query logging to see optimizations:

# config/environments/development.rb
config.active_record.verbose_query_logs = true

# In console
Product.with_any_categories("electronics").explain

Common Patterns

  1. Category Trees:
Product.with_all_categories("electronics")
       .with_any_categories("gaming", "professional")
  1. Exclusions:
Product.with_any_categories("electronics")
       .without_any_categories("discontinued", "clearance")
  1. Exact Matching:
Product.with_exact_categories(["gaming", "electronics"])

Each pattern generates optimized SQL based on your database.
If you know a better query, feel free to open a pull request on the adapter query.

...

🔧 NoFlyList: How NoFlyList Optimizes Tag Queries


📈 95.49 Punkte
🔧 Programmierung

🔧 NoFlyList: Custom Tag Screening with NoFlyList


📈 63.15 Punkte
🔧 Programmierung

🔧 NoFlyList : How NoFlyList Got Cleared for Production


📈 55.92 Punkte
🔧 Programmierung

🔧 NoFlyList: Choosing Between Polymorphic and Model-Specific Tags


📈 27.96 Punkte
🔧 Programmierung

🔧 Stop Fighting with Media Queries! Use CSS Container Queries Instead


📈 24.33 Punkte
🔧 Programmierung

🔧 Query Optimization in MySQL: Optimizing Top Queries vs. Slow Queries


📈 24.33 Punkte
🔧 Programmierung

🔧 Media Queries vs Container Queries – Which Should You Use and When?


📈 24.33 Punkte
🔧 Programmierung

🔧 Enhancing Data Queries with Firebase: Using Compound Queries to Filter Results


📈 24.33 Punkte
🔧 Programmierung

📰 PlainID Technology Network optimizes integration with mission-critical adjacent technologies


📈 20.18 Punkte
📰 IT Security Nachrichten

🪟 NVIDIA's Game Ready Driver update optimizes several popular titles


📈 20.18 Punkte
🪟 Windows Tipps

🕵️ How LLVM optimizes geometric sums


📈 20.18 Punkte
🕵️ Reverse Engineering

🍏 iOS 16.1.2 Optimizes Crash Detection, Improves Wireless Carrier Compatibility


📈 20.18 Punkte
🍏 iOS / Mac OS

🎥 Intel® oneDNN Optimizes DL Applications | oneAPI Dev News | June 2024 | Intel Software


📈 20.18 Punkte
🎥 Video | Youtube

🪟 Microsoft Announces Simplygon Cloud; Optimizes Mixed Reality Development


📈 20.18 Punkte
🪟 Windows Tipps

📰 Imperva optimizes SQL generation from natural language using Amazon Bedrock


📈 20.18 Punkte
🔧 AI Nachrichten

🎥 This Neural Network Optimizes Itself | Two Minute Papers #212


📈 20.18 Punkte
🎥 Videos

📰 JetBlue optimizes data operations with shift to the cloud


📈 20.18 Punkte
📰 IT Security Nachrichten

📰 Meet Baselit: An AI-Powered Startup that Automatically Optimizes Snowflake Costs with Zero Human Effort


📈 20.18 Punkte
🔧 AI Nachrichten

📰 Google Finally Shows Some Love for iPhone X, Optimizes Office Apps for the Notch


📈 20.18 Punkte
📰 IT Security Nachrichten

📰 Semtech’s LoRa Connect optimizes CWD Limited’s dual combo module for IoT device connectivity


📈 20.18 Punkte
📰 IT Security Nachrichten

🔧 How Deutsche Telekom MMS optimizes Ansible Playbooks with Steampunk Spotter


📈 20.18 Punkte
🔧 Programmierung

📰 Latest Black Lab Linux Weekly Build Optimizes Swap File Management for SSD


📈 20.18 Punkte
📰 IT Security Nachrichten

📰 Channel 4 optimizes cybersecurity and boosts efficiency after partnering with Invicti


📈 20.18 Punkte
📰 IT Security Nachrichten

🐧 New 2024 Framework laptop optimizes screen to avoid Linux fractional scaling (13-in model)


📈 20.18 Punkte
🐧 Linux Tipps

🔧 Solving the Logistics Puzzle: How Geospatial Data Visualization Optimizes Delivery and Transportation


📈 20.18 Punkte
🔧 Programmierung

🎥 A story of Android App Excellence: TikTok optimizes their user experience with Android tools


📈 20.18 Punkte
🎥 Video | Youtube

🔧 How Test Automation Optimizes Oracle Cloud Integrations


📈 20.18 Punkte
🔧 Programmierung

📰 F5 AI Gateway secures and optimizes access to AI applications


📈 20.18 Punkte
📰 IT Security Nachrichten

matomo