feat: implement comprehensive query paradigm zoo system (issue #62)

- Created extensible BaseQueryParadigm interface with standardized QueryResult format
- Implemented QueryParadigmRegistry for paradigm discovery and management
- Added 5 working paradigms: SQL, FTS, GraphQL, JSONPath, Natural Language
- Documented 9 additional paradigms: QBE, Batch Manipulation, Visual Query Builder, REST API, NoSQL, UNIX Pipeline, XPath/XQuery, RAG, Data Transformation
- Integrated full CLI interface: list, search, show, exec, categories commands
- Added comprehensive test suite with 23 test cases covering all components
- Auto-registration system enables easy addition of new paradigms
- Organized paradigms by category (structural, textual, semantic, visual, procedural, network) and complexity (beginner, intermediate, advanced)

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-10-03 23:06:57 +02:00
parent 1d13cbb355
commit 5143864a86
21 changed files with 3659 additions and 0 deletions

View File

@@ -6364,6 +6364,191 @@ cli.add_command(wishlist_group)
# Register issue management commands
cli.add_command(issues_group)
# Query Paradigm Commands - Issue #62
@click.group()
def paradigms():
"""Discover and explore different query paradigms in MarkiTect."""
pass
@paradigms.command()
@pass_config
def list(config):
"""List all available query paradigms."""
from .query_paradigms.registry import registry
paradigms = registry.list_all()
print(f"📚 MarkiTect Query Paradigms ({len(paradigms)} available)")
print("=" * 50)
# Group by category
categories = {}
for paradigm in paradigms:
if paradigm.category not in categories:
categories[paradigm.category] = []
categories[paradigm.category].append(paradigm)
for category, paradigm_list in categories.items():
print(f"\n🏷️ {category.upper()} PARADIGMS")
print("-" * 30)
for paradigm in paradigm_list:
status = "✅ IMPLEMENTED" if paradigm.name in ['SQL', 'FTS', 'GraphQL', 'JSONPath', 'Natural Language'] else "📋 DOCUMENTED"
print(f" {status} {paradigm.name} ({paradigm.complexity})")
print(f" {paradigm.description}")
print()
@paradigms.command()
@click.argument('query')
@pass_config
def search(config, query):
"""Search paradigms by name or description."""
from .query_paradigms.registry import registry
results = registry.search_paradigms(query)
if not results:
print(f"❌ No paradigms found matching '{query}'")
return
print(f"🔍 Search results for '{query}' ({len(results)} found)")
print("=" * 40)
for paradigm in results:
status = "✅ IMPLEMENTED" if paradigm.name in ['SQL', 'FTS', 'GraphQL', 'JSONPath', 'Natural Language'] else "📋 DOCUMENTED"
print(f" {status} {paradigm.name} ({paradigm.category}, {paradigm.complexity})")
print(f" {paradigm.description}")
print()
@paradigms.command()
@click.argument('name')
@pass_config
def show(config, name):
"""Show detailed information about a specific paradigm."""
from .query_paradigms.registry import registry
paradigm = registry.get(name)
if not paradigm:
print(f"❌ Paradigm '{name}' not found.")
print("\nAvailable paradigms:")
for p in registry.list_all():
print(f" - {p.name}")
return
status = "✅ IMPLEMENTED" if paradigm.name in ['SQL', 'FTS', 'GraphQL', 'JSONPath', 'Natural Language'] else "📋 DOCUMENTED"
print(f"🔍 {paradigm.name} Query Paradigm")
print("=" * (len(paradigm.name) + 20))
print(f"Status: {status}")
print(f"Category: {paradigm.category}")
print(f"Complexity: {paradigm.complexity}")
print(f"Description: {paradigm.description}")
print()
print("📝 Syntax Help:")
print("-" * 15)
print(paradigm.get_syntax_help())
print()
print("💡 Examples:")
print("-" * 12)
examples = paradigm.get_examples()
for i, example in enumerate(examples, 1):
print(f"{i}. {example['name']}")
print(f" {example['description']}")
print(f" Query: {example['query']}")
print()
@paradigms.command()
@click.argument('paradigm_name')
@click.argument('query')
@click.option('--config-data', type=str, help='JSON configuration for the query')
@pass_config
def exec(config, paradigm_name, query, config_data):
"""Execute a query using specified paradigm."""
from .query_paradigms.registry import registry
import json
paradigm = registry.get(paradigm_name)
if not paradigm:
print(f"❌ Paradigm '{paradigm_name}' not found.")
return
# Parse config if provided
query_config = {}
if config_data:
try:
query_config = json.loads(config_data)
except json.JSONDecodeError:
print("❌ Invalid JSON in config-data parameter")
return
# Add database path from global config
db_path = get_database_path(config)
query_config['db_path'] = db_path
# Validate query first
valid, error = paradigm.validate_query(query)
if not valid:
print(f"❌ Invalid query: {error}")
return
print(f"🚀 Executing {paradigm.name} query...")
print(f"Query: {query}")
if config_data:
print(f"Config: {query_config}")
print()
try:
result = paradigm.execute(query, query_config)
print(f"⏱️ Execution time: {result.execution_time_ms:.2f}ms")
print(f"📊 Result count: {result.result_count}")
print(f"✅ Success: {result.success}")
if result.error_message:
print(f"❌ Error: {result.error_message}")
if result.metadata:
print("\n📋 Metadata:")
for key, value in result.metadata.items():
print(f" {key}: {value}")
if result.results:
print(f"\n📄 Results:")
for i, row in enumerate(result.results[:5], 1): # Show first 5 results
print(f" {i}. {row}")
if len(result.results) > 5:
print(f" ... and {len(result.results) - 5} more results")
except Exception as e:
print(f"❌ Execution error: {e}")
@paradigms.command()
@pass_config
def categories(config):
"""List all available paradigm categories."""
from .query_paradigms.registry import registry
categories = registry.get_categories()
print("📂 Available Categories:")
for category in sorted(categories):
paradigms = registry.list_by_category(category)
print(f" {category}: {len(paradigms)} paradigms")
# Register paradigms commands
cli.add_command(paradigms)
# Make cli function available as main entry point
main = cli