blob: 37665f3232cc7109ad9063a29350cb22d0ecd49c [file] [log] [blame]
<?php
/*******************************************************************************
* Copyright (c) 2014 Eclipse Foundation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Wayne Beaton (Eclipse Foundation)- initial API and implementation
*******************************************************************************/
/*
* Export committer information from the Foundation database. The information
* includes the name, committer id, email addresses, and project affiliations.
*
* e.g. http://www.eclipse.org/projects/export/committers.json.php
*
* INTERNAL USE ONLY: restricted to callers within the Eclipse Foundation.
*/
require_once(dirname(__FILE__) . "/../../eclipse.org-common/system/app.class.php");
$App = new App();
require_once(dirname(__FILE__) . "/../classes/common.php");
require_once(dirname(__FILE__) . "/../classes/debug.php");
mustBeEclipseFoundationCaller();
$data = array();
$data['_comment'] = 'This data is Eclipse Foundation confidential and may only be used as authorized by the Eclipse Foundation.';
/*
* TODO Do a better job of tracking organization affiliation.
*
* Unfortunately, the Foundation database does not track dates for organization
* affiliation. Further, we only have the ability to affiliate with one company.
* In light of this, we do a best guess as the active/inactive dates for affilation
* by using--when available--the EntryDate and ExpireDate for the organization
* membership as the active/inactive date for the committer.
*
* Bug 484377 There are some cases where the organization may have more than
* one entry in the database (e.g. they changed membership classes). In these
* cases, it is probable that only one of the records will contain an empty
* inactive date, and so--depending on the order returned by the sort--we may
* incorrectly list an inactive date for a company. The query gets a little
* twisted to account for this.
*
* There's two nested queries here. The first makes the data from the organization
* tables content consistent for our purposes. If, for example, an inactive date
* is null (or otherwise empty), a very large value (Captain Kirk's birthday) is
* used in place to allow for a max query in the outer scope. That very large value
* is replaced will null before it is used in the query result.
*
* This is far from ideal, but it's the best information that we have.
*/
$sql = "
select
p.PersonId as id, p.FName, p.LName, p.Email, pe.Email as secondary, p.comments,
a.CCode as CCode,
pp.ProjectId, pp.ActiveDate, pp.InactiveDate,
org.id as OrganizationId, org.name as OrganizationName,
org.isMember as isMember,
org.active as OrgActiveDate,
org.inactive as OrgInactiveDate
from People as p
join PeopleProjects as pp on p.PersonId = pp.PersonId and pp.Relation='CM'
left join
(select
pa.PersonId,
upper(CCode) as CCode
from PeopleAddresses as pa
join
(select
PersonId,
max(AddressId) as AddressId
from PeopleAddresses group by PersonId) as id
on pa.PersonId=id.PersonId and pa.AddressId=id.AddressId) as a on p.PersonId=a.PersonId
left join PeopleEmails as pe on p.PersonId=pe.PersonId
left join OrganizationContacts as oc on p.PersonId = oc.PersonId and oc.Relation='EMPLY'
left join (
select
id, name,
min(active) as active,
if(date(max(inactive))=date('2233-03-22'),null,max(inactive)) as inactive,
active is not null and date(max(inactive))=date('2233-03-22') as isMember
from (
select
o.OrganizationId as id, o.Name1 as name,
if (om.EntryDate='' OR om.EntryDate='0000-00-00' OR om.EntryDate IS NULL, null, om.EntryDate) as active,
if (om.ExpiryDate='' OR om.ExpiryDate='0000-00-00' OR om.ExpiryDate IS NULL, date('2233-03-22'), om.ExpiryDate) as inactive
from Organizations as o
left join OrganizationMemberships as om on o.OrganizationId=om.OrganizationId
) as orgs
group by id
) as org on oc.OrganizationId=org.id";
$result = $App->foundation_sql($sql);
function addEmail(&$committer, $email) {
if (!$email) return;
$email = utf8_encode($email);
if (empty($committer['email'])) $committer['email'] = array();
if (in_array($email, $committer['email'])) return;
$committer['email'][] = $email;
}
while ($row=mysql_fetch_assoc($result)) {
$id = utf8_encode($row['id']);
$data['committers'][$id]['id'] = $id;
$data['committers'][$id]['first'] = utf8_encode($row['FName']);
$data['committers'][$id]['last'] = utf8_encode($row['LName']);
$data['committers'][$id]['primary'] = $row['Email'];
$data['committers'][$id]['country'] = $row['CCode'];
addEmail($data['committers'][$id], $row['Email']);
addEmail($data['committers'][$id], $row['secondary']);
if (preg_match_all('/alt-email:(\S+)/i', $row['comments'], $matches)) {
foreach($matches[1] as $email) {
addEmail($data['committers'][$id], $email);
}
}
$data['committers'][$id]['projects'][$row['ProjectId']] = array(
'active' => $row['ActiveDate'],
'inactive' => isset($row['InactiveDate']) ? $row['InactiveDate'] : null
);
if (isset($row['OrganizationId'])) {
$data['committers'][$id]['affiliations'][$row['OrganizationId']] = array(
'name' => $row['OrganizationName'],
'active' => $row['OrgActiveDate'],
'inactive' => $row['OrgInactiveDate']
);
$orgId = $row['OrganizationId'];
$isMember = $row['isMember'];
$data['organizations'][$orgId] = array(
'id' => $orgId,
'name' => $row['OrganizationName'],
'isMember' => $isMember,
'active' => $row['OrgActiveDate'],
'inactive' => $row['OrgInactiveDate'],
'url' => $isMember ? "http://eclipse.org/membership/showMember.php?member_id=$orgId" : null,
'image' => $isMember ? "http://eclipse.org/membership/scripts/get_image.php?id=$orgId&size=small" : null
);
}
}
$sql = "select user_uid as id, user_mail as email from users_emailhistory";
$result = $App->eclipse_sql($sql);
while ($row=mysql_fetch_assoc($result)) {
$id = $row['id'];
if (!$id) continue;
if (!isset($data['committers'][$id])) continue;
addEmail($data['committers'][$id], $row['email']);
}
echo json_encode($data);
?>