Home > other >  Reading the file only once for every method call
Reading the file only once for every method call

Time:04-27

I am new to object-oriented programming and I am working on a small personal project with some SQL scripts.

I have a scenario where a SQL script calls a static method with a file path as input.

queries = Select Query from Table where Utils.ContainsKeyword(Query, @Path1) AND NOT Utils.ContainsKeyword(Query, @Path2);

I had initially created a static class that does the following:

public static class Utils
{
   public static bool ContainsKeyword(string query, string path)
   {
      var isQueryInFile = false;
      var stringFromFile = GetStringFromFile(path);
      List<Regex>regexList = GetRegexList(stringFromFile);
      if(whiteSpaceRegex != null)
      {
        isQueryInFile = regexList.Any(pattern => pattern.IsMatch(query));
      }
      return isQueryInFile;
   }
   
   private static string GetStringFromFile(string path)
   {
     var words = String.Empty;
     if(!string.IsNullOrEmpty(path))
     {
       try
       {
         using (StreamReader sr = File.OpenText(path))
         {
           words = sr.ReadToEnd().Replace(Environment.Newline, "");
         }
       }
       catch { return words; }
     }
     return words;
   }

  private static GetRegexList(string words)
  {
    if(string.IsNullOrEmpty(words)) { return null; }
    return words.Split(',').Select(w=> new Regex(@"\b"   Regex.Escape(w)   @'\b', RegexOptions.Compiled | RegexOptions.IgnoreCase)).ToList();
  }
}

My problem is that I neither want to read from the file every time the ContainsKeyword static method is called nor do I want to create a new RegexList every time. Also, I cannot change the SQL script and I have to send the path to the file as an input parameter for the method call in the SQL script since the path might change in the future.

Is there a way to make sure I only read the contents from the input path only once, store them in a string, and use the string for the match with different input queries?

CodePudding user response:

I neither want to read from the file every time the ContainsKeyword static method is called nor do I want to create a new RegexList every time

You can do it like this: use a field to store the list the first time it's called.

public static class Utils {

    private static List<Regex> regexList;

    public static bool ContainsKeyword(string query, string path1)
    {
        var isQueryInFile = false;

        if (regexList == null)
        {
            var stringFromFile = GetStringFromFile(path1);
            regexList = GetRegexList(stringFromFile);
        }

        // etc        

CodePudding user response:

To read the content only once, saving in memory will probaby be needed. Memory capacity could be an issue.

public Dictionary<string, string> FileContentCache { get; set; } // make sure that gets initialized


public string GetFileContentCache(string path)
{
    if (FileContentCache == null) FileContentCache = new Dictionary<string, string>();
    if (FileContentCache.ContainsKey(path))
        return FileContentCache[path];
        
    var fileData = GetStringFromFile(path);
    FileContentCache.Add(path, fileData);
    return fileData;
}
  • Related