This is an automated email from the ASF dual-hosted git repository.

apkhmv pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/ignite-3.git


The following commit(s) were added to refs/heads/main by this push:
     new 104b4903ba IGNITE-21674 Fix subcommand completion in CLI (#3461)
104b4903ba is described below

commit 104b4903baaacfe5be1226eb21de874217e1fc1c
Author: Vadim Pakhnushev <8614891+valep...@users.noreply.github.com>
AuthorDate: Fri Mar 22 16:18:45 2024 +0300

    IGNITE-21674 Fix subcommand completion in CLI (#3461)
    
    Add a workaround for https://github.com/jline/jline3/issues/956
---
 .../core/repl/executor/IgnitePicocliCommands.java  | 80 ++++++++++++++--------
 1 file changed, 53 insertions(+), 27 deletions(-)

diff --git 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/core/repl/executor/IgnitePicocliCommands.java
 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/core/repl/executor/IgnitePicocliCommands.java
index 7a654326b7..914d1a2492 100644
--- 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/core/repl/executor/IgnitePicocliCommands.java
+++ 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/core/repl/executor/IgnitePicocliCommands.java
@@ -19,11 +19,11 @@ package org.apache.ignite.internal.cli.core.repl.executor;
 
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import org.apache.ignite.internal.cli.core.repl.completer.DynamicCompleter;
 import 
org.apache.ignite.internal.cli.core.repl.completer.DynamicCompleterRegistry;
 import 
org.apache.ignite.internal.cli.core.repl.completer.filter.CompleterFilter;
 import org.jline.builtins.Options.HelpException;
@@ -31,7 +31,6 @@ import org.jline.console.ArgDesc;
 import org.jline.console.CmdDesc;
 import org.jline.console.CommandRegistry;
 import org.jline.reader.Candidate;
-import org.jline.reader.Completer;
 import org.jline.reader.LineReader;
 import org.jline.reader.ParsedLine;
 import org.jline.reader.impl.completer.ArgumentCompleter;
@@ -179,7 +178,7 @@ public class IgnitePicocliCommands implements 
CommandRegistry {
         return aliasCommand;
     }
 
-    private class IgnitePicocliCompleter extends ArgumentCompleter implements 
Completer {
+    private class IgnitePicocliCompleter extends ArgumentCompleter {
 
         public IgnitePicocliCompleter() {
             super(NullCompleter.INSTANCE);
@@ -199,35 +198,31 @@ public class IgnitePicocliCommands implements 
CommandRegistry {
                     0,
                     commandLine.cursor(),
                     cs);
-            String[] staticCandidates = cs.stream()
-                    .map(CharSequence::toString)
-                    .toArray(String[]::new);
-
-            List<DynamicCompleter> completers = 
completerRegistry.findCompleters(words);
-            if (!completers.isEmpty()) {
-                try {
-                    completers.stream()
-                            .map(c -> c.complete(words))
-                            .flatMap(List::stream)
-                            .map(this::dynamicCandidate)
-                            .forEach(candidates::add);
-                } catch (Exception e) {
-                    throw new RuntimeException(e);
-                }
-            }
 
-            if (!candidates.isEmpty()) {
-                return;
+            try {
+                completerRegistry.findCompleters(words).stream()
+                        .map(c -> c.complete(words))
+                        .flatMap(List::stream)
+                        .map(this::dynamicCandidate)
+                        .forEach(candidates::add);
+            } catch (Exception e) {
+                throw new RuntimeException(e);
             }
 
-            String[] filteredCandidates = staticCandidates;
-            for (CompleterFilter filter : completerFilters) {
-                filteredCandidates = filter.filter(words, filteredCandidates);
-            }
+            if (candidates.isEmpty()) {
+                String[] filteredCandidates = cs.stream()
+                        .map(CharSequence::toString)
+                        .toArray(String[]::new);
+                for (CompleterFilter filter : completerFilters) {
+                    filteredCandidates = filter.filter(words, 
filteredCandidates);
+                }
 
-            for (String c : filteredCandidates) {
-                candidates.add(staticCandidate(c));
+                for (String c : filteredCandidates) {
+                    candidates.add(staticCandidate(c));
+                }
             }
+
+            sortCandidates(candidates);
         }
 
         private Candidate dynamicCandidate(String one) {
@@ -241,5 +236,36 @@ public class IgnitePicocliCommands implements 
CommandRegistry {
         private Candidate staticCandidate(String one) {
             return new Candidate(one, one, null, null, null, null, true, 10);
         }
+
+        /**
+         * When custom sort order is used, sort candidates list and reassign 
sort order according to candidates order.
+         * TODO https://issues.apache.org/jira/browse/IGNITE-21824
+         *
+         * @param candidates List of candidates.
+         */
+        private void sortCandidates(List<Candidate> candidates) {
+            boolean customOrder = candidates.stream().anyMatch(c -> c.sort() 
!= 0);
+            if (!customOrder) {
+                return;
+            }
+            Collections.sort(candidates);
+            List<Candidate> newCandidates = new ArrayList<>(candidates.size());
+            for (int i = 0; i < candidates.size(); i++) {
+                Candidate candidate = candidates.get(i);
+                Candidate newCandidate = new Candidate(
+                        candidate.value(),
+                        candidate.displ(),
+                        candidate.group(),
+                        candidate.descr(),
+                        candidate.suffix(),
+                        candidate.key(),
+                        candidate.complete(),
+                        i // override sort order
+                );
+                newCandidates.add(newCandidate);
+            }
+            candidates.clear();
+            candidates.addAll(newCandidates);
+        }
     }
 }

Reply via email to