X-Git-Url: http://git.nguyen.vg/gitweb/?a=blobdiff_plain;f=src%2Foptions.ml;h=fbbd73e44b68ddcb7b7fbd1a7d5e153f0e8e3279;hb=b281387c0d6115086ad3c3f3d0510be734fc29a7;hp=e1f02f2e8b8c1bccc9c70eef2f40b294aed181f5;hpb=4b52da1a20a4fe031930bb96d2ca46bec06dc529;p=SXSI%2Fxpathcomp.git diff --git a/src/options.ml b/src/options.ml index e1f02f2..fbbd73e 100644 --- a/src/options.ml +++ b/src/options.ml @@ -1,18 +1,5 @@ -let index_empty_texts = ref false -let sample_factor = ref 64 -let disable_text_collection = ref false -let tc_threshold = ref 60000 - -let query = ref "" -let input_file = ref "" -let output_file = ref None -let save_file = ref "" -let count_only = ref false -let time = ref false -let bottom_up = ref false -let no_jump = ref false -let verbose = ref false -let text_index_type = ref 0 +open Format +open Config let set_index_type = function | "default" -> text_index_type := 0 @@ -20,8 +7,7 @@ let set_index_type = function | "rlcsa" -> text_index_type := 2 | s -> raise (Arg.Bad(s)) -let usage_msg = Printf.sprintf "%s 'query' [output]" Sys.argv.(0) - +let usage_msg = Printf.sprintf "%s [options] 'query' [output]" Sys.argv.(0) let pos = ref 0 let anon_fun = @@ -31,25 +17,93 @@ let anon_fun = | 2 -> output_file := Some s; incr pos | _ -> raise (Arg.Bad(s)) -let spec = [ "-c", Arg.Set(count_only), "counting only (don't materialize the result set)"; - "-t", Arg.Set(time), "print timing statistics"; - "-max-tc", Arg.Set_int(tc_threshold), "set maximum count for which the TextCollection is used"; - "-f", Arg.Set_int(sample_factor), "sample factor [default=64]"; - "-i", Arg.Set(index_empty_texts), "index empty texts [default=false]"; - "-d", Arg.Set(disable_text_collection), "disable text collection[default=false]"; - "-s", Arg.Set_string(save_file), "save the intermediate representation into file.srx"; - "-b", Arg.Set(bottom_up), "real bottom up run"; - "-nj", Arg.Set(no_jump), "disable jumping"; - "-index-type", Arg.Symbol ([ "default"; "swcsa"; "rlcsa" ], set_index_type), - "choose text index type"; - "-v", Arg.Set(verbose), "verbose mode"; - ] +let set_logger s = + List.iter (fun t -> + if t = "" then () + else + match Utils.String.explode t ':' with + [ tr; lvl ] -> + let l = try int_of_string lvl with _ -> raise (Arg.Bad (lvl)) in + if Logger.is_logger tr then Logger.activate tr l + else raise (Arg.Bad (t)) + | _ -> raise (Arg.Bad (t)) + ) (Utils.String.explode s ',') + +let pretty_loggers () = + ignore(flush_str_formatter()); + Pretty.print_list + ~sep:", " + (fun f s -> fprintf f "%s" s) + str_formatter + (Logger.available ()); + flush_str_formatter () + +let spec = Arg.align + [ "-c", Arg.Set(count_only), + " counting only (don't materialize the result set)"; + + "-two", Arg.Set(twopass), + " Use twopass algorithm"; + + "-f", Arg.Set_int(sample_factor), + " sample factor [default=64]"; + + "-ne", Arg.Clear(index_empty_texts), + " don't index empty texts [default=index]"; + + "-d", Arg.Set(disable_text_collection), + " disable text collection[default=false]"; + + "-s", Arg.Set_string(save_file), + " save the intermediate representation into file.srx"; + + "-b", Arg.Set(bottom_up), " real bottom up run"; + + "-nj", Arg.Set(no_jump), " disable jumping"; + + "-nc", Arg.Set(no_cache), " disable caching"; + + "-nw", Arg.Set(no_wrap_results), " do not wrap results in "; + + "-p", Arg.Set(do_perf), " dump perf counters (Linux only)"; + + "-index-type", Arg.Symbol ([ "default"; "swcsa"; "rlcsa" ], + set_index_type), + " choose text index type"; + + "-r", Arg.Set_int(repeat), + " repeat query execution n time (benchmarking only, default 1)"; + + "-doc-stats", Arg.Set(docstats), + " Compute document statistics (performs full traversal)"; + + "-v", Arg.Set(verbose), " verbose mode"; ] @ +IFNDEF NTRACE +THEN [ + "-log", Arg.String (set_logger), + " enable logging with the specified level. Valid loggers are: " + ^ (pretty_loggers ()) + ] +ELSE [] +END + +let real_spec = + spec @ [ + "-", Arg.Unit (fun () -> anon_fun "-"), ""; + ] + let parse_cmdline() = - let _ = Arg.parse spec anon_fun usage_msg + let _ = + try + Arg.parse_argv Sys.argv real_spec anon_fun usage_msg; + if (!pos > 3 || !pos < 2) then raise (Arg.Bad "Invalid number of arguments") + with + Arg.Bad s | Arg.Help s -> + eprintf "%s\n" (Arg.usage_string spec usage_msg); + exit 1 in - if (!pos > 3 || !pos < 2) - then begin Arg.usage spec usage_msg; exit 1 end + Logger.set_verbose !verbose