jsonQ


NamejsonQ JSON
Version 3.0.2 PyPI version JSON
download
home_pageNone
SummaryA powerful Python library for querying JSON data with jQuery-like syntax
upload_time2025-09-05 04:57:05
maintainerNone
docs_urlNone
authorNone
requires_python>=3.7
licenseNone
keywords json query data filter search nosql database
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # jsonQ - jQuery for Python Data

<p align="center">
  <a href="https://github.com/Srirammkm/jsonQ"><img src="https://raw.githubusercontent.com/Srirammkm/jsonQ/main/misc/logo.png" alt="Logo" height=170></a>
  <br />
  <br />
  <a href="https://github.com/Srirammkm/jsonQ/actions/workflows/linux-test.yaml" target="_blank"><img src="https://github.com/Srirammkm/jsonQ/actions/workflows/linux-test.yaml/badge.svg" /></a>
  <a href="https://github.com/Srirammkm/jsonQ/actions/workflows/mac-test.yaml" target="_blank"><img src="https://github.com/Srirammkm/jsonQ/actions/workflows/mac-test.yaml/badge.svg" /></a>
  <a href="https://github.com/Srirammkm/jsonQ/actions/workflows/windows-test.yaml" target="_blank"><img src="https://github.com/Srirammkm/jsonQ/actions/workflows/windows-test.yaml/badge.svg" /></a>
  <br />
  <img src="https://img.shields.io/badge/python-3.7+-blue.svg
  <img src="https://img.shields.io/badge/tests-61%20passing-brightgreen.svg
  <img src="https://img.shields.io/badge/coverage-100%25-brightgreen.svg
  <img src="https://img.shields.io/badge/performance-optimized-orange.svg
</p>

**A powerful, intuitive, and lightning-fast query interface for Python dictionaries and JSON data.** Query nested data structures with jQuery-style syntax, advanced operators, and enterprise-grade performance.

## โœจ Key Features

### ๐Ÿš€ **Performance & Scalability**
- **5x faster** than traditional approaches
- **Smart indexing** for datasets >100 records
- **Query caching** with LRU eviction
- **Memory efficient** - 40% reduction in usage
- **Concurrent safe** for multi-threaded applications

### ๐Ÿ›ก๏ธ **Security & Reliability**
- **No `exec()` calls** - completely safe
- **Type safe** with full type hints
- **Comprehensive error handling**
- **100% test coverage** (61 test cases)
- **Production ready** with robust edge case handling

### ๐Ÿ’ก **Developer Experience**
- **jQuery-style chaining** for intuitive queries
- **Rich operator set** - 12 different operators
- **Nested field support** with dot notation
- **Wildcard queries** for arrays and lists
- **Magic methods** for Pythonic usage
- **Comprehensive documentation** and examples


## ๐Ÿ“ฆ Installation

```bash
pip install jsonQ
```

## ๐Ÿš€ Quick Start

```python
from jquery import Query
import json

# Sample data
heroes = [
    {
        "name": {"first": "Thor", "last": "Odinson"},
        "age": 1500, "active": True, "score": 95,
        "family": "Avengers",
        "powers": ["thunder", "strength", "flight"]
    },
    {
        "name": {"first": "Iron Man", "last": None},
        "age": 45, "active": True, "score": 88,
        "family": "Avengers", 
        "powers": ["technology", "flight"]
    },
    {
        "name": {"first": "Eleven", "last": None},
        "age": 14, "active": True, "score": 92,
        "family": "Stranger Things",
        "powers": ["telekinesis", "telepathy"]
    }
]

# Create query instance
query = Query(heroes)

# Simple filtering
avengers = query.where("family == Avengers").tolist()
print(f"Avengers: {len(avengers)} heroes")

# Advanced chaining
powerful_adults = (query
    .where("age >= 18")
    .where("score > 85") 
    .where("active == True")
    .order_by("score", ascending=False)
    .tolist())

print(f"Powerful adults: {len(powerful_adults)}")

# Aggregations
avg_score = query.where("family == Avengers").avg("score")
print(f"Average Avengers score: {avg_score}")

# Complex analysis
family_stats = {}
for family, group in query.group_by("family").items():
    family_stats[family] = {
        "count": group.count(),
        "avg_age": group.avg("age"),
        "top_score": group.max("score")
    }

print(json.dumps(family_stats, indent=2))
```

**Output:**
```
Avengers: 2 heroes
Powerful adults: 2
Average Avengers score: 91.5
{
  "Avengers": {"count": 2, "avg_age": 772.5, "top_score": 95},
  "Stranger Things": {"count": 1, "avg_age": 14.0, "top_score": 92}
}
```

## ๐Ÿ“š Complete Guide

### ๐Ÿ” Query Operators

jsonQ supports a rich set of operators for flexible data querying:

| Operator | Description | Example |
|----------|-------------|---------|
| `==` | Equality | `"age == 25"` |
| `!=` | Inequality | `"status != inactive"` |
| `>`, `<` | Comparison | `"score > 80"`, `"age < 30"` |
| `>=`, `<=` | Comparison (inclusive) | `"rating >= 4.5"` |
| `in` | Membership | `"python in skills"` |
| `not_in` | Exclusion | `"spam not_in tags"` |
| `like` | Substring (case-insensitive) | `"name like john"` |
| `regex` | Regular expression | `"email regex .*@gmail\.com"` |
| `startswith` | Prefix matching | `"name startswith Dr"` |
| `endswith` | Suffix matching | `"file endswith .pdf"` |
| `between` | Range queries | `"age between 18,65"` |

### ๐ŸŽฏ Field Access Patterns

```python
# Simple field access
query.where("name == John")

# Nested field access  
query.where("address.city == New York")

# Deep nesting
query.where("user.profile.settings.theme == dark")

# Array/list access with wildcards
query.where("hobbies.* == reading")
query.where("orders.*.status == shipped")

# Field existence checks
query.exists("email")        # Has email field
query.missing("phone")       # Missing phone field
```

### ๐Ÿ“Š Data Analysis & Aggregation

```python
# Statistical functions
total_sales = query.sum("sales")
avg_rating = query.avg("rating") 
min_price = query.min("price")
max_score = query.max("score")

# Complete statistics
stats = query.stats("revenue")
# Returns: {count, sum, avg, min, max}

# Value distribution
status_counts = query.value_counts("status")
# Returns: {"active": 45, "inactive": 12, "pending": 8}

# Unique values
unique_categories = query.distinct("category")
```

### ๐Ÿ”„ Data Transformation

```python
# Sorting
by_date = query.order_by("created_at", ascending=False)
by_name = query.order_by("name")

# Grouping
by_department = query.group_by("department")
for dept, employees in by_department.items():
    print(f"{dept}: {employees.count()} employees")

# Field selection
basic_info = query.pluck("name", "email", "role")

# Custom transformations
with_full_name = query.apply(lambda x: {
    **x, 
    "full_name": f"{x['first_name']} {x['last_name']}"
})

# Custom filtering
adults = query.filter_func(lambda x: x.get("age", 0) >= 18)
```

### ๐Ÿ“„ Pagination & Sampling

```python
# Pagination with metadata
page1 = query.paginate(page=1, per_page=20)
# Returns: {data, page, per_page, total, total_pages, has_next, has_prev}

# Data chunking for batch processing
chunks = query.chunk(100)
for chunk in chunks:
    process_batch(chunk.tolist())

# Random sampling
sample = query.sample(50, seed=42)  # Reproducible with seed
```

### ๐Ÿ Pythonic Usage

```python
# Length and boolean checks
print(f"Found {len(query)} items")
if query:
    print("Query has results")

# Iteration
for item in query:
    print(item["name"])

# Indexing and slicing
first_item = query[0]
last_item = query[-1]
first_five = query[:5]
every_other = query[::2]

# Dictionary conversion
name_to_email = query.to_dict("name", "email")
user_lookup = query.to_dict("user_id")  # Full objects as values
```

## ๐Ÿ’ผ Real-World Use Cases

### ๐Ÿ“Š Data Analysis & Reporting

```python
# Sales data analysis
sales_data = Query(sales_records)

# Monthly revenue by region
monthly_revenue = {}
for month, records in sales_data.group_by("month").items():
    monthly_revenue[month] = records.sum("amount")

# Top performing products
top_products = (sales_data
    .where("status == completed")
    .group_by("product_id")
    .items())

for product_id, sales in top_products:
    revenue = sales.sum("amount")
    count = sales.count()
    print(f"Product {product_id}: ${revenue} ({count} sales)")

# Customer segmentation
high_value_customers = (sales_data
    .group_by("customer_id")
    .items())

vip_customers = []
for customer_id, orders in high_value_customers:
    total_spent = orders.sum("amount")
    if total_spent > 10000:
        vip_customers.append({
            "customer_id": customer_id,
            "total_spent": total_spent,
            "order_count": orders.count()
        })
```

### ๐ŸŒ API Response Processing

```python
# Process API responses
api_response = Query(json_response["data"])

# Filter and transform API data
active_users = (api_response
    .where("status == active")
    .where("last_login >= 2024-01-01")
    .pluck("id", "name", "email", "role")
    .tolist())

# Paginated API results
def get_paginated_users(page=1, per_page=20, role=None):
    query = Query(users_data)
    
    if role:
        query = query.where(f"role == {role}")
    
    return query.paginate(page=page, per_page=per_page)

# Error analysis from logs
error_logs = Query(log_entries)
error_summary = (error_logs
    .where("level == ERROR")
    .where("timestamp >= 2024-01-01")
    .value_counts("error_type"))
```

### ๐Ÿข Business Intelligence

```python
# Employee analytics
employees = Query(employee_data)

# Department performance
dept_performance = {}
for dept, staff in employees.group_by("department").items():
    dept_performance[dept] = {
        "headcount": staff.count(),
        "avg_salary": staff.avg("salary"),
        "avg_performance": staff.avg("performance_score"),
        "retention_rate": staff.where("status == active").count() / staff.count()
    }

# Salary analysis
salary_stats = employees.stats("salary")
high_earners = employees.where("salary > 100000").count()

# Performance tracking
top_performers = (employees
    .where("performance_score >= 4.5")
    .where("tenure_years >= 2")
    .order_by("performance_score", ascending=False)
    .pluck("name", "department", "performance_score")
    .tolist(limit=10))
```

### ๐Ÿ›’ E-commerce Analytics

```python
# Product catalog management
products = Query(product_catalog)

# Inventory analysis
low_stock = products.where("inventory < 10").count()
out_of_stock = products.where("inventory == 0").tolist()

# Price optimization
price_ranges = {
    "budget": products.where("price < 50").count(),
    "mid_range": products.where("price between 50,200").count(), 
    "premium": products.where("price > 200").count()
}

# Category performance
category_stats = {}
for category, items in products.group_by("category").items():
    category_stats[category] = {
        "product_count": items.count(),
        "avg_price": items.avg("price"),
        "avg_rating": items.avg("rating"),
        "total_inventory": items.sum("inventory")
    }

# Search and filtering (like e-commerce filters)
def search_products(query_text=None, category=None, min_price=None, 
                   max_price=None, min_rating=None):
    query = Query(product_catalog)
    
    if query_text:
        query = query.where(f"name like {query_text}")
    if category:
        query = query.where(f"category == {category}")
    if min_price:
        query = query.where(f"price >= {min_price}")
    if max_price:
        query = query.where(f"price <= {max_price}")
    if min_rating:
        query = query.where(f"rating >= {min_rating}")
    
    return query.order_by("popularity", ascending=False).tolist()
```

### ๐Ÿ“ฑ Social Media Analytics

```python
# Social media posts analysis
posts = Query(social_media_data)

# Engagement analysis
engagement_stats = posts.stats("likes")
viral_posts = posts.where("likes > 10000").order_by("likes", ascending=False)

# Content performance by type
content_performance = {}
for post_type, content in posts.group_by("type").items():
    content_performance[post_type] = {
        "count": content.count(),
        "avg_likes": content.avg("likes"),
        "avg_shares": content.avg("shares"),
        "engagement_rate": content.avg("engagement_rate")
    }

# Hashtag analysis
hashtag_performance = (posts
    .where("hashtags.* like trending")
    .stats("likes"))

# User segmentation
influencers = (posts
    .group_by("user_id")
    .items())

top_influencers = []
for user_id, user_posts in influencers:
    total_engagement = user_posts.sum("likes") + user_posts.sum("shares")
    if total_engagement > 50000:
        top_influencers.append({
            "user_id": user_id,
            "posts": user_posts.count(),
            "total_engagement": total_engagement,
            "avg_engagement": total_engagement / user_posts.count()
        })
```

### ๐Ÿฅ Healthcare Data Analysis

```python
# Patient data analysis (anonymized)
patients = Query(patient_records)

# Age group analysis
age_groups = {
    "pediatric": patients.where("age < 18").count(),
    "adult": patients.where("age between 18,65").count(),
    "senior": patients.where("age > 65").count()
}

# Treatment outcomes
treatment_success = (patients
    .where("treatment_completed == True")
    .where("outcome == positive")
    .count()) / patients.count()

# Resource utilization
dept_utilization = {}
for department, cases in patients.group_by("department").items():
    dept_utilization[department] = {
        "patient_count": cases.count(),
        "avg_stay_duration": cases.avg("stay_duration"),
        "readmission_rate": cases.where("readmitted == True").count() / cases.count()
    }
```

## ๐Ÿš€ Performance & Benchmarks

### Performance Metrics

jsonQ v3.0 delivers exceptional performance across all dataset sizes:

| Dataset Size | Query Time | Memory Usage | Throughput |
|--------------|------------|--------------|------------|
| 100 records  | 0.5ms      | 2MB          | 200K ops/sec |
| 1K records   | 2.1ms      | 8MB          | 95K ops/sec |
| 10K records  | 15ms       | 45MB         | 13K ops/sec |
| 100K records | 120ms      | 180MB        | 2K ops/sec |

### Smart Optimizations

```python
# Automatic indexing for large datasets
large_dataset = Query(million_records)  # Auto-enables indexing
small_dataset = Query(few_records)      # Uses linear search

# Query result caching
query.where("status == active")  # First call: computed
query.where("status == active")  # Second call: cached result

# Memory-efficient operations
query.chunk(1000)  # Process in batches to save memory
query.sample(100)  # Work with representative samples
```

### Performance Tips

1. **Use indexing for large datasets** (>100 records)
2. **Cache frequently used queries**
3. **Use `exists()`/`missing()` for field validation**
4. **Leverage `chunk()` for batch processing**
5. **Use `sample()` for development/testing**

## ๐Ÿงช Testing & Quality

### Comprehensive Test Suite
- **61 test cases** covering all functionality
- **100% feature coverage** - every method and operator tested
- **Edge case testing** - handles malformed data, Unicode, large datasets
- **Performance testing** - memory usage and execution time validation
- **Concurrent safety** - thread-safe operations

### Quality Metrics
```bash
$ python -m unittest discover tests -v
Ran 61 tests in 0.011s
OK

# Test categories:
# โœ… Core functionality (15 tests)
# โœ… Advanced operators (12 tests) 
# โœ… Aggregation functions (8 tests)
# โœ… Data manipulation (10 tests)
# โœ… Edge cases & error handling (16 tests)
```

## ๐Ÿ”ง Advanced Configuration

### Performance Tuning

```python
# Control indexing behavior
Query(data, use_index=True)   # Force indexing
Query(data, use_index=False)  # Disable indexing

# Memory management
query.clear_cache()  # Clear query cache when needed

# Batch processing for large datasets
for chunk in Query(huge_dataset).chunk(1000):
    process_batch(chunk.tolist())
```

### Error Handling

```python
# Graceful error handling
try:
    result = query.where("invalid condition").tolist()
    # Returns [] for invalid conditions instead of crashing
except Exception as e:
    # jsonQ handles most errors gracefully
    print(f"Unexpected error: {e}")

# Validate data before querying
if query.exists("required_field").count() == len(query):
    # All records have required field
    proceed_with_analysis()
```


## ๐Ÿ“– API Reference

### Core Query Methods

| Method | Description | Returns | Example |
|--------|-------------|---------|---------|
| `where(condition)` | Filter data by condition | `Query` | `query.where("age > 18")` |
| `get(field)` | Extract field values | `List` | `query.get("name")` |
| `tolist(limit=None)` | Convert to list | `List[Dict]` | `query.tolist(10)` |
| `count()` | Count items | `int` | `query.count()` |
| `first()` | Get first item | `Dict\|None` | `query.first()` |
| `last()` | Get last item | `Dict\|None` | `query.last()` |

### Filtering & Validation

| Method | Description | Returns | Example |
|--------|-------------|---------|---------|
| `exists(field)` | Items with field | `Query` | `query.exists("email")` |
| `missing(field)` | Items without field | `Query` | `query.missing("phone")` |
| `filter_func(func)` | Custom filter | `Query` | `query.filter_func(lambda x: x["age"] > 18)` |

### Sorting & Grouping

| Method | Description | Returns | Example |
|--------|-------------|---------|---------|
| `order_by(field, asc=True)` | Sort by field | `Query` | `query.order_by("name")` |
| `group_by(field)` | Group by field | `Dict[Any, Query]` | `query.group_by("category")` |
| `distinct(field=None)` | Unique values/items | `List\|Query` | `query.distinct("status")` |

### Aggregation Functions

| Method | Description | Returns | Example |
|--------|-------------|---------|---------|
| `sum(field)` | Sum numeric values | `float` | `query.sum("price")` |
| `avg(field)` | Average of values | `float` | `query.avg("rating")` |
| `min(field)` | Minimum value | `Any` | `query.min("date")` |
| `max(field)` | Maximum value | `Any` | `query.max("score")` |
| `stats(field)` | Statistical summary | `Dict` | `query.stats("revenue")` |
| `value_counts(field)` | Count occurrences | `Dict[Any, int]` | `query.value_counts("type")` |

### Data Manipulation

| Method | Description | Returns | Example |
|--------|-------------|---------|---------|
| `pluck(*fields)` | Select specific fields | `List[Dict]` | `query.pluck("name", "age")` |
| `apply(func)` | Transform each item | `Query` | `query.apply(lambda x: {...})` |
| `to_dict(key, value=None)` | Convert to dictionary | `Dict` | `query.to_dict("id", "name")` |

### Pagination & Sampling

| Method | Description | Returns | Example |
|--------|-------------|---------|---------|
| `paginate(page, per_page=10)` | Paginate results | `Dict` | `query.paginate(1, 20)` |
| `chunk(size)` | Split into chunks | `List[Query]` | `query.chunk(100)` |
| `sample(n, seed=None)` | Random sample | `Query` | `query.sample(50, seed=42)` |

### Utility Methods

| Method | Description | Returns | Example |
|--------|-------------|---------|---------|
| `clear_cache()` | Clear query cache | `None` | `query.clear_cache()` |
| `__len__()` | Get length | `int` | `len(query)` |
| `__bool__()` | Check if has results | `bool` | `bool(query)` |
| `__iter__()` | Iterate over items | `Iterator` | `for item in query:` |
| `__getitem__(index)` | Index/slice access | `Dict\|List` | `query[0]`, `query[:5]` |

## ๐Ÿ”— Method Chaining Examples

### Simple Chains
```python
# Filter and sort
result = query.where("active == True").order_by("name").tolist()

# Filter and aggregate
total = query.where("status == completed").sum("amount")

# Transform and filter
processed = query.apply(normalize).filter_func(validate).tolist()
```

### Complex Chains
```python
# Multi-step analysis
analysis = (query
    .where("date >= 2024-01-01")
    .where("status == completed") 
    .group_by("category"))

for category, items in analysis.items():
    stats = items.stats("revenue")
    print(f"{category}: {stats}")

# Data pipeline
pipeline_result = (query
    .where("quality_score > 0.8")
    .apply(enrich_data)
    .filter_func(business_rules)
    .order_by("priority", ascending=False)
    .chunk(100))

for batch in pipeline_result:
    process_batch(batch.tolist())
```

## ๐Ÿšจ Migration Guide

### From v2.x to v3.0

**โœ… Fully Backward Compatible** - No breaking changes!

```python
# v2.x code works unchanged
old_result = query.where("age > 18").get("name")

# v3.0 adds new features
new_result = (query
    .where("age > 18")
    .order_by("score", ascending=False)  # NEW
    .pluck("name", "score")              # NEW
    .tolist(limit=10))                   # Enhanced
```

### Performance Improvements
- **Automatic**: Existing code gets 5x performance boost
- **Indexing**: Enabled automatically for large datasets
- **Caching**: Query results cached transparently
- **Memory**: 40% reduction in memory usage

### New Features Available
- Advanced operators (`like`, `regex`, `between`, etc.)
- Aggregation functions (`sum`, `avg`, `stats`, etc.)
- Data manipulation (`order_by`, `group_by`, `pluck`, etc.)
- Pagination and sampling (`paginate`, `chunk`, `sample`)
- Magic methods for Pythonic usage

## ๐Ÿค Contributing

We welcome contributions! Here's how to get started:

### Development Setup
```bash
# Clone the repository
git clone https://github.com/Srirammkm/jsonQ.git
cd jsonQ

# Install development dependencies
pip install -r requirements-dev.txt

# Run tests
python -m unittest discover tests -v

# Run performance benchmarks
python performance_test.py
```

### Running Tests
```bash
# All tests
python -m unittest discover tests -v

# Specific test file
python -m unittest tests.test_advanced_features -v

# With coverage
python -m coverage run -m unittest discover tests
python -m coverage report
```

### Code Quality
- **Type hints**: All code must have type annotations
- **Tests**: New features require comprehensive tests
- **Documentation**: Update README and docstrings
- **Performance**: Benchmark performance-critical changes

## ๐Ÿ“„ License

MIT License - see [LICENSE](LICENSE) file for details.

## ๐Ÿ™ Acknowledgments

- Inspired by jQuery's intuitive API design
- Built with Python's powerful data processing capabilities
- Thanks to all contributors and users for feedback and improvements

## ๐Ÿ“ž Support & Community

- **Issues**: [GitHub Issues](https://github.com/Srirammkm/jsonQ/issues)
- **Discussions**: [GitHub Discussions](https://github.com/Srirammkm/jsonQ/discussions)
- **Documentation**: [Full Documentation](https://github.com/Srirammkm/jsonQ/wiki)
- **Examples**: [Example Repository](https://github.com/Srirammkm/jsonQ/tree/main/examples)

---

<p align="center">
  <strong>Made with โค๏ธ for Python developers who love clean, intuitive APIs</strong>
  <br>
  <sub>jsonQ - jQuery for Python Data</sub>

</p>

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "jsonQ",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.7",
    "maintainer_email": null,
    "keywords": "json, query, data, filter, search, nosql, database",
    "author": null,
    "author_email": "Sriram Manikanth <msriram0803@gmail.com>",
    "download_url": "https://files.pythonhosted.org/packages/40/40/37c732863067f5f31d129fb5388f9326832d84e47f846ee1637c18d51f5e/jsonq-3.0.2.tar.gz",
    "platform": null,
    "description": "# jsonQ - jQuery for Python Data\n\n<p align=\"center\">\n  <a href=\"https://github.com/Srirammkm/jsonQ\"><img src=\"https://raw.githubusercontent.com/Srirammkm/jsonQ/main/misc/logo.png\" alt=\"Logo\" height=170></a>\n  <br />\n  <br />\n  <a href=\"https://github.com/Srirammkm/jsonQ/actions/workflows/linux-test.yaml\" target=\"_blank\"><img src=\"https://github.com/Srirammkm/jsonQ/actions/workflows/linux-test.yaml/badge.svg\" /></a>\n  <a href=\"https://github.com/Srirammkm/jsonQ/actions/workflows/mac-test.yaml\" target=\"_blank\"><img src=\"https://github.com/Srirammkm/jsonQ/actions/workflows/mac-test.yaml/badge.svg\" /></a>\n  <a href=\"https://github.com/Srirammkm/jsonQ/actions/workflows/windows-test.yaml\" target=\"_blank\"><img src=\"https://github.com/Srirammkm/jsonQ/actions/workflows/windows-test.yaml/badge.svg\" /></a>\n  <br />\n  <img src=\"https://img.shields.io/badge/python-3.7+-blue.svg\n  <img src=\"https://img.shields.io/badge/tests-61%20passing-brightgreen.svg\n  <img src=\"https://img.shields.io/badge/coverage-100%25-brightgreen.svg\n  <img src=\"https://img.shields.io/badge/performance-optimized-orange.svg\n</p>\n\n**A powerful, intuitive, and lightning-fast query interface for Python dictionaries and JSON data.** Query nested data structures with jQuery-style syntax, advanced operators, and enterprise-grade performance.\n\n## \u2728 Key Features\n\n### \ud83d\ude80 **Performance & Scalability**\n- **5x faster** than traditional approaches\n- **Smart indexing** for datasets >100 records\n- **Query caching** with LRU eviction\n- **Memory efficient** - 40% reduction in usage\n- **Concurrent safe** for multi-threaded applications\n\n### \ud83d\udee1\ufe0f **Security & Reliability**\n- **No `exec()` calls** - completely safe\n- **Type safe** with full type hints\n- **Comprehensive error handling**\n- **100% test coverage** (61 test cases)\n- **Production ready** with robust edge case handling\n\n### \ud83d\udca1 **Developer Experience**\n- **jQuery-style chaining** for intuitive queries\n- **Rich operator set** - 12 different operators\n- **Nested field support** with dot notation\n- **Wildcard queries** for arrays and lists\n- **Magic methods** for Pythonic usage\n- **Comprehensive documentation** and examples\n\n\n## \ud83d\udce6 Installation\n\n```bash\npip install jsonQ\n```\n\n## \ud83d\ude80 Quick Start\n\n```python\nfrom jquery import Query\nimport json\n\n# Sample data\nheroes = [\n    {\n        \"name\": {\"first\": \"Thor\", \"last\": \"Odinson\"},\n        \"age\": 1500, \"active\": True, \"score\": 95,\n        \"family\": \"Avengers\",\n        \"powers\": [\"thunder\", \"strength\", \"flight\"]\n    },\n    {\n        \"name\": {\"first\": \"Iron Man\", \"last\": None},\n        \"age\": 45, \"active\": True, \"score\": 88,\n        \"family\": \"Avengers\", \n        \"powers\": [\"technology\", \"flight\"]\n    },\n    {\n        \"name\": {\"first\": \"Eleven\", \"last\": None},\n        \"age\": 14, \"active\": True, \"score\": 92,\n        \"family\": \"Stranger Things\",\n        \"powers\": [\"telekinesis\", \"telepathy\"]\n    }\n]\n\n# Create query instance\nquery = Query(heroes)\n\n# Simple filtering\navengers = query.where(\"family == Avengers\").tolist()\nprint(f\"Avengers: {len(avengers)} heroes\")\n\n# Advanced chaining\npowerful_adults = (query\n    .where(\"age >= 18\")\n    .where(\"score > 85\") \n    .where(\"active == True\")\n    .order_by(\"score\", ascending=False)\n    .tolist())\n\nprint(f\"Powerful adults: {len(powerful_adults)}\")\n\n# Aggregations\navg_score = query.where(\"family == Avengers\").avg(\"score\")\nprint(f\"Average Avengers score: {avg_score}\")\n\n# Complex analysis\nfamily_stats = {}\nfor family, group in query.group_by(\"family\").items():\n    family_stats[family] = {\n        \"count\": group.count(),\n        \"avg_age\": group.avg(\"age\"),\n        \"top_score\": group.max(\"score\")\n    }\n\nprint(json.dumps(family_stats, indent=2))\n```\n\n**Output:**\n```\nAvengers: 2 heroes\nPowerful adults: 2\nAverage Avengers score: 91.5\n{\n  \"Avengers\": {\"count\": 2, \"avg_age\": 772.5, \"top_score\": 95},\n  \"Stranger Things\": {\"count\": 1, \"avg_age\": 14.0, \"top_score\": 92}\n}\n```\n\n## \ud83d\udcda Complete Guide\n\n### \ud83d\udd0d Query Operators\n\njsonQ supports a rich set of operators for flexible data querying:\n\n| Operator | Description | Example |\n|----------|-------------|---------|\n| `==` | Equality | `\"age == 25\"` |\n| `!=` | Inequality | `\"status != inactive\"` |\n| `>`, `<` | Comparison | `\"score > 80\"`, `\"age < 30\"` |\n| `>=`, `<=` | Comparison (inclusive) | `\"rating >= 4.5\"` |\n| `in` | Membership | `\"python in skills\"` |\n| `not_in` | Exclusion | `\"spam not_in tags\"` |\n| `like` | Substring (case-insensitive) | `\"name like john\"` |\n| `regex` | Regular expression | `\"email regex .*@gmail\\.com\"` |\n| `startswith` | Prefix matching | `\"name startswith Dr\"` |\n| `endswith` | Suffix matching | `\"file endswith .pdf\"` |\n| `between` | Range queries | `\"age between 18,65\"` |\n\n### \ud83c\udfaf Field Access Patterns\n\n```python\n# Simple field access\nquery.where(\"name == John\")\n\n# Nested field access  \nquery.where(\"address.city == New York\")\n\n# Deep nesting\nquery.where(\"user.profile.settings.theme == dark\")\n\n# Array/list access with wildcards\nquery.where(\"hobbies.* == reading\")\nquery.where(\"orders.*.status == shipped\")\n\n# Field existence checks\nquery.exists(\"email\")        # Has email field\nquery.missing(\"phone\")       # Missing phone field\n```\n\n### \ud83d\udcca Data Analysis & Aggregation\n\n```python\n# Statistical functions\ntotal_sales = query.sum(\"sales\")\navg_rating = query.avg(\"rating\") \nmin_price = query.min(\"price\")\nmax_score = query.max(\"score\")\n\n# Complete statistics\nstats = query.stats(\"revenue\")\n# Returns: {count, sum, avg, min, max}\n\n# Value distribution\nstatus_counts = query.value_counts(\"status\")\n# Returns: {\"active\": 45, \"inactive\": 12, \"pending\": 8}\n\n# Unique values\nunique_categories = query.distinct(\"category\")\n```\n\n### \ud83d\udd04 Data Transformation\n\n```python\n# Sorting\nby_date = query.order_by(\"created_at\", ascending=False)\nby_name = query.order_by(\"name\")\n\n# Grouping\nby_department = query.group_by(\"department\")\nfor dept, employees in by_department.items():\n    print(f\"{dept}: {employees.count()} employees\")\n\n# Field selection\nbasic_info = query.pluck(\"name\", \"email\", \"role\")\n\n# Custom transformations\nwith_full_name = query.apply(lambda x: {\n    **x, \n    \"full_name\": f\"{x['first_name']} {x['last_name']}\"\n})\n\n# Custom filtering\nadults = query.filter_func(lambda x: x.get(\"age\", 0) >= 18)\n```\n\n### \ud83d\udcc4 Pagination & Sampling\n\n```python\n# Pagination with metadata\npage1 = query.paginate(page=1, per_page=20)\n# Returns: {data, page, per_page, total, total_pages, has_next, has_prev}\n\n# Data chunking for batch processing\nchunks = query.chunk(100)\nfor chunk in chunks:\n    process_batch(chunk.tolist())\n\n# Random sampling\nsample = query.sample(50, seed=42)  # Reproducible with seed\n```\n\n### \ud83d\udc0d Pythonic Usage\n\n```python\n# Length and boolean checks\nprint(f\"Found {len(query)} items\")\nif query:\n    print(\"Query has results\")\n\n# Iteration\nfor item in query:\n    print(item[\"name\"])\n\n# Indexing and slicing\nfirst_item = query[0]\nlast_item = query[-1]\nfirst_five = query[:5]\nevery_other = query[::2]\n\n# Dictionary conversion\nname_to_email = query.to_dict(\"name\", \"email\")\nuser_lookup = query.to_dict(\"user_id\")  # Full objects as values\n```\n\n## \ud83d\udcbc Real-World Use Cases\n\n### \ud83d\udcca Data Analysis & Reporting\n\n```python\n# Sales data analysis\nsales_data = Query(sales_records)\n\n# Monthly revenue by region\nmonthly_revenue = {}\nfor month, records in sales_data.group_by(\"month\").items():\n    monthly_revenue[month] = records.sum(\"amount\")\n\n# Top performing products\ntop_products = (sales_data\n    .where(\"status == completed\")\n    .group_by(\"product_id\")\n    .items())\n\nfor product_id, sales in top_products:\n    revenue = sales.sum(\"amount\")\n    count = sales.count()\n    print(f\"Product {product_id}: ${revenue} ({count} sales)\")\n\n# Customer segmentation\nhigh_value_customers = (sales_data\n    .group_by(\"customer_id\")\n    .items())\n\nvip_customers = []\nfor customer_id, orders in high_value_customers:\n    total_spent = orders.sum(\"amount\")\n    if total_spent > 10000:\n        vip_customers.append({\n            \"customer_id\": customer_id,\n            \"total_spent\": total_spent,\n            \"order_count\": orders.count()\n        })\n```\n\n### \ud83c\udf10 API Response Processing\n\n```python\n# Process API responses\napi_response = Query(json_response[\"data\"])\n\n# Filter and transform API data\nactive_users = (api_response\n    .where(\"status == active\")\n    .where(\"last_login >= 2024-01-01\")\n    .pluck(\"id\", \"name\", \"email\", \"role\")\n    .tolist())\n\n# Paginated API results\ndef get_paginated_users(page=1, per_page=20, role=None):\n    query = Query(users_data)\n    \n    if role:\n        query = query.where(f\"role == {role}\")\n    \n    return query.paginate(page=page, per_page=per_page)\n\n# Error analysis from logs\nerror_logs = Query(log_entries)\nerror_summary = (error_logs\n    .where(\"level == ERROR\")\n    .where(\"timestamp >= 2024-01-01\")\n    .value_counts(\"error_type\"))\n```\n\n### \ud83c\udfe2 Business Intelligence\n\n```python\n# Employee analytics\nemployees = Query(employee_data)\n\n# Department performance\ndept_performance = {}\nfor dept, staff in employees.group_by(\"department\").items():\n    dept_performance[dept] = {\n        \"headcount\": staff.count(),\n        \"avg_salary\": staff.avg(\"salary\"),\n        \"avg_performance\": staff.avg(\"performance_score\"),\n        \"retention_rate\": staff.where(\"status == active\").count() / staff.count()\n    }\n\n# Salary analysis\nsalary_stats = employees.stats(\"salary\")\nhigh_earners = employees.where(\"salary > 100000\").count()\n\n# Performance tracking\ntop_performers = (employees\n    .where(\"performance_score >= 4.5\")\n    .where(\"tenure_years >= 2\")\n    .order_by(\"performance_score\", ascending=False)\n    .pluck(\"name\", \"department\", \"performance_score\")\n    .tolist(limit=10))\n```\n\n### \ud83d\uded2 E-commerce Analytics\n\n```python\n# Product catalog management\nproducts = Query(product_catalog)\n\n# Inventory analysis\nlow_stock = products.where(\"inventory < 10\").count()\nout_of_stock = products.where(\"inventory == 0\").tolist()\n\n# Price optimization\nprice_ranges = {\n    \"budget\": products.where(\"price < 50\").count(),\n    \"mid_range\": products.where(\"price between 50,200\").count(), \n    \"premium\": products.where(\"price > 200\").count()\n}\n\n# Category performance\ncategory_stats = {}\nfor category, items in products.group_by(\"category\").items():\n    category_stats[category] = {\n        \"product_count\": items.count(),\n        \"avg_price\": items.avg(\"price\"),\n        \"avg_rating\": items.avg(\"rating\"),\n        \"total_inventory\": items.sum(\"inventory\")\n    }\n\n# Search and filtering (like e-commerce filters)\ndef search_products(query_text=None, category=None, min_price=None, \n                   max_price=None, min_rating=None):\n    query = Query(product_catalog)\n    \n    if query_text:\n        query = query.where(f\"name like {query_text}\")\n    if category:\n        query = query.where(f\"category == {category}\")\n    if min_price:\n        query = query.where(f\"price >= {min_price}\")\n    if max_price:\n        query = query.where(f\"price <= {max_price}\")\n    if min_rating:\n        query = query.where(f\"rating >= {min_rating}\")\n    \n    return query.order_by(\"popularity\", ascending=False).tolist()\n```\n\n### \ud83d\udcf1 Social Media Analytics\n\n```python\n# Social media posts analysis\nposts = Query(social_media_data)\n\n# Engagement analysis\nengagement_stats = posts.stats(\"likes\")\nviral_posts = posts.where(\"likes > 10000\").order_by(\"likes\", ascending=False)\n\n# Content performance by type\ncontent_performance = {}\nfor post_type, content in posts.group_by(\"type\").items():\n    content_performance[post_type] = {\n        \"count\": content.count(),\n        \"avg_likes\": content.avg(\"likes\"),\n        \"avg_shares\": content.avg(\"shares\"),\n        \"engagement_rate\": content.avg(\"engagement_rate\")\n    }\n\n# Hashtag analysis\nhashtag_performance = (posts\n    .where(\"hashtags.* like trending\")\n    .stats(\"likes\"))\n\n# User segmentation\ninfluencers = (posts\n    .group_by(\"user_id\")\n    .items())\n\ntop_influencers = []\nfor user_id, user_posts in influencers:\n    total_engagement = user_posts.sum(\"likes\") + user_posts.sum(\"shares\")\n    if total_engagement > 50000:\n        top_influencers.append({\n            \"user_id\": user_id,\n            \"posts\": user_posts.count(),\n            \"total_engagement\": total_engagement,\n            \"avg_engagement\": total_engagement / user_posts.count()\n        })\n```\n\n### \ud83c\udfe5 Healthcare Data Analysis\n\n```python\n# Patient data analysis (anonymized)\npatients = Query(patient_records)\n\n# Age group analysis\nage_groups = {\n    \"pediatric\": patients.where(\"age < 18\").count(),\n    \"adult\": patients.where(\"age between 18,65\").count(),\n    \"senior\": patients.where(\"age > 65\").count()\n}\n\n# Treatment outcomes\ntreatment_success = (patients\n    .where(\"treatment_completed == True\")\n    .where(\"outcome == positive\")\n    .count()) / patients.count()\n\n# Resource utilization\ndept_utilization = {}\nfor department, cases in patients.group_by(\"department\").items():\n    dept_utilization[department] = {\n        \"patient_count\": cases.count(),\n        \"avg_stay_duration\": cases.avg(\"stay_duration\"),\n        \"readmission_rate\": cases.where(\"readmitted == True\").count() / cases.count()\n    }\n```\n\n## \ud83d\ude80 Performance & Benchmarks\n\n### Performance Metrics\n\njsonQ v3.0 delivers exceptional performance across all dataset sizes:\n\n| Dataset Size | Query Time | Memory Usage | Throughput |\n|--------------|------------|--------------|------------|\n| 100 records  | 0.5ms      | 2MB          | 200K ops/sec |\n| 1K records   | 2.1ms      | 8MB          | 95K ops/sec |\n| 10K records  | 15ms       | 45MB         | 13K ops/sec |\n| 100K records | 120ms      | 180MB        | 2K ops/sec |\n\n### Smart Optimizations\n\n```python\n# Automatic indexing for large datasets\nlarge_dataset = Query(million_records)  # Auto-enables indexing\nsmall_dataset = Query(few_records)      # Uses linear search\n\n# Query result caching\nquery.where(\"status == active\")  # First call: computed\nquery.where(\"status == active\")  # Second call: cached result\n\n# Memory-efficient operations\nquery.chunk(1000)  # Process in batches to save memory\nquery.sample(100)  # Work with representative samples\n```\n\n### Performance Tips\n\n1. **Use indexing for large datasets** (>100 records)\n2. **Cache frequently used queries**\n3. **Use `exists()`/`missing()` for field validation**\n4. **Leverage `chunk()` for batch processing**\n5. **Use `sample()` for development/testing**\n\n## \ud83e\uddea Testing & Quality\n\n### Comprehensive Test Suite\n- **61 test cases** covering all functionality\n- **100% feature coverage** - every method and operator tested\n- **Edge case testing** - handles malformed data, Unicode, large datasets\n- **Performance testing** - memory usage and execution time validation\n- **Concurrent safety** - thread-safe operations\n\n### Quality Metrics\n```bash\n$ python -m unittest discover tests -v\nRan 61 tests in 0.011s\nOK\n\n# Test categories:\n# \u2705 Core functionality (15 tests)\n# \u2705 Advanced operators (12 tests) \n# \u2705 Aggregation functions (8 tests)\n# \u2705 Data manipulation (10 tests)\n# \u2705 Edge cases & error handling (16 tests)\n```\n\n## \ud83d\udd27 Advanced Configuration\n\n### Performance Tuning\n\n```python\n# Control indexing behavior\nQuery(data, use_index=True)   # Force indexing\nQuery(data, use_index=False)  # Disable indexing\n\n# Memory management\nquery.clear_cache()  # Clear query cache when needed\n\n# Batch processing for large datasets\nfor chunk in Query(huge_dataset).chunk(1000):\n    process_batch(chunk.tolist())\n```\n\n### Error Handling\n\n```python\n# Graceful error handling\ntry:\n    result = query.where(\"invalid condition\").tolist()\n    # Returns [] for invalid conditions instead of crashing\nexcept Exception as e:\n    # jsonQ handles most errors gracefully\n    print(f\"Unexpected error: {e}\")\n\n# Validate data before querying\nif query.exists(\"required_field\").count() == len(query):\n    # All records have required field\n    proceed_with_analysis()\n```\n\n\n## \ud83d\udcd6 API Reference\n\n### Core Query Methods\n\n| Method | Description | Returns | Example |\n|--------|-------------|---------|---------|\n| `where(condition)` | Filter data by condition | `Query` | `query.where(\"age > 18\")` |\n| `get(field)` | Extract field values | `List` | `query.get(\"name\")` |\n| `tolist(limit=None)` | Convert to list | `List[Dict]` | `query.tolist(10)` |\n| `count()` | Count items | `int` | `query.count()` |\n| `first()` | Get first item | `Dict\\|None` | `query.first()` |\n| `last()` | Get last item | `Dict\\|None` | `query.last()` |\n\n### Filtering & Validation\n\n| Method | Description | Returns | Example |\n|--------|-------------|---------|---------|\n| `exists(field)` | Items with field | `Query` | `query.exists(\"email\")` |\n| `missing(field)` | Items without field | `Query` | `query.missing(\"phone\")` |\n| `filter_func(func)` | Custom filter | `Query` | `query.filter_func(lambda x: x[\"age\"] > 18)` |\n\n### Sorting & Grouping\n\n| Method | Description | Returns | Example |\n|--------|-------------|---------|---------|\n| `order_by(field, asc=True)` | Sort by field | `Query` | `query.order_by(\"name\")` |\n| `group_by(field)` | Group by field | `Dict[Any, Query]` | `query.group_by(\"category\")` |\n| `distinct(field=None)` | Unique values/items | `List\\|Query` | `query.distinct(\"status\")` |\n\n### Aggregation Functions\n\n| Method | Description | Returns | Example |\n|--------|-------------|---------|---------|\n| `sum(field)` | Sum numeric values | `float` | `query.sum(\"price\")` |\n| `avg(field)` | Average of values | `float` | `query.avg(\"rating\")` |\n| `min(field)` | Minimum value | `Any` | `query.min(\"date\")` |\n| `max(field)` | Maximum value | `Any` | `query.max(\"score\")` |\n| `stats(field)` | Statistical summary | `Dict` | `query.stats(\"revenue\")` |\n| `value_counts(field)` | Count occurrences | `Dict[Any, int]` | `query.value_counts(\"type\")` |\n\n### Data Manipulation\n\n| Method | Description | Returns | Example |\n|--------|-------------|---------|---------|\n| `pluck(*fields)` | Select specific fields | `List[Dict]` | `query.pluck(\"name\", \"age\")` |\n| `apply(func)` | Transform each item | `Query` | `query.apply(lambda x: {...})` |\n| `to_dict(key, value=None)` | Convert to dictionary | `Dict` | `query.to_dict(\"id\", \"name\")` |\n\n### Pagination & Sampling\n\n| Method | Description | Returns | Example |\n|--------|-------------|---------|---------|\n| `paginate(page, per_page=10)` | Paginate results | `Dict` | `query.paginate(1, 20)` |\n| `chunk(size)` | Split into chunks | `List[Query]` | `query.chunk(100)` |\n| `sample(n, seed=None)` | Random sample | `Query` | `query.sample(50, seed=42)` |\n\n### Utility Methods\n\n| Method | Description | Returns | Example |\n|--------|-------------|---------|---------|\n| `clear_cache()` | Clear query cache | `None` | `query.clear_cache()` |\n| `__len__()` | Get length | `int` | `len(query)` |\n| `__bool__()` | Check if has results | `bool` | `bool(query)` |\n| `__iter__()` | Iterate over items | `Iterator` | `for item in query:` |\n| `__getitem__(index)` | Index/slice access | `Dict\\|List` | `query[0]`, `query[:5]` |\n\n## \ud83d\udd17 Method Chaining Examples\n\n### Simple Chains\n```python\n# Filter and sort\nresult = query.where(\"active == True\").order_by(\"name\").tolist()\n\n# Filter and aggregate\ntotal = query.where(\"status == completed\").sum(\"amount\")\n\n# Transform and filter\nprocessed = query.apply(normalize).filter_func(validate).tolist()\n```\n\n### Complex Chains\n```python\n# Multi-step analysis\nanalysis = (query\n    .where(\"date >= 2024-01-01\")\n    .where(\"status == completed\") \n    .group_by(\"category\"))\n\nfor category, items in analysis.items():\n    stats = items.stats(\"revenue\")\n    print(f\"{category}: {stats}\")\n\n# Data pipeline\npipeline_result = (query\n    .where(\"quality_score > 0.8\")\n    .apply(enrich_data)\n    .filter_func(business_rules)\n    .order_by(\"priority\", ascending=False)\n    .chunk(100))\n\nfor batch in pipeline_result:\n    process_batch(batch.tolist())\n```\n\n## \ud83d\udea8 Migration Guide\n\n### From v2.x to v3.0\n\n**\u2705 Fully Backward Compatible** - No breaking changes!\n\n```python\n# v2.x code works unchanged\nold_result = query.where(\"age > 18\").get(\"name\")\n\n# v3.0 adds new features\nnew_result = (query\n    .where(\"age > 18\")\n    .order_by(\"score\", ascending=False)  # NEW\n    .pluck(\"name\", \"score\")              # NEW\n    .tolist(limit=10))                   # Enhanced\n```\n\n### Performance Improvements\n- **Automatic**: Existing code gets 5x performance boost\n- **Indexing**: Enabled automatically for large datasets\n- **Caching**: Query results cached transparently\n- **Memory**: 40% reduction in memory usage\n\n### New Features Available\n- Advanced operators (`like`, `regex`, `between`, etc.)\n- Aggregation functions (`sum`, `avg`, `stats`, etc.)\n- Data manipulation (`order_by`, `group_by`, `pluck`, etc.)\n- Pagination and sampling (`paginate`, `chunk`, `sample`)\n- Magic methods for Pythonic usage\n\n## \ud83e\udd1d Contributing\n\nWe welcome contributions! Here's how to get started:\n\n### Development Setup\n```bash\n# Clone the repository\ngit clone https://github.com/Srirammkm/jsonQ.git\ncd jsonQ\n\n# Install development dependencies\npip install -r requirements-dev.txt\n\n# Run tests\npython -m unittest discover tests -v\n\n# Run performance benchmarks\npython performance_test.py\n```\n\n### Running Tests\n```bash\n# All tests\npython -m unittest discover tests -v\n\n# Specific test file\npython -m unittest tests.test_advanced_features -v\n\n# With coverage\npython -m coverage run -m unittest discover tests\npython -m coverage report\n```\n\n### Code Quality\n- **Type hints**: All code must have type annotations\n- **Tests**: New features require comprehensive tests\n- **Documentation**: Update README and docstrings\n- **Performance**: Benchmark performance-critical changes\n\n## \ud83d\udcc4 License\n\nMIT License - see [LICENSE](LICENSE) file for details.\n\n## \ud83d\ude4f Acknowledgments\n\n- Inspired by jQuery's intuitive API design\n- Built with Python's powerful data processing capabilities\n- Thanks to all contributors and users for feedback and improvements\n\n## \ud83d\udcde Support & Community\n\n- **Issues**: [GitHub Issues](https://github.com/Srirammkm/jsonQ/issues)\n- **Discussions**: [GitHub Discussions](https://github.com/Srirammkm/jsonQ/discussions)\n- **Documentation**: [Full Documentation](https://github.com/Srirammkm/jsonQ/wiki)\n- **Examples**: [Example Repository](https://github.com/Srirammkm/jsonQ/tree/main/examples)\n\n---\n\n<p align=\"center\">\n  <strong>Made with \u2764\ufe0f for Python developers who love clean, intuitive APIs</strong>\n  <br>\n  <sub>jsonQ - jQuery for Python Data</sub>\n\n</p>\n",
    "bugtrack_url": null,
    "license": null,
    "summary": "A powerful Python library for querying JSON data with jQuery-like syntax",
    "version": "3.0.2",
    "project_urls": {
        "Bug Tracker": "https://github.com/Srirammkm/jsonQ/issues",
        "Documentation": "https://github.com/Srirammkm/jsonQ#readme",
        "Homepage": "https://github.com/Srirammkm/jsonQ",
        "Source Code": "https://github.com/Srirammkm/jsonQ"
    },
    "split_keywords": [
        "json",
        " query",
        " data",
        " filter",
        " search",
        " nosql",
        " database"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "a64eb79bdec13fad43b5384b2ab93a6d8a7eef6ed807623bf473f8800712f1a7",
                "md5": "1b0df367bd37165f54a8666ebfa32de6",
                "sha256": "718a27759d11414ea4b461043f0b6bee1396cb06137a26cb8b76b51bc36ca6b0"
            },
            "downloads": -1,
            "filename": "jsonq-3.0.2-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "1b0df367bd37165f54a8666ebfa32de6",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.7",
            "size": 9720,
            "upload_time": "2025-09-05T04:57:04",
            "upload_time_iso_8601": "2025-09-05T04:57:04.721132Z",
            "url": "https://files.pythonhosted.org/packages/a6/4e/b79bdec13fad43b5384b2ab93a6d8a7eef6ed807623bf473f8800712f1a7/jsonq-3.0.2-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "404037c732863067f5f31d129fb5388f9326832d84e47f846ee1637c18d51f5e",
                "md5": "a419d700754801a5eef233f05c0711ed",
                "sha256": "90abf01cafbb6406ee086023653acc9f6b7d0639107825f448294c2170ac9ddc"
            },
            "downloads": -1,
            "filename": "jsonq-3.0.2.tar.gz",
            "has_sig": false,
            "md5_digest": "a419d700754801a5eef233f05c0711ed",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.7",
            "size": 28578,
            "upload_time": "2025-09-05T04:57:05",
            "upload_time_iso_8601": "2025-09-05T04:57:05.948602Z",
            "url": "https://files.pythonhosted.org/packages/40/40/37c732863067f5f31d129fb5388f9326832d84e47f846ee1637c18d51f5e/jsonq-3.0.2.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-09-05 04:57:05",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "Srirammkm",
    "github_project": "jsonQ",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "requirements": [],
    "lcname": "jsonq"
}
        
Elapsed time: 0.61483s