mirror of
https://github.com/infiniflow/ragflow.git
synced 2026-07-14 00:48:26 +08:00
Feat: Initialize context engine CLI (#13776)
### What problem does this PR solve? - Add multiple output format to ragflow_cli - Initialize contextengine to Go module - ls datasets/ls files - cat file - search -d dir -q query issue: #13714 ### Type of change - [x] New Feature (non-breaking change which adds functionality)
This commit is contained in:
@@ -55,6 +55,11 @@ func (p *Parser) Parse(adminCommand bool) (*Command, error) {
|
||||
return p.parseMetaCommand()
|
||||
}
|
||||
|
||||
// Check for ContextEngine commands (ls, cat, search)
|
||||
if p.curToken.Type == TokenIdentifier && isCECommand(p.curToken.Value) {
|
||||
return p.parseCECommand()
|
||||
}
|
||||
|
||||
// Parse SQL-like command
|
||||
return p.parseSQLCommand(adminCommand)
|
||||
}
|
||||
@@ -215,6 +220,16 @@ func isKeyword(tokenType int) bool {
|
||||
return tokenType >= TokenLogin && tokenType <= TokenDocMeta
|
||||
}
|
||||
|
||||
// isCECommand checks if the given string is a ContextEngine command
|
||||
func isCECommand(s string) bool {
|
||||
upper := strings.ToUpper(s)
|
||||
switch upper {
|
||||
case "LS", "LIST", "SEARCH":
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// Helper functions for parsing
|
||||
func (p *Parser) parseQuotedString() (string, error) {
|
||||
if p.curToken.Type != TokenQuotedString {
|
||||
@@ -241,3 +256,92 @@ func tokenTypeToString(t int) string {
|
||||
// Simplified for error messages
|
||||
return fmt.Sprintf("token(%d)", t)
|
||||
}
|
||||
|
||||
// parseCECommand parses ContextEngine commands (ls, search)
|
||||
func (p *Parser) parseCECommand() (*Command, error) {
|
||||
cmdName := strings.ToUpper(p.curToken.Value)
|
||||
|
||||
switch cmdName {
|
||||
case "LS", "LIST":
|
||||
return p.parseCEListCommand()
|
||||
case "SEARCH":
|
||||
return p.parseCESearchCommand()
|
||||
default:
|
||||
return nil, fmt.Errorf("unknown ContextEngine command: %s", cmdName)
|
||||
}
|
||||
}
|
||||
|
||||
// parseCEListCommand parses the ls command
|
||||
// Syntax: ls [path] or ls datasets
|
||||
func (p *Parser) parseCEListCommand() (*Command, error) {
|
||||
p.nextToken() // consume LS/LIST
|
||||
|
||||
cmd := NewCommand("ce_ls")
|
||||
|
||||
// Check if there's a path argument
|
||||
// Also accept TokenDatasets since "datasets" is a keyword but can be a path
|
||||
if p.curToken.Type == TokenIdentifier || p.curToken.Type == TokenQuotedString ||
|
||||
p.curToken.Type == TokenDatasets {
|
||||
path := p.curToken.Value
|
||||
// Remove quotes if present
|
||||
if p.curToken.Type == TokenQuotedString {
|
||||
path = strings.Trim(path, "\"'")
|
||||
}
|
||||
cmd.Params["path"] = path
|
||||
p.nextToken()
|
||||
} else {
|
||||
// Default to "datasets" root
|
||||
cmd.Params["path"] = "datasets"
|
||||
}
|
||||
|
||||
// Optional semicolon
|
||||
if p.curToken.Type == TokenSemicolon {
|
||||
p.nextToken()
|
||||
}
|
||||
|
||||
return cmd, nil
|
||||
}
|
||||
|
||||
// parseCESearchCommand parses the search command
|
||||
// Syntax: search <query> or search <query> in <path>
|
||||
func (p *Parser) parseCESearchCommand() (*Command, error) {
|
||||
p.nextToken() // consume SEARCH
|
||||
|
||||
cmd := NewCommand("ce_search")
|
||||
|
||||
if p.curToken.Type != TokenIdentifier && p.curToken.Type != TokenQuotedString {
|
||||
return nil, fmt.Errorf("expected query after SEARCH")
|
||||
}
|
||||
|
||||
query := p.curToken.Value
|
||||
if p.curToken.Type == TokenQuotedString {
|
||||
query = strings.Trim(query, "\"'")
|
||||
}
|
||||
cmd.Params["query"] = query
|
||||
p.nextToken()
|
||||
|
||||
// Check for optional "in <path>" clause
|
||||
if p.curToken.Type == TokenIdentifier && strings.ToUpper(p.curToken.Value) == "IN" {
|
||||
p.nextToken() // consume IN
|
||||
|
||||
if p.curToken.Type != TokenIdentifier && p.curToken.Type != TokenQuotedString {
|
||||
return nil, fmt.Errorf("expected path after IN")
|
||||
}
|
||||
|
||||
path := p.curToken.Value
|
||||
if p.curToken.Type == TokenQuotedString {
|
||||
path = strings.Trim(path, "\"'")
|
||||
}
|
||||
cmd.Params["path"] = path
|
||||
p.nextToken()
|
||||
} else {
|
||||
cmd.Params["path"] = "."
|
||||
}
|
||||
|
||||
// Optional semicolon
|
||||
if p.curToken.Type == TokenSemicolon {
|
||||
p.nextToken()
|
||||
}
|
||||
|
||||
return cmd, nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user