- 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>
115 lines
3.6 KiB
Python
115 lines
3.6 KiB
Python
"""
|
|
XPath/XQuery Paradigm - Path-based data extraction.
|
|
"""
|
|
|
|
import time
|
|
from typing import Dict, Any, List, Optional
|
|
|
|
from ..base import BaseQueryParadigm, QueryResult
|
|
|
|
|
|
class XPathParadigm(BaseQueryParadigm):
|
|
"""XPath/XQuery paradigm for path-based data extraction."""
|
|
|
|
@property
|
|
def name(self) -> str:
|
|
return "XPath/XQuery"
|
|
|
|
@property
|
|
def description(self) -> str:
|
|
return "Path-based data extraction from structured documents using XPath and XQuery syntax"
|
|
|
|
@property
|
|
def category(self) -> str:
|
|
return "structural"
|
|
|
|
@property
|
|
def complexity(self) -> str:
|
|
return "advanced"
|
|
|
|
def execute(self, query: str, config: Dict[str, Any] = None) -> QueryResult:
|
|
"""Execute XPath query (not yet implemented)."""
|
|
start_time = time.time()
|
|
execution_time = (time.time() - start_time) * 1000
|
|
|
|
return QueryResult(
|
|
paradigm=self.name,
|
|
query=query,
|
|
execution_time_ms=execution_time,
|
|
result_count=0,
|
|
results=[],
|
|
metadata={
|
|
"status": "not_implemented",
|
|
"implementation_issue": "TBD - to be created",
|
|
"description": "XPath enables precise navigation through document structures"
|
|
},
|
|
success=False,
|
|
error_message="XPath/XQuery paradigm not yet implemented."
|
|
)
|
|
|
|
def get_examples(self) -> List[Dict[str, str]]:
|
|
"""Get example XPath queries."""
|
|
return [
|
|
{
|
|
"name": "Select files by attribute",
|
|
"description": "Find all files with specific author",
|
|
"query": "//file[@author='Alice']"
|
|
},
|
|
{
|
|
"name": "Deep path selection",
|
|
"description": "Select nested content elements",
|
|
"query": "//file/content/section[contains(@title, 'Introduction')]"
|
|
},
|
|
{
|
|
"name": "Conditional selection",
|
|
"description": "Select files with multiple conditions",
|
|
"query": "//file[@type='markdown' and @size > 1000]/tags/tag"
|
|
},
|
|
{
|
|
"name": "Position-based selection",
|
|
"description": "Select first 3 files by creation date",
|
|
"query": "//file[position() <= 3 and @created > '2024-01-01']"
|
|
}
|
|
]
|
|
|
|
def validate_query(self, query: str) -> tuple[bool, Optional[str]]:
|
|
"""Validate XPath query syntax."""
|
|
if not query.strip():
|
|
return False, "XPath query cannot be empty"
|
|
|
|
if not (query.startswith('//') or query.startswith('/')):
|
|
return False, "XPath query must start with / or //"
|
|
|
|
return True, None
|
|
|
|
def get_syntax_help(self) -> str:
|
|
"""Get syntax help for XPath queries."""
|
|
return """XPath/XQuery Syntax:
|
|
|
|
Basic Path Selection:
|
|
//element - Select all elements anywhere
|
|
/root/element - Select from root
|
|
element[@attribute='value'] - Select by attribute
|
|
|
|
Predicates:
|
|
//file[@author='Alice'] - Attribute equals
|
|
//file[position() <= 3] - Position-based
|
|
//file[contains(@tags, 'tutorial')] - Text contains
|
|
|
|
Functions:
|
|
position() - Element position
|
|
contains(string, substring) - Text contains
|
|
count(elements) - Count elements
|
|
text() - Get text content
|
|
|
|
Document Structure (conceptual):
|
|
//file - All files
|
|
//file/@author - All author attributes
|
|
//file/tags/tag - All tags in files
|
|
//file[content/section] - Files with sections
|
|
|
|
Examples:
|
|
//file[@type='markdown']
|
|
//file/tags/tag[text()='documentation']
|
|
//file[@created > '2024-01-01' and @author='Alice']
|
|
""" |