/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

drop  dataverse events if exists;
create  dataverse events;

use events;


create type events.AddressType as
 closed {
  street : string,
  city : string,
  zip : string
}

create type events.EventType as
 closed {
  name : string,
  location : AddressType?,
  organizers : {{{
          name : string,
          role : string
      }
}},
  sponsoring_sigs : [{
          sig_name : string,
          chapter_name : string
      }
],
  interest_keywords : {{string}},
  price : double?,
  start_time : datetime,
  end_time : datetime
}

create  nodegroup group1 if not exists  on
    asterix_nc1,
    asterix_nc2
;
create  dataset Event(EventType) primary key name on group1;

write output to asterix_nc1:"/tmp/q2.adm"
select element {'sig_name':sig_name,'total_count':sig_sponsorship_count,'chapter_breakdown':by_chapter}
from  Event as event,
      event.sponsoring_sigs as sponsor
with  es as {'event':event,'sponsor':sponsor}
group by sponsor.sig_name as sig_name
with  sig_sponsorship_count as count(es),
      by_chapter as (
      select element {'chapter_name':chapter_name,'escount':count(e)}
      from  es as e
      group by e.sponsor.chapter_name as chapter_name
  )
order by sig_sponsorship_count desc
limit 5
;
