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:
185
markitect/cli.py
185
markitect/cli.py
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user