#!/usr/bin/ruby

usage = <<US
update-agg <trace table>
Example: update-agg ABCD_20090201
Will update ABCD_20090201_FlowsAggByDstIp and
ABCD_20090201_FlowsAggByDstIpPort from ABCD_20090201_Flows
US

trace = ARGV[0] || abort('Expecting trace name: ' + usage)

sql = <<SQL
UPDATE `#{trace}_FlowsAggByDstIp` SET
GtVerified = (SELECT COUNT(*)
FROM `#{trace}_Flows`
WHERE `#{trace}_Flows`.DstIp =
`#{trace}_FlowsAggByDstIp`.DstIp
AND GtState = 'verified'),
GtQuestioned = (SELECT COUNT(*)
FROM `#{trace}_Flows`
WHERE `#{trace}_Flows`.DstIp =
`#{trace}_FlowsAggByDstIp`.DstIp
AND GtState = 'questioned'),
GtProtos = (SELECT GROUP_CONCAT(DISTINCT GtProto)
FROM `#{trace}_Flows`
WHERE `#{trace}_Flows`.DstIp =
`#{trace}_FlowsAggByDstIp`.DstIp),
GtApps = (SELECT GROUP_CONCAT(DISTINCT GtApp)
FROM `#{trace}_Flows`
WHERE `#{trace}_Flows`.DstIp =
`#{trace}_FlowsAggByDstIp`.DstIp);

UPDATE `#{trace}_FlowsAggByDstIpPort` SET
GtVerified = (SELECT COUNT(*)
FROM `#{trace}_Flows`
WHERE `#{trace}_Flows`.DstIp =
`#{trace}_FlowsAggByDstIpPort`.DstIp
AND `#{trace}_Flows`.DstPort =
`#{trace}_FlowsAggByDstIpPort`.DstPort
AND GtState = 'verified'),
GtQuestioned = (SELECT COUNT(*)
FROM `#{trace}_Flows`
WHERE `#{trace}_Flows`.DstIp =
`#{trace}_FlowsAggByDstIpPort`.DstIp
AND `#{trace}_Flows`.DstPort =
`#{trace}_FlowsAggByDstIpPort`.DstPort
AND GtState = 'questioned'),
GtProtos = (SELECT GROUP_CONCAT(DISTINCT GtProto)
FROM `#{trace}_Flows`
WHERE `#{trace}_Flows`.DstIp =
`#{trace}_FlowsAggByDstIpPort`.DstIp
AND `#{trace}_Flows`.DstPort =
`#{trace}_FlowsAggByDstIpPort`.DstPort),
GtApps = (SELECT GROUP_CONCAT(DISTINCT GtApp)
FROM `#{trace}_Flows`
WHERE `#{trace}_Flows`.DstIp =
`#{trace}_FlowsAggByDstIpPort`.DstIp
AND `#{trace}_Flows`.DstPort =
`#{trace}_FlowsAggByDstIpPort`.DstPort);
SQL

puts sql

