{"id":50580038,"url":"https://github.com/codewithmark/query","last_synced_at":"2026-06-05T01:02:21.680Z","repository":{"id":303826598,"uuid":"1016836168","full_name":"codewithmark/query","owner":"codewithmark","description":null,"archived":false,"fork":false,"pushed_at":"2025-08-14T02:49:58.000Z","size":221,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-08-14T04:30:59.524Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/codewithmark.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-07-09T15:44:10.000Z","updated_at":"2025-08-14T02:50:01.000Z","dependencies_parsed_at":"2025-07-24T22:25:28.708Z","dependency_job_id":null,"html_url":"https://github.com/codewithmark/query","commit_stats":null,"previous_names":["codewithmark/query"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/codewithmark/query","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/codewithmark%2Fquery","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/codewithmark%2Fquery/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/codewithmark%2Fquery/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/codewithmark%2Fquery/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/codewithmark","download_url":"https://codeload.github.com/codewithmark/query/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/codewithmark%2Fquery/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33926275,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-04T02:00:06.755Z","response_time":64,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-06-05T01:02:20.709Z","updated_at":"2026-06-05T01:02:21.671Z","avatar_url":"https://github.com/codewithmark.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Query.js - Advanced SQL-like JavaScript Library\n\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![JavaScript](https://img.shields.io/badge/JavaScript-ES6+-yellow.svg)](https://developer.mozilla.org/en-US/docs/Web/JavaScript)\n[![SecureLS](https://img.shields.io/badge/SecureLS-Integrated-green.svg)](https://github.com/softvar/secure-ls)\n\n**Query.js** is a powerful, lightweight JavaScript library that brings SQL-like functionality to your client-side applications. It supports complex queries, joins, aggregations, built-in functions, automatic indexing for performance optimization, and secure localStorage integration with encryption.\n\n## 🚀 Features\n\n- ✅ **SQL-like Syntax**: SELECT, INSERT, UPDATE, DELETE operations\n- ✅ **Complex Joins**: INNER, LEFT, RIGHT, FULL OUTER joins\n- ✅ **Advanced Filtering**: WHERE clauses with AND/OR logic\n- ✅ **Aggregation Functions**: COUNT, SUM, AVG, MIN, MAX\n- ✅ **Built-in SQL Functions**: String, Math, and Date functions\n- ✅ **Automatic Indexing**: Hash and sorted indexes for performance\n- ✅ **Secure localStorage**: Encrypted data storage with SecureLS\n- ✅ **Grouping \u0026 Sorting**: GROUP BY, ORDER BY, HAVING clauses\n- ✅ **Pagination**: LIMIT and OFFSET support\n- ✅ **Named Parameters**: Clean parameterized queries\n\n## 📦 Installation\n\nInclude the library in your HTML file:\n\n```html\n\u003cscript src=\"query.js\"\u003e\u003c/script\u003e\n```\n\n## 🎯 Quick Start\n\n### Basic Data Operations\n\n```javascript\n// Simple data storage and retrieval\nquery.add(\"user_token\", \"abc123\");\nquery.add(\"user_data\", {id: 1, name: \"John\", email: \"john@example.com\"});\n\n// Retrieve data\nconst token = query.get(\"user_token\"); // Returns: \"abc123\"\nconst user = query.get(\"user_data\");   // Returns: {id: 1, name: \"John\", email: \"john@example.com\"}\n\n// Delete data\nquery.delete(\"user_token\");  // Removes the token from storage\nquery.delete(\"user_data\");   // Removes the user data from storage\n```\n\n### Working with Arrays\n\n```javascript\nconst users = [\n  {id: 1, name: \"John\", age: 25, department: \"IT\"},\n  {id: 2, name: \"Jane\", age: 30, department: \"HR\"},\n  {id: 3, name: \"Bob\", age: 35, department: \"IT\"}\n];\n\n// SELECT all users\nconst allUsers = query(\"SELECT * FROM ?\", [users]);\n\n// SELECT with conditions\nconst itUsers = query(\"SELECT * FROM ? WHERE department = ?\", [users, \"IT\"]);\n\n// SELECT specific columns\nconst names = query(\"SELECT name, age FROM ?\", [users]);\n```\n\n## 📚 Complete Documentation\n\n### 1. Data Storage Functions\n\n#### `query.add(key, value)`\nStores data securely in localStorage with encryption.\n\n```javascript\n// Store simple values\nquery.add(\"app_version\", \"1.0.0\");\nquery.add(\"user_preferences\", {theme: \"dark\", language: \"en\"});\n\n// Store arrays\nquery.add(\"shopping_cart\", [\n  {id: 1, product: \"Laptop\", price: 999},\n  {id: 2, product: \"Mouse\", price: 25}\n]);\n```\n\n#### `query.get(key)`\nRetrieves data from secure localStorage.\n\n```javascript\nconst version = query.get(\"app_version\");\nconst preferences = query.get(\"user_preferences\");\nconst cart = query.get(\"shopping_cart\");\n```\n\n#### `query.delete(key)`\nRemoves data from secure localStorage.\n\n```javascript\n// Delete specific data\nquery.delete(\"user_token\");\nquery.delete(\"user_preferences\");\nquery.delete(\"shopping_cart\");\n\n// Example: Logout function\nfunction logout() {\n  query.delete(\"auth_token\");\n  query.delete(\"user_data\");\n  query.delete(\"user_preferences\");\n  console.log(\"User logged out successfully\");\n}\n```\n\n### 2. Table Management\n\n#### `query.saveTable(tableName, data)`\nSaves an array as a table in localStorage.\n\n```javascript\nconst employees = [\n  {id: 1, name: \"Alice\", salary: 60000, department: \"Engineering\"},\n  {id: 2, name: \"Bob\", salary: 55000, department: \"Marketing\"},\n  {id: 3, name: \"Carol\", salary: 70000, department: \"Engineering\"}\n];\n\nquery.saveTable(\"employees\", employees);\n```\n\n#### `query.getTable(tableName)`\nRetrieves a table from localStorage.\n\n```javascript\nconst employees = query.getTable(\"employees\");\n```\n\n#### `query.listTables()`\nLists all available tables.\n\n```javascript\nconst tables = query.listTables();\nconsole.log(tables);\n// Output: [{name: \"employees\", rows: 3, size: 245}, ...]\n```\n\n#### `query.dropTable(tableName)`\nDeletes a table from localStorage.\n\n```javascript\nquery.dropTable(\"employees\");\n```\n\n### 3. Basic SQL Operations\n\n#### SELECT Queries\n\n```javascript\n// Basic SELECT\nconst results = query(\"SELECT * FROM employees\");\n\n// SELECT with WHERE clause\nconst highEarners = query(\"SELECT * FROM employees WHERE salary \u003e 60000\");\n\n// SELECT specific columns\nconst names = query(\"SELECT name, department FROM employees\");\n\n// SELECT with multiple conditions\nconst seniorEngineers = query(`\n  SELECT name, salary \n  FROM employees \n  WHERE department = 'Engineering' AND salary \u003e 65000\n`);\n```\n\n#### INSERT Operations\n\n```javascript\n// Insert single record\nquery(\"INSERT INTO employees\", [{\n  id: 4, \n  name: \"David\", \n  salary: 75000, \n  department: \"Engineering\"\n}]);\n\n// Insert multiple records\nquery(\"INSERT INTO employees\", [\n  {id: 5, name: \"Eva\", salary: 68000, department: \"Design\"},\n  {id: 6, name: \"Frank\", salary: 52000, department: \"Sales\"}\n]);\n```\n\n#### UPDATE Operations\n\n```javascript\n// Update with WHERE clause\nquery(\"UPDATE employees SET salary = 80000 WHERE name = 'Alice'\");\n\n// Update multiple fields\nquery(\"UPDATE employees SET salary = 65000, department = 'Senior Engineering' WHERE id = 1\");\n\n// Update with functions\nquery(\"UPDATE employees SET salary = ROUND(salary * 1.1) WHERE department = 'Engineering'\");\n```\n\n#### DELETE Operations\n\n```javascript\n// Delete with condition\nquery(\"DELETE FROM employees WHERE salary \u003c 55000\");\n\n// Delete all records\nquery(\"DELETE FROM employees\");\n```\n\n### 4. Advanced Querying\n\n#### GROUP BY and Aggregations\n\n```javascript\n// Count employees by department\nconst deptCounts = query(`\n  SELECT department, COUNT(*) as employee_count \n  FROM employees \n  GROUP BY department\n`);\n\n// Average salary by department\nconst avgSalaries = query(`\n  SELECT department, AVG(salary) as avg_salary \n  FROM employees \n  GROUP BY department\n`);\n\n// Multiple aggregations\nconst deptStats = query(`\n  SELECT \n    department,\n    COUNT(*) as count,\n    AVG(salary) as avg_salary,\n    MIN(salary) as min_salary,\n    MAX(salary) as max_salary\n  FROM employees \n  GROUP BY department\n`);\n```\n\n#### ORDER BY and LIMIT\n\n```javascript\n// Sort by salary (descending)\nconst topEarners = query(`\n  SELECT name, salary \n  FROM employees \n  ORDER BY salary DESC\n`);\n\n// Pagination with LIMIT and OFFSET\nconst page1 = query(`\n  SELECT * \n  FROM employees \n  ORDER BY name \n  LIMIT 5\n`);\n\nconst page2 = query(`\n  SELECT * \n  FROM employees \n  ORDER BY name \n  LIMIT 5 OFFSET 5\n`);\n```\n\n#### DISTINCT Values\n\n```javascript\n// Get unique departments\nconst departments = query(\"SELECT DISTINCT department FROM employees\");\n```\n\n### 5. JOIN Operations\n\n#### Setting up Sample Data\n\n```javascript\n// Employees table\nconst employees = [\n  {id: 1, name: \"Alice\", department_id: 1},\n  {id: 2, name: \"Bob\", department_id: 2},\n  {id: 3, name: \"Carol\", department_id: 1}\n];\n\n// Departments table\nconst departments = [\n  {id: 1, name: \"Engineering\", budget: 500000},\n  {id: 2, name: \"Marketing\", budget: 300000}\n];\n\nquery.saveTable(\"employees\", employees);\nquery.saveTable(\"departments\", departments);\n```\n\n#### INNER JOIN\n\n```javascript\nconst employeeDetails = query(`\n  SELECT e.name, d.name as department_name, d.budget\n  FROM employees e\n  INNER JOIN departments d ON e.department_id = d.id\n`);\n```\n\n#### LEFT JOIN\n\n```javascript\nconst allEmployees = query(`\n  SELECT e.name, d.name as department_name\n  FROM employees e\n  LEFT JOIN departments d ON e.department_id = d.id\n`);\n```\n\n#### Complex JOIN with WHERE\n\n```javascript\nconst engineeringTeam = query(`\n  SELECT e.name, d.name as department, d.budget\n  FROM employees e\n  INNER JOIN departments d ON e.department_id = d.id\n  WHERE d.name = 'Engineering'\n`);\n```\n\n### 6. Built-in SQL Functions\n\n#### String Functions\n\n```javascript\nconst stringExamples = query(`\n  SELECT \n    name,\n    UPPER(name) as upper_name,\n    LOWER(name) as lower_name,\n    LENGTH(name) as name_length,\n    SUBSTRING(name, 1, 3) as first_three,\n    CONCAT(name, ' - Employee') as full_title\n  FROM employees\n`);\n```\n\n#### Math Functions\n\n```javascript\nconst mathExamples = query(`\n  SELECT \n    salary,\n    ROUND(salary / 12) as monthly_salary,\n    CEIL(salary / 1000) as salary_thousands_ceil,\n    FLOOR(salary / 1000) as salary_thousands_floor,\n    ABS(salary - 60000) as salary_diff,\n    POWER(salary / 1000, 2) as salary_squared\n  FROM employees\n`);\n```\n\n#### Date Functions\n\n```javascript\n// Add date fields to employees\nquery(\"UPDATE employees SET hire_date = '2023-01-15' WHERE id = 1\");\nquery(\"UPDATE employees SET hire_date = '2022-06-20' WHERE id = 2\");\n\nconst dateExamples = query(`\n  SELECT \n    name,\n    hire_date,\n    YEAR(hire_date) as hire_year,\n    MONTH(hire_date) as hire_month,\n    DAY(hire_date) as hire_day,\n    DATEDIFF('day', hire_date, NOW()) as days_employed\n  FROM employees\n`);\n```\n\n### 7. Named Parameters\n\n```javascript\n// Using named parameters for cleaner queries\nconst searchCriteria = {\n  minSalary: 60000,\n  dept: \"Engineering\"\n};\n\nconst results = query(`\n  SELECT name, salary, department \n  FROM employees \n  WHERE salary \u003e :minSalary AND department = :dept\n`, [searchCriteria]);\n```\n\n### 8. Performance Optimization with Indexes\n\n#### Creating Indexes\n\n```javascript\nconst largeDataset = [/* ... large array of objects ... */];\n\n// Create hash index for equality searches\nquery.createIndex(largeDataset, 'department', 'hash');\n\n// Create sorted index for range queries\nquery.createIndex(largeDataset, 'salary', 'sorted');\n```\n\n#### Index Information\n\n```javascript\n// Get index information\nconst indexInfo = query.getIndexInfo(largeDataset);\nconsole.log(indexInfo);\n\n// Drop specific index\nquery.dropIndex(largeDataset, 'department', 'hash');\n\n// Drop all indexes\nquery.dropAllIndexes(largeDataset);\n```\n\n### 9. Complex Real-World Examples\n\n#### E-commerce Order Analysis\n\n```javascript\n// Sample e-commerce data\nconst orders = [\n  {id: 1, customer_id: 1, product: \"Laptop\", amount: 999, date: \"2024-01-15\"},\n  {id: 2, customer_id: 2, product: \"Mouse\", amount: 25, date: \"2024-01-16\"},\n  {id: 3, customer_id: 1, product: \"Keyboard\", amount: 75, date: \"2024-01-17\"}\n];\n\nconst customers = [\n  {id: 1, name: \"John Doe\", email: \"john@example.com\", city: \"New York\"},\n  {id: 2, name: \"Jane Smith\", email: \"jane@example.com\", city: \"Los Angeles\"}\n];\n\nquery.saveTable(\"orders\", orders);\nquery.saveTable(\"customers\", customers);\n\n// Monthly sales report\nconst monthlySales = query(`\n  SELECT \n    MONTH(date) as month,\n    COUNT(*) as order_count,\n    SUM(amount) as total_revenue,\n    AVG(amount) as avg_order_value\n  FROM orders \n  GROUP BY MONTH(date)\n  ORDER BY month\n`);\n\n// Customer order summary\nconst customerSummary = query(`\n  SELECT \n    c.name,\n    c.city,\n    COUNT(o.id) as order_count,\n    SUM(o.amount) as total_spent,\n    AVG(o.amount) as avg_order\n  FROM customers c\n  LEFT JOIN orders o ON c.id = o.customer_id\n  GROUP BY c.id, c.name, c.city\n  ORDER BY total_spent DESC\n`);\n```\n\n#### Inventory Management\n\n```javascript\nconst inventory = [\n  {id: 1, product: \"Laptop\", category: \"Electronics\", stock: 50, price: 999},\n  {id: 2, product: \"Mouse\", category: \"Electronics\", stock: 200, price: 25},\n  {id: 3, product: \"Desk\", category: \"Furniture\", stock: 15, price: 299}\n];\n\nquery.saveTable(\"inventory\", inventory);\n\n// Low stock alerts\nconst lowStock = query(`\n  SELECT product, stock, price, (stock * price) as stock_value\n  FROM inventory \n  WHERE stock \u003c 20\n  ORDER BY stock_value DESC\n`);\n\n// Category analysis\nconst categoryStats = query(`\n  SELECT \n    category,\n    COUNT(*) as product_count,\n    SUM(stock) as total_stock,\n    AVG(price) as avg_price,\n    SUM(stock * price) as total_value\n  FROM inventory\n  GROUP BY category\n`);\n```\n\n#### User Analytics Dashboard\n\n```javascript\nconst userSessions = [\n  {user_id: 1, session_date: \"2024-01-15\", page_views: 15, duration: 1200},\n  {user_id: 2, session_date: \"2024-01-15\", page_views: 8, duration: 600},\n  {user_id: 1, session_date: \"2024-01-16\", page_views: 22, duration: 1800}\n];\n\nquery.saveTable(\"user_sessions\", userSessions);\n\n// Daily engagement metrics\nconst dailyMetrics = query(`\n  SELECT \n    session_date,\n    COUNT(DISTINCT user_id) as unique_users,\n    SUM(page_views) as total_page_views,\n    AVG(page_views) as avg_page_views,\n    SUM(duration) as total_duration,\n    AVG(duration) as avg_session_duration\n  FROM user_sessions\n  GROUP BY session_date\n  ORDER BY session_date\n`);\n\n// Power users (high engagement)\nconst powerUsers = query(`\n  SELECT \n    user_id,\n    COUNT(*) as session_count,\n    SUM(page_views) as total_page_views,\n    AVG(duration) as avg_duration\n  FROM user_sessions\n  GROUP BY user_id\n  HAVING SUM(page_views) \u003e 20\n  ORDER BY total_page_views DESC\n`);\n```\n\n### 10. Error Handling\n\n```javascript\ntry {\n  const result = query(\"SELECT * FROM nonexistent_table\");\n} catch (error) {\n  console.error(\"Query error:\", error.message);\n}\n\n// Check if table exists before querying\nconst tables = query.listTables();\nconst tableExists = tables.some(table =\u003e table.name === \"employees\");\n\nif (tableExists) {\n  const employees = query(\"SELECT * FROM employees\");\n} else {\n  console.log(\"Employees table not found\");\n}\n```\n\n### 11. Best Practices\n\n#### 1. Use Indexes for Large Datasets\n\n```javascript\n// For datasets \u003e 100 records, create indexes\nif (employees.length \u003e 100) {\n  query.createIndex(employees, 'department', 'hash');\n  query.createIndex(employees, 'salary', 'sorted');\n}\n```\n\n#### 2. Named Parameters for Dynamic Queries\n\n```javascript\nfunction searchEmployees(filters) {\n  const conditions = [];\n  const params = {};\n  \n  if (filters.department) {\n    conditions.push(\"department = :dept\");\n    params.dept = filters.department;\n  }\n  \n  if (filters.minSalary) {\n    conditions.push(\"salary \u003e= :minSal\");\n    params.minSal = filters.minSalary;\n  }\n  \n  const whereClause = conditions.length \u003e 0 ? \"WHERE \" + conditions.join(\" AND \") : \"\";\n  \n  return query(`SELECT * FROM employees ${whereClause}`, [params]);\n}\n```\n\n#### 3. Efficient Data Updates\n\n```javascript\n// Batch operations are more efficient\nconst updates = [\n  {id: 1, salary: 75000},\n  {id: 2, salary: 65000}\n];\n\n// Instead of multiple UPDATE queries, use this approach:\nupdates.forEach(update =\u003e {\n  query(\"UPDATE employees SET salary = ? WHERE id = ?\", [update.salary, update.id]);\n});\n```\n\n## 🔧 Configuration\n\n### SecureLS Options\n\nThe library uses SecureLS for encrypted localStorage. You can configure encryption options:\n\n```javascript\n// The library automatically handles encryption, but you can access SecureLS features\n// through the secure storage functions\n```\n\n## 📊 Performance Tips\n\n1. **Use Indexes**: Create indexes for frequently queried columns\n2. **Limit Results**: Use LIMIT for large datasets\n3. **Efficient JOINs**: Index columns used in JOIN conditions\n4. **Batch Operations**: Group multiple operations when possible\n\n## 🐛 Troubleshooting\n\n### Common Issues\n\n1. **\"First parameter must be an array\" error**\n   - Ensure you're passing data as the second parameter: `query(\"SELECT * FROM ?\", [data])`\n\n2. **localStorage quota exceeded**\n   - Clear unused tables: `query.dropTable(\"unused_table\")`\n   - Or clear all: `query.clearAllTables()`\n\n3. **JOIN queries not working**\n   - Ensure table names in JOIN queries exist in localStorage\n   - Check that JOIN conditions reference correct column names\n\n## 📝 License\n\nMIT License - feel free to use in your projects!\n\n## 🤝 Contributing\n\nContributions are welcome! Please feel free to submit issues and pull requests.\n\n## 📞 Support\n\nIf you encounter any issues or have questions, please file an issue on the GitHub repository.\n\n---\n\n**Query.js** - Bringing the power of SQL to your JavaScript applications! 🚀\n\n// SELECT - Automatically reads from localStorage\nconst allUsers = query(\"SELECT * FROM users\");\nconst activeUsers = query(\"SELECT * FROM users WHERE active = true\");\n\n// UPDATE - Modifies data in localStorage\nquery(\"UPDATE users SET active = false WHERE age \u003e 30\");\n\n// DELETE - Removes data from localStorage\nquery(\"DELETE FROM users WHERE active = false\");\n```\n\n## 📦 Installation\n\n### Option 1: Direct Download\nDownload `query.js` and include it in your HTML:\n\n```html\n\u003cscript src=\"query.js\"\u003e\u003c/script\u003e\n```\n\n\n## 📚 Documentation\n\n### Core Operations\n\n#### SELECT Queries\n\n```javascript\n// Basic SELECT\nquery(\"SELECT * FROM users\");\nquery(\"SELECT name, age FROM users\");\n\n// WHERE conditions\nquery(\"SELECT * FROM users WHERE age \u003e 25\");\nquery(\"SELECT * FROM users WHERE name LIKE 'John%'\");\nquery(\"SELECT * FROM users WHERE age BETWEEN 25 AND 35\");\n\n// ORDER BY\nquery(\"SELECT * FROM users ORDER BY age DESC\");\nquery(\"SELECT * FROM users ORDER BY name ASC\");\n\n// LIMIT and OFFSET\nquery(\"SELECT * FROM users LIMIT 10\");\nquery(\"SELECT * FROM users LIMIT 10 OFFSET 20\");\n\n// DISTINCT\nquery(\"SELECT DISTINCT department FROM users\");\n```\n\n#### Aggregations and GROUP BY\n\n```javascript\n// Aggregation functions\nquery(\"SELECT COUNT(*) as total FROM users\");\nquery(\"SELECT AVG(age) as average_age FROM users\");\nquery(\"SELECT MIN(age) as youngest, MAX(age) as oldest FROM users\");\n\n// GROUP BY\nquery(\"SELECT department, COUNT(*) as count FROM users GROUP BY department\");\nquery(\"SELECT department, AVG(salary) as avg_salary FROM users GROUP BY department HAVING avg_salary \u003e 50000\");\n```\n\n#### INSERT Operations\n\n```javascript\n// Insert single record\nquery(\"INSERT INTO users\", [{ id: 1, name: 'John', age: 30 }]);\n\n// Insert multiple records\nquery(\"INSERT INTO users\", [\n  { id: 2, name: 'Jane', age: 25 },\n  { id: 3, name: 'Bob', age: 35 }\n]);\n```\n\n#### UPDATE Operations\n\n```javascript\n// Update with WHERE clause\nquery(\"UPDATE users SET active = false WHERE age \u003e 65\");\nquery(\"UPDATE users SET department = 'Engineering', salary = 75000 WHERE id = 1\");\n\n// Update multiple fields\nquery(\"UPDATE users SET active = true, last_login = '2024-01-01' WHERE department = 'Sales'\");\n\n// update via object syntax\n//query(\"UPDATE users SET ? WHERE id = 1\", [{key1:value,key2:value, }, where_equals_value]);\nquery(\"UPDATE users SET ? WHERE age = ?\", [{ name: \"Updated\", age: 26 }, 25]);\n\n\n```\n\n#### DELETE Operations\n\n```javascript\n// Delete with conditions\nquery(\"DELETE FROM users WHERE active = false\");\nquery(\"DELETE FROM users WHERE age \u003c 18\");\n\n// Delete all records\nquery(\"DELETE FROM users\");\n```\n\n### Advanced Features\n\n#### Named Parameters\n\n```javascript\nconst params = {\n  tbl: 'users',\n  minAge: 25,\n  department: 'Engineering'\n};\n\nquery(\"SELECT * FROM :tbl WHERE age \u003e :minAge AND department = :department\", [params]);\n```\n\n#### Complex WHERE Conditions\n\n```javascript\n// Multiple conditions\nquery(\"SELECT * FROM users WHERE (age \u003e 25 AND department = 'Engineering') OR (age \u003e 30 AND department = 'Sales')\");\n\n// NULL checks\nquery(\"SELECT * FROM users WHERE email IS NOT NULL\");\nquery(\"SELECT * FROM users WHERE phone IS NULL\");\n\n// LIKE patterns\nquery(\"SELECT * FROM users WHERE email LIKE '%@company.com'\");\nquery(\"SELECT * FROM users WHERE name LIKE 'John_'\"); // _ matches single character\n```\n\n### LocalStorage Utilities\n\n```javascript\n// Get table data\nconst users = query.getTable('users');\n\n// Save array to localStorage\nquery.saveTable('products', productsArray);\n\n// List all localStorage tables\nconst tables = query.listTables();\nconsole.log(tables);\n// Output: [{ name: 'users', rows: 150, size: 25600 }, ...]\n\n// Drop a table\nquery.dropTable('old_data');\n\n// Clear all tables\nconst deletedCount = query.clearAllTables();\n```\n\n### Performance Optimization\n\n#### Indexing\n\n```javascript\n// Create indexes for better performance\nquery.createIndex(dataArray, 'email', 'hash');     // For equality lookups\nquery.createIndex(dataArray, 'age', 'sorted');     // For range queries\n\n// Auto-indexing (automatically creates indexes for large datasets)\n// Happens automatically when querying datasets \u003e 100 rows\n\n// Get index information\nconst indexInfo = query.getIndexInfo(dataArray);\n\n// Drop indexes\nquery.dropIndex(dataArray, 'email', 'hash');\nquery.dropAllIndexes(dataArray);\n```\n\n## 🎯 Use Cases\n\n### 1. Client-Side Data Management\n```javascript\n// Store user preferences\nquery(\"INSERT INTO preferences\", [{ theme: 'dark', language: 'en', notifications: true }]);\n\n// Retrieve settings\nconst settings = query(\"SELECT * FROM preferences LIMIT 1\")[0];\n```\n\n### 2. Offline-First Applications\n```javascript\n// Cache API responses\nquery(\"INSERT INTO cache\", apiResponse.data);\n\n// Query cached data\nconst cachedResults = query(\"SELECT * FROM cache WHERE timestamp \u003e '2024-01-01'\");\n```\n\n### 3. Form Data Management\n```javascript\n// Save form drafts\nquery(\"INSERT INTO drafts\", [{ formId: 'contact', data: formData, savedAt: new Date() }]);\n\n// Load latest draft\nconst draft = query(\"SELECT * FROM drafts WHERE formId = 'contact' ORDER BY savedAt DESC LIMIT 1\")[0];\n```\n\n### 4. Analytics and Reporting\n```javascript\n// Track user interactions\nquery(\"INSERT INTO analytics\", [{ \n  event: 'page_view', \n  page: '/dashboard', \n  timestamp: Date.now(),\n  userId: currentUser.id \n}]);\n\n// Generate reports\nconst pageViews = query(`\n  SELECT page, COUNT(*) as views \n  FROM analytics \n  WHERE event = 'page_view' \n  GROUP BY page \n  ORDER BY views DESC\n`);\n```\n\n## 🔧 API Reference\n\n### Core Function\n\n#### `query(sql, params = [])`\nExecutes a SQL-like query on data.\n\n**Parameters:**\n- `sql` (string): SQL query string\n- `params` (array): Parameters for the query\n\n**Returns:** Query results (array for SELECT, object for UPDATE/DELETE, array for INSERT)\n\n### Utility Functions\n\n#### `query.getTable(tableName)`\nRetrieves table data from localStorage.\n\n#### `query.saveTable(tableName, data)`\nSaves array data to localStorage.\n\n#### `query.listTables()`\nReturns list of all localStorage tables with metadata.\n\n#### `query.dropTable(tableName)`\nRemoves a table from localStorage.\n\n#### `query.clearAllTables()`\nRemoves all tables from localStorage.\n\n### Index Management\n\n#### `query.createIndex(dataArray, column, type)`\nCreates an index on a column.\n\n#### `query.dropIndex(dataArray, column, type)`\nRemoves an index.\n\n#### `query.getIndexInfo(dataArray)`\nReturns information about existing indexes.\n\n## ⚡ Performance Tips\n\n1. **Use Indexes**: Create indexes on frequently queried columns\n2. **Limit Results**: Use LIMIT for large datasets\n3. **Specific Selects**: Select only needed columns instead of using `*`\n4. **Batch Operations**: Insert multiple records in single operation\n5. **Cache Results**: Store frequently accessed query results\n\n## 🐛 Error Handling\n\n```javascript\ntry {\n  const result = query(\"SELECT * FROM users WHERE invalid_syntax\");\n} catch (error) {\n  console.error('Query failed:', error.message);\n}\n\n// Handle localStorage quota exceeded\ntry {\n  query(\"INSERT INTO large_table\", massiveDataArray);\n} catch (error) {\n  if (error.message.includes('quota exceeded')) {\n    // Handle storage limit\n    query.clearAllTables(); // or implement cleanup strategy\n  }\n}\n```\n\n## 🔒 Browser Compatibility\n\n- **Modern Browsers**: Chrome 45+, Firefox 40+, Safari 10+, Edge 12+\n- **LocalStorage**: All modern browsers (IE 8+)\n- **ES6 Features**: Uses Map, Set, arrow functions (transpile for older browsers if needed)\n\n\n\n## Legacy Documentation\n\n### Original Features (Still Supported)\n- 📈 **ORDER BY** (ASC/DESC) \n- 📄 **LIMIT** and **OFFSET** for pagination\n- ✨ **DISTINCT** for unique results\n\n### Aggregate Functions\n- `COUNT(*)` - Count all rows\n- `COUNT(column)` - Count non-null values\n- `SUM(column)` - Sum numeric values\n- `AVG(column)` - Calculate averages\n- `MIN(column)` - Find minimum values\n- `MAX(column)` - Find maximum values\n\n### Advanced Operators\n- `BETWEEN` - Range queries\n- `LIKE` - Pattern matching with wildcards (`%`, `_`)\n- `IS NULL` / `IS NOT NULL` - Null checking\n- `AND` / `OR` - Logical operations with proper precedence\n\n### Modern Syntax Support\n- 🏷️ **Named Parameters** (`:parameter` syntax)\n- 📝 **Column Aliases** (`AS` keyword)\n- 🔗 **Parameterized Queries** for security\n\n## 🤝 Contributing\n\n1. Fork the repository\n2. Create a feature branch: `git checkout -b feature/amazing-feature`\n3. Commit your changes: `git commit -m 'Add amazing feature'`\n4. Push to the branch: `git push origin feature/amazing-feature`\n5. Open a Pull Request\n\n## 📄 License\n\nMIT License - see LICENSE file for details.\n\n## 🙏 Acknowledgments\n\n- Inspired by SQL standards and modern JavaScript practices\n- Built for developers who need powerful client-side data querying\n- Designed with performance and usability in mind\n\n---\n\n**Star ⭐ this repository if you find it useful!**\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcodewithmark%2Fquery","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcodewithmark%2Fquery","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcodewithmark%2Fquery/lists"}