-- Enable calling our lua profile code directly from the lua command line, -- which makes it easier to debug. -- We simulate the normal C++ environment by defining the required globals and functions. -- Usage: -- > cd profiles -- > lua5.1 debug.lua -- for more convenient printing of tables local pprint = require('lib/pprint') -- globals that are normally set from C++ -- profiles code modifies this table properties = {} -- should match values defined in include/extractor/guidance/road_classification.hpp road_priority_class = { motorway = 0, trunk = 2, primary = 4, secondary = 6, tertiary = 8, main_residential = 10, side_residential = 11, link_road = 14, bike_path = 16, foot_path = 18, connectivity = 31, } -- should match values defined in include/extractor/travel_mode.hpp mode = { inaccessible = 0, driving = 1, cycling = 2, walking = 3, ferry = 4, train = 5, pushing_bike = 6, } -- input tags, normally extracted from OSM data local way = { highway = 'primary', name = 'Main Street', --access = 'no' ["access:forward"] = 'no' --width = '3', --maxspeed = '30', --['maxspeed:advisory'] = '25', --oneway = '-1', --service = 'alley', --['oneway:bicycle'] = 'yes', --junction = 'roundabout', --['name:pronunciation'] = 'fuerloong', --route = 'ferry', --duration = '00:01:00', --hov = 'designated', --hov:lanes:forward"] = 'designated', --destination = 'Berlin', --["destination:ref"] = 'Nuremberg', --["destination:ref:forward"] = 'Hamburg;Dresden', } -- tag function normally provided via C++ function way:get_value_by_key(k) if not self['_debug'] then self['_debug'] = { _counts = {} } end if self['_debug']['_total'] then self['_debug']['_total'] = self['_debug']['_total'] + 1 else self['_debug']['_total'] = 1 end if self['_debug']['_counts'][k] then self['_debug']['_counts'][k] = self['_debug']['_counts'][k] + 1 else self['_debug']['_counts'][k] = 1 end return self[k] end -- Mock C++ helper functions which are called from LUA. -- FIXME -- Debugging LUA code that uses these will not work correctly -- unless we reimplement themethods in LUA. function durationIsValid(str) return true end function parseDuration(str) return 1 end function canonicalizeStringList(str) return str end -- helpers for sorting associative array function get_keys_sorted_by_value(tbl, sortFunction) local keys = {} for key in pairs(tbl) do table.insert(keys, key) end table.sort(keys, function(a, b) return sortFunction(tbl[a], tbl[b]) end) return keys end -- helper for printing sorted array function print_sorted(sorted,associative) for _, key in ipairs(sorted) do print(associative[key], key) end end -- start state of result table, normally set form C++ local result = { road_classification = {}, forward_speed = -1, backward_speed = -1, } -- the profile we want to debug require("car") -- call the way function way_function(way,result) -- and print the output pprint(way) print("=>") pprint(result) print("\n") print("Tag fetches:") sorted_counts = get_keys_sorted_by_value(way._debug._counts, function(a, b) return a > b end) print_sorted(sorted_counts, way._debug._counts) print(way._debug._total, 'total')