Package edu.brown.benchmark.wikipedia.procedures

Source Code of edu.brown.benchmark.wikipedia.procedures.GetPageAuthenticated

/*******************************************************************************
* oltpbenchmark.com
*  Project Info:  http://oltpbenchmark.com
*  Project Members:    Carlo Curino <carlo.curino@gmail.com>
*              Evan Jones <ej@evanjones.ca>
*              DIFALLAH Djellel Eddine <djelleleddine.difallah@unifr.ch>
*              Andy Pavlo <pavlo@cs.brown.edu>
*              CUDRE-MAUROUX Philippe <philippe.cudre-mauroux@unifr.ch> 
*                  Yang Zhang <yaaang@gmail.com>
*
*  This library is free software; you can redistribute it and/or modify it under the terms
*  of the GNU General Public License as published by the Free Software Foundation;
*  either version 3.0 of the License, or (at your option) any later version.
*
*  This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
*  without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*  See the GNU Lesser General Public License for more details.
******************************************************************************/
package edu.brown.benchmark.wikipedia.procedures;

import org.voltdb.ProcInfo;
import org.voltdb.VoltProcedure;
import org.voltdb.SQLStmt;
import org.voltdb.VoltTable;

import edu.brown.benchmark.wikipedia.WikipediaConstants;

@ProcInfo(
    partitionInfo = "PAGE.PAGE_ID: 0",
    singlePartition = false
)
public class GetPageAuthenticated extends VoltProcedure {
 
    // -----------------------------------------------------------------
    // STATEMENTS
    // -----------------------------------------------------------------
   
    public SQLStmt selectPageRestriction = new SQLStmt(
        "SELECT * FROM " + WikipediaConstants.TABLENAME_PAGE_RESTRICTIONS +
        " WHERE pr_page = ?"
    );
    public SQLStmt selectIpBlocks = new SQLStmt(
        "SELECT * FROM " + WikipediaConstants.TABLENAME_IPBLOCKS +
        " WHERE ipb_user = ?"
    );
    public SQLStmt selectPageRevision = new SQLStmt(
        "SELECT * " +
        "  FROM " + WikipediaConstants.TABLENAME_REVISION +
        " WHERE rev_page = ? " +
        "   AND rev_id = ? "
    );
    public SQLStmt selectPage = new SQLStmt(
        "SELECT page_title, page_latest, page_restrictions " +
        "  FROM " + WikipediaConstants.TABLENAME_PAGE  +
        " WHERE page_id = ? " +
        "   AND page_namespace = ?"
    );
    public SQLStmt selectText = new SQLStmt(
        "SELECT old_text, old_flags FROM " + WikipediaConstants.TABLENAME_TEXT +
        " WHERE old_page = ? " +
        "   AND old_id = ? "
    );
  public SQLStmt selectUser = new SQLStmt(
        "SELECT * FROM " + WikipediaConstants.TABLENAME_USER +
        " WHERE user_id = ? LIMIT 1"
    );
  public SQLStmt selectGroup = new SQLStmt(
        "SELECT ug_group FROM " + WikipediaConstants.TABLENAME_USER_GROUPS +
        " WHERE ug_user = ?"
    );

    // -----------------------------------------------------------------
    // RUN
    // -----------------------------------------------------------------
 
    public VoltTable run(long pageId, int pageNamespace, int userId, String userIp, boolean forSelect) {
        assert (userId >= 0);
        VoltTable rs[] = null;
       
        // Retrieve the user data, if the user is logged in
        voltQueueSQL(selectPageRestriction, pageId);
        voltQueueSQL(selectIpBlocks, userId);
        voltQueueSQL(selectUser, userId);
        voltQueueSQL(selectGroup, userId);
        voltQueueSQL(selectPage, pageId, pageNamespace);
       
        rs = voltExecuteSQL();
       
        // Grab Page Restrictions
        while (rs[0].advanceRow()) {
            String pr_type = rs[0].getString(0);
            assert(pr_type != null);
        } // WHILE

        // check using blocking of a user by either the IP address or the
        // user_name
        while (rs[1].advanceRow()) {
            String ipb_expiry = rs[1].getString(10);
            assert(ipb_expiry != null);
        } // WHILE
       
        // Double check that we have a valid userId
        if (rs[2].advanceRow() == false) {
            throw new VoltAbortException("Invalid UserId: " + userId);
        }
        String user_text = rs[2].getString(2);

        // Fetch all groups the user might belong to (access control information)
        while (rs[3].advanceRow()) {
            @SuppressWarnings("unused")
            String userGroupName = rs[3].getString(0);
        }
       
        // Check that we have a page
        if (rs[4].advanceRow() == false) {
            String msg = String.format("Invalid pageId %d", pageId);
            throw new VoltAbortException(msg);
        }
        int col = 0;
        String pageTitle = rs[4].getString(col++);
        long pageLatest = rs[4].getLong(col++);

        // Grab Page Revision + Text
        voltQueueSQL(selectPageRevision, pageId, pageId);
        voltQueueSQL(selectText, pageId, pageLatest);
        rs = voltExecuteSQL();
        if (rs[0].advanceRow() == false) {
            String msg = String.format("No such revision revId=%d exists for pageId:%d / pageNamespace:%d",
                                       pageLatest, pageId, pageNamespace);
            throw new VoltAbortException(msg);
        }
        long revisionId = rs[0].getLong(0);
        long textId = rs[0].getLong(2);
        assert(rs[0].advanceRow() == false);

        // NOTE: the following is our variation of wikipedia... the original did
        // not contain old_page column!
        if (rs[1].advanceRow() == false) {
            String msg = "No such text: " + textId + " for page_id:" + pageId + " page_namespace: " + pageNamespace;
            throw new VoltAbortException(msg);
        }
        String old_text = rs[1].getString(0);
       
        VoltTable result = new VoltTable(WikipediaConstants.GETPAGE_OUTPUT_COLS);
        if (forSelect == false) {
            result.addRow(pageId,       // PAGE_ID
                          pageTitle,    // PAGE_TITLE
                          old_text,     // OLD_TEXT
                          textId,       // TEXT_ID
                          revisionId,   // REVISION_ID
                          user_text);   // USER_TEXT
        }
        assert !rs[0].advanceRow();
        return (result);
    }

}
TOP

Related Classes of edu.brown.benchmark.wikipedia.procedures.GetPageAuthenticated

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.