Skip to content

Commit 851fab3

Browse files
authored
Add local parameter value map to Az.Predictor (#13739)
* add local parameter value map * add local parameter value map * add local parameter value map * add local parameter value map
1 parent c9fcb7e commit 851fab3

File tree

4 files changed

+58
-36
lines changed

4 files changed

+58
-36
lines changed

tools/Az.Tools.Predictor/Az.Tools.Predictor/Az.Tools.Predictor.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,5 +43,6 @@ For more information on Az Predictor, please visit the following: https://aka.ms
4343
<ItemGroup>
4444
<None Include="Az.Tools.Predictor.psd1" CopyToOutputDirectory="PreserveNewest" />
4545
<None Include="AzPredictorSettings.json" CopyToOutputDirectory="PreserveNewest" />
46+
<None Include="command_param_to_resource_map.json" CopyToOutputDirectory="PreserveNewest" />
4647
</ItemGroup>
4748
</Project>

tools/Az.Tools.Predictor/Az.Tools.Predictor/CommandLinePredictor.cs

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -122,10 +122,11 @@ public CommandLineSuggestion GetSuggestion(string inputCommandName,
122122
resultBuilder.Clear();
123123
resultBuilder.Append(_commandLinePredictions[i].Name);
124124
usedParams.Clear();
125+
string commandNoun = ParameterValuePredictor.GetAzCommandNoun(_commandLinePredictions[i].Name).ToLower();
125126

126-
if (DoesPredictionParameterSetMatchInput(resultBuilder, inputParameterSet, _commandLinePredictions[i].ParameterSet, usedParams))
127+
if (DoesPredictionParameterSetMatchInput(resultBuilder, inputParameterSet, commandNoun, _commandLinePredictions[i].ParameterSet, usedParams))
127128
{
128-
PredictRestOfParameters(resultBuilder, _commandLinePredictions[i].ParameterSet.Parameters, usedParams);
129+
PredictRestOfParameters(resultBuilder, commandNoun, _commandLinePredictions[i].ParameterSet.Parameters, usedParams);
129130

130131
if (resultBuilder.Length <= rawUserInput.Length)
131132
{
@@ -177,15 +178,16 @@ public CommandLineSuggestion GetSuggestion(string inputCommandName,
177178
/// Appends unused parameters to the builder.
178179
/// </summary>
179180
/// <param name="builder">StringBuilder that aggregates the prediction text output.</param>
181+
/// <param name="commandNoun">Command Noun.</param>
180182
/// <param name="parameters">Chosen prediction parameters.</param>
181183
/// <param name="usedParams">Set of used parameters for set.</param>
182-
private void PredictRestOfParameters(StringBuilder builder, IReadOnlyList<Parameter> parameters, HashSet<int> usedParams)
184+
private void PredictRestOfParameters(StringBuilder builder, string commandNoun, IReadOnlyList<Parameter> parameters, HashSet<int> usedParams)
183185
{
184186
for (var j = 0; j < parameters.Count; j++)
185187
{
186188
if (!usedParams.Contains(j))
187189
{
188-
BuildParameterValue(builder, parameters[j]);
190+
BuildParameterValue(builder, commandNoun, parameters[j]);
189191
}
190192
}
191193
}
@@ -195,9 +197,10 @@ private void PredictRestOfParameters(StringBuilder builder, IReadOnlyList<Parame
195197
/// </summary>
196198
/// <param name="builder">StringBuilder that aggregates the prediction text output.</param>
197199
/// <param name="inputParameters">Parsed ParameterSet from the user input AST.</param>
200+
/// <param name="commandNoun">Command Noun.</param>
198201
/// <param name="predictionParameters">Candidate prediction parameter set.</param>
199202
/// <param name="usedParams">Set of used parameters for set.</param>
200-
private bool DoesPredictionParameterSetMatchInput(StringBuilder builder, ParameterSet inputParameters, ParameterSet predictionParameters, HashSet<int> usedParams)
203+
private bool DoesPredictionParameterSetMatchInput(StringBuilder builder, ParameterSet inputParameters, string commandNoun,ParameterSet predictionParameters, HashSet<int> usedParams)
201204
{
202205
foreach (var inputParameter in inputParameters.Parameters)
203206
{
@@ -215,7 +218,7 @@ private bool DoesPredictionParameterSetMatchInput(StringBuilder builder, Paramet
215218
}
216219
else
217220
{
218-
BuildParameterValue(builder, predictionParameters.Parameters[matchIndex]);
221+
BuildParameterValue(builder, commandNoun, predictionParameters.Parameters[matchIndex]);
219222
}
220223
}
221224
}
@@ -234,11 +237,12 @@ private bool DoesPredictionParameterSetMatchInput(StringBuilder builder, Paramet
234237
/// "TestVM" is predicted for Get-AzVM.
235238
/// </summary>
236239
/// <param name="builder">The string builder to create the whole predicted command line.</param>
240+
/// <param name="commandNoun">Command Noun.</param>
237241
/// <param name="parameter">The parameter name and value from prediction.</param>
238-
private void BuildParameterValue(StringBuilder builder, Parameter parameter)
242+
private void BuildParameterValue(StringBuilder builder, string commandNoun, Parameter parameter)
239243
{
240244
var parameterName = parameter.Name;
241-
var parameterValue = this._parameterValuePredictor?.GetParameterValueFromAzCommand(parameterName);
245+
string parameterValue = this._parameterValuePredictor?.GetParameterValueFromAzCommand(commandNoun, parameterName);
242246

243247
if (string.IsNullOrWhiteSpace(parameterValue))
244248
{

tools/Az.Tools.Predictor/Az.Tools.Predictor/ParameterValuePredictor.cs

Lines changed: 44 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,35 @@
1-
using System;
1+
using Microsoft.Azure.PowerShell.Tools.AzPredictor.Utilities;
2+
using System;
3+
using System.IO;
4+
using System.Text;
5+
using System.Text.Json;
6+
using System.Text.Json.Serialization;
27
using System.Collections.Concurrent;
38
using System.Collections.Generic;
49
using System.Linq;
510
using System.Management.Automation.Language;
611

12+
13+
714
namespace Microsoft.Azure.PowerShell.Tools.AzPredictor
815
{
916
/// <summary>
1017
/// A predictor to learn and provide values for Azure PowerShell commands' parameters values.
1118
/// </summary>
1219
sealed class ParameterValuePredictor
1320
{
14-
/// <summary>
15-
/// The collections of the parameter names that is used directly as the key in local parameter collection.
16-
/// </summary>
17-
private static readonly IReadOnlyCollection<string> _specialLocalParameterNames = new HashSet<string>(StringComparer.OrdinalIgnoreCase) { "location", "credential", "addressprefix" };
18-
1921
private readonly ConcurrentDictionary<string, string> _localParameterValues = new ConcurrentDictionary<string, string>();
2022

23+
private readonly Dictionary<string, Dictionary<string, string>> _command_param_to_resource_map;
24+
25+
public ParameterValuePredictor()
26+
{
27+
var fileInfo = new FileInfo(typeof(Settings).Assembly.Location);
28+
var directory = fileInfo.DirectoryName;
29+
var mappingFilePath = Path.Join(directory, "command_param_to_resource_map.json");
30+
_command_param_to_resource_map = JsonSerializer.Deserialize<Dictionary<string, Dictionary<string, string>>>(File.ReadAllText(mappingFilePath), JsonUtilities.DefaultSerializerOptions);
31+
}
32+
2133
/// <summary>
2234
/// Process the command from history
2335
/// </summary>
@@ -38,30 +50,28 @@ public void ProcessHistoryCommand(CommandAst command)
3850
/// > Get-AzVM -VMName &lt;TestVM&gt;
3951
/// "TestVM" is predicted for Get-AzVM.
4052
/// </summary>
53+
/// <param name="commandNoun">The command noun</param>
4154
/// <param name="parameterName">The parameter name</param>
4255
/// <returns>The parameter value from the history command. Null if that is not available.</returns>
43-
public string GetParameterValueFromAzCommand(string parameterName)
56+
public string GetParameterValueFromAzCommand(string commandNoun, string parameterName)
4457
{
45-
if (_localParameterValues.TryGetValue(parameterName.ToUpper(), out var value))
58+
if (_command_param_to_resource_map.ContainsKey(commandNoun))
4659
{
47-
return value;
60+
parameterName = parameterName.ToLower();
61+
if (_command_param_to_resource_map[commandNoun].ContainsKey(parameterName))
62+
{
63+
var key = _command_param_to_resource_map[commandNoun][parameterName];
64+
if (_localParameterValues.TryGetValue(key, out var value))
65+
{
66+
return value;
67+
}
68+
}
4869
}
49-
5070
return null;
5171
}
5272

53-
/// <summary>
54-
/// Gets the key to the local parameter dictionary from the command noun and the parameter name.
55-
/// </summary>
56-
/// <param name="commandNoun">The noun in the PowerShell command, e.g. the noun for command New-AzVM is VM.</param>
57-
/// <param name="parameterName">The command's parameter name, e.g. "New-AzVM -Name" the parameter name is Name</param>
58-
/// <returns></returns>
59-
private static string GetLocalParameterKey(string commandNoun, string parameterName)
60-
{
61-
return _specialLocalParameterNames.Contains(parameterName) ? parameterName.ToUpper() : string.Concat(commandNoun, parameterName).ToUpper();
62-
}
63-
64-
private static string GetAzCommandNoun(string commandName)
73+
74+
public static string GetAzCommandNoun(string commandName)
6575
{
6676
var monikerIndex = commandName?.IndexOf(AzPredictorConstants.AzCommandMoniker, StringComparison.OrdinalIgnoreCase);
6777

@@ -91,7 +101,7 @@ private void ExtractLocalParameters(System.Collections.ObjectModel.ReadOnlyColle
91101
// We need to extract the noun to construct the parameter name.
92102

93103
var commandName = command.FirstOrDefault()?.ToString();
94-
var commandNoun = ParameterValuePredictor.GetAzCommandNoun(commandName);
104+
var commandNoun = ParameterValuePredictor.GetAzCommandNoun(commandName).ToLower();
95105
if (commandNoun == null)
96106
{
97107
return;
@@ -101,11 +111,17 @@ private void ExtractLocalParameters(System.Collections.ObjectModel.ReadOnlyColle
101111
{
102112
if (command[i - 1] is CommandParameterAst parameterAst && command[i] is StringConstantExpressionAst)
103113
{
104-
var parameterName = parameterAst.ParameterName;
105-
var key = ParameterValuePredictor.GetLocalParameterKey(commandNoun, parameterName);
106-
var parameterValue = command[i].ToString();
107-
this._localParameterValues.AddOrUpdate(key, parameterValue, (k, v) => parameterValue);
108-
}
114+
var parameterName = command[i - 1].ToString().ToLower().Trim('-');
115+
if (_command_param_to_resource_map.ContainsKey(commandNoun))
116+
{
117+
if (_command_param_to_resource_map[commandNoun].ContainsKey(parameterName))
118+
{
119+
var key = _command_param_to_resource_map[commandNoun][parameterName];
120+
var parameterValue = command[i].ToString();
121+
this._localParameterValues.AddOrUpdate(key, parameterValue, (k, v) => parameterValue);
122+
}
123+
}
124+
}
109125
}
110126
}
111127
}

tools/Az.Tools.Predictor/Az.Tools.Predictor/command_param_to_resource_map.json

Lines changed: 1 addition & 0 deletions
Large diffs are not rendered by default.

0 commit comments

Comments
 (0)