diff --git a/src/main/java/com/metaweb/gridworks/GridworksServlet.java b/src/main/java/com/metaweb/gridworks/GridworksServlet.java index 8c552f233..4b6de9885 100644 --- a/src/main/java/com/metaweb/gridworks/GridworksServlet.java +++ b/src/main/java/com/metaweb/gridworks/GridworksServlet.java @@ -18,7 +18,9 @@ import com.metaweb.gridworks.commands.Command; import com.metaweb.gridworks.commands.edit.AddColumnCommand; import com.metaweb.gridworks.commands.edit.CreateProjectFromUploadCommand; import com.metaweb.gridworks.commands.edit.DoTextTransformCommand; +import com.metaweb.gridworks.commands.edit.JoinMultiValueCellsCommand; import com.metaweb.gridworks.commands.edit.RemoveColumnCommand; +import com.metaweb.gridworks.commands.edit.SplitMultiValueCellsCommand; import com.metaweb.gridworks.commands.edit.UndoRedoCommand; import com.metaweb.gridworks.commands.info.ComputeFacetsCommand; import com.metaweb.gridworks.commands.info.ExportRowsCommand; @@ -57,6 +59,8 @@ public class GridworksServlet extends HttpServlet { _commands.put("add-column", new AddColumnCommand()); _commands.put("remove-column", new RemoveColumnCommand()); + _commands.put("join-multi-value-cells", new JoinMultiValueCellsCommand()); + _commands.put("split-multi-value-cells", new SplitMultiValueCellsCommand()); _commands.put("reconcile", new ReconcileCommand()); _commands.put("approve-reconcile", new ApproveReconcileCommand()); diff --git a/src/main/java/com/metaweb/gridworks/commands/edit/JoinMultiValueCellsCommand.java b/src/main/java/com/metaweb/gridworks/commands/edit/JoinMultiValueCellsCommand.java new file mode 100644 index 000000000..d9c1ade51 --- /dev/null +++ b/src/main/java/com/metaweb/gridworks/commands/edit/JoinMultiValueCellsCommand.java @@ -0,0 +1,39 @@ +package com.metaweb.gridworks.commands.edit; + + import java.io.IOException; +import java.util.Properties; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import com.metaweb.gridworks.commands.Command; +import com.metaweb.gridworks.model.AbstractOperation; +import com.metaweb.gridworks.model.Project; +import com.metaweb.gridworks.model.operations.MultiValueCellJoinOperation; +import com.metaweb.gridworks.process.Process; + +public class JoinMultiValueCellsCommand extends Command { + @Override + public void doPost(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + + try { + Project project = getProject(request); + + int cellIndex = Integer.parseInt(request.getParameter("cellIndex")); + int keyCellIndex = Integer.parseInt(request.getParameter("keyCellIndex")); + String separator = request.getParameter("separator"); + + AbstractOperation op = new MultiValueCellJoinOperation(cellIndex, keyCellIndex, separator); + Process process = op.createProcess(project, new Properties()); + + boolean done = project.processManager.queueProcess(process); + + respond(response, "{ \"code\" : " + (done ? "\"ok\"" : "\"pending\"") + " }"); + + } catch (Exception e) { + respondException(response, e); + } + } +} diff --git a/src/main/java/com/metaweb/gridworks/commands/edit/SplitMultiValueCellsCommand.java b/src/main/java/com/metaweb/gridworks/commands/edit/SplitMultiValueCellsCommand.java new file mode 100644 index 000000000..d6ece527d --- /dev/null +++ b/src/main/java/com/metaweb/gridworks/commands/edit/SplitMultiValueCellsCommand.java @@ -0,0 +1,40 @@ +package com.metaweb.gridworks.commands.edit; + + import java.io.IOException; +import java.util.Properties; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import com.metaweb.gridworks.commands.Command; +import com.metaweb.gridworks.model.AbstractOperation; +import com.metaweb.gridworks.model.Project; +import com.metaweb.gridworks.model.operations.MultiValueCellSplitOperation; +import com.metaweb.gridworks.process.Process; + +public class SplitMultiValueCellsCommand extends Command { + @Override + public void doPost(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + + try { + Project project = getProject(request); + + int cellIndex = Integer.parseInt(request.getParameter("cellIndex")); + int keyCellIndex = Integer.parseInt(request.getParameter("keyCellIndex")); + String separator = request.getParameter("separator"); + String mode = request.getParameter("mode"); + + AbstractOperation op = new MultiValueCellSplitOperation(cellIndex, keyCellIndex, separator, mode); + Process process = op.createProcess(project, new Properties()); + + boolean done = project.processManager.queueProcess(process); + + respond(response, "{ \"code\" : " + (done ? "\"ok\"" : "\"pending\"") + " }"); + + } catch (Exception e) { + respondException(response, e); + } + } +} diff --git a/src/main/java/com/metaweb/gridworks/model/Row.java b/src/main/java/com/metaweb/gridworks/model/Row.java index 360bb4dd6..8f33cb568 100644 --- a/src/main/java/com/metaweb/gridworks/model/Row.java +++ b/src/main/java/com/metaweb/gridworks/model/Row.java @@ -14,9 +14,9 @@ import com.metaweb.gridworks.expr.HasFields; public class Row implements Serializable, HasFields, Jsonizable { private static final long serialVersionUID = -689264211730915507L; - public boolean flagged; - public boolean starred; - final public List cells; + public boolean flagged; + public boolean starred; + final public List cells; transient public List contextRows; transient public List contextCells; @@ -25,6 +25,14 @@ public class Row implements Serializable, HasFields, Jsonizable { cells = new ArrayList(cellCount); } + public Row dup() { + Row row = new Row(cells.size()); + row.flagged = flagged; + row.starred = starred; + row.cells.addAll(cells); + return row; + } + @Override public Object getField(String name, Properties bindings) { if ("flagged".equals(name)) { @@ -37,6 +45,41 @@ public class Row implements Serializable, HasFields, Jsonizable { return null; } + public boolean isEmpty() { + for (Cell cell : cells) { + if (cell != null && cell.value != null && !isValueBlank(cell.value)) { + return false; + } + } + return true; + } + + public Cell getCell(int cellIndex) { + if (cellIndex < cells.size()) { + return cells.get(cellIndex); + } else { + return null; + } + } + + public Object getCellValue(int cellIndex) { + if (cellIndex < cells.size()) { + Cell cell = cells.get(cellIndex); + if (cell != null) { + return cell.value; + } + } + return null; + } + + public boolean isCellBlank(int cellIndex) { + return isValueBlank(getCellValue(cellIndex)); + } + + protected boolean isValueBlank(Object value) { + return value == null || !(value instanceof String) || ((String) value).trim().isEmpty(); + } + public void setCell(int cellIndex, Cell cell) { if (cellIndex < cells.size()) { cells.set(cellIndex, cell); diff --git a/src/main/java/com/metaweb/gridworks/model/changes/MassRowChange.java b/src/main/java/com/metaweb/gridworks/model/changes/MassRowChange.java new file mode 100644 index 000000000..a2b5d230d --- /dev/null +++ b/src/main/java/com/metaweb/gridworks/model/changes/MassRowChange.java @@ -0,0 +1,37 @@ +package com.metaweb.gridworks.model.changes; + +import java.util.ArrayList; +import java.util.List; + +import com.metaweb.gridworks.history.Change; +import com.metaweb.gridworks.model.Project; +import com.metaweb.gridworks.model.Row; + +public class MassRowChange implements Change { + private static final long serialVersionUID = 5640738656190790569L; + + final protected List _newRows; + protected List _oldRows; + + public MassRowChange(List newRows) { + _newRows = newRows; + } + + @Override + public void apply(Project project) { + synchronized (project) { + _oldRows = new ArrayList(project.rows); + project.rows.clear(); + project.rows.addAll(_newRows); + } + } + + @Override + public void revert(Project project) { + synchronized (project) { + project.rows.clear(); + project.rows.addAll(_oldRows); + } + } + +} diff --git a/src/main/java/com/metaweb/gridworks/model/operations/EngineDependentOperation.java b/src/main/java/com/metaweb/gridworks/model/operations/EngineDependentOperation.java index d1d994e8c..7dec9e549 100644 --- a/src/main/java/com/metaweb/gridworks/model/operations/EngineDependentOperation.java +++ b/src/main/java/com/metaweb/gridworks/model/operations/EngineDependentOperation.java @@ -9,7 +9,9 @@ import com.metaweb.gridworks.model.Project; import com.metaweb.gridworks.util.ParsingUtilities; abstract public class EngineDependentOperation implements AbstractOperation { - final private String _engineConfigString; + private static final long serialVersionUID = -2800091595856881731L; + + final private String _engineConfigString; transient protected JSONObject _engineConfig; diff --git a/src/main/java/com/metaweb/gridworks/model/operations/MultiValueCellJoinOperation.java b/src/main/java/com/metaweb/gridworks/model/operations/MultiValueCellJoinOperation.java new file mode 100644 index 000000000..5e2950259 --- /dev/null +++ b/src/main/java/com/metaweb/gridworks/model/operations/MultiValueCellJoinOperation.java @@ -0,0 +1,110 @@ +package com.metaweb.gridworks.model.operations; + +import java.util.ArrayList; +import java.util.List; +import java.util.Properties; + +import org.json.JSONException; +import org.json.JSONWriter; + +import com.metaweb.gridworks.history.Change; +import com.metaweb.gridworks.history.HistoryEntry; +import com.metaweb.gridworks.model.AbstractOperation; +import com.metaweb.gridworks.model.Cell; +import com.metaweb.gridworks.model.Column; +import com.metaweb.gridworks.model.Project; +import com.metaweb.gridworks.model.Row; +import com.metaweb.gridworks.model.changes.MassRowChange; +import com.metaweb.gridworks.process.Process; +import com.metaweb.gridworks.process.QuickHistoryEntryProcess; + +public class MultiValueCellJoinOperation implements AbstractOperation { + private static final long serialVersionUID = 3134524625206033285L; + + final protected int _cellIndex; + final protected int _keyCellIndex; + final protected String _separator; + + public MultiValueCellJoinOperation( + int cellIndex, + int keyCellIndex, + String separator + ) { + _cellIndex = cellIndex; + _keyCellIndex = keyCellIndex; + _separator = separator; + } + + @Override + public Process createProcess(Project project, Properties options) + throws Exception { + + Column column = project.columnModel.columns.get(_cellIndex); + if (column == null) { + throw new Exception("No column corresponding to cell index " + _cellIndex); + } + + List newRows = new ArrayList(); + + int oldRowCount = project.rows.size(); + for (int r = 0; r < oldRowCount; r++) { + Row oldRow = project.rows.get(r); + + if (oldRow.isCellBlank(_keyCellIndex)) { + newRows.add(oldRow.dup()); + continue; + } + + int r2 = r + 1; + while (r2 < oldRowCount && project.rows.get(r2).isCellBlank(_keyCellIndex)) { + r2++; + } + + if (r2 == r + 1) { + newRows.add(oldRow.dup()); + continue; + } + + StringBuffer sb = new StringBuffer(); + for (int r3 = r; r3 < r2; r3++) { + Object value = project.rows.get(r3).getCellValue(_cellIndex); + if (value != null) { + if (sb.length() > 0) { + sb.append(_separator); + } + sb.append(value.toString()); + } + } + + for (int r3 = r; r3 < r2; r3++) { + Row newRow = project.rows.get(r3).dup(); + if (r3 == r) { + newRow.setCell(_cellIndex, new Cell(sb.toString(), null)); + } else { + newRow.setCell(_cellIndex, null); + } + + if (!newRow.isEmpty()) { + newRows.add(newRow); + } + } + + r = r2 - 1; // r will be incremented by the for loop anyway + } + + String description = "Join multi-value cells in column " + column.getHeaderLabel(); + + Change change = new MassRowChange(newRows); + HistoryEntry historyEntry = new HistoryEntry( + project, description, this, change); + + return new QuickHistoryEntryProcess(project, historyEntry); + } + + @Override + public void write(JSONWriter writer, Properties options) + throws JSONException { + // TODO Auto-generated method stub + + } +} diff --git a/src/main/java/com/metaweb/gridworks/model/operations/MultiValueCellSplitOperation.java b/src/main/java/com/metaweb/gridworks/model/operations/MultiValueCellSplitOperation.java new file mode 100644 index 000000000..854fbbd65 --- /dev/null +++ b/src/main/java/com/metaweb/gridworks/model/operations/MultiValueCellSplitOperation.java @@ -0,0 +1,126 @@ +package com.metaweb.gridworks.model.operations; + + import java.util.ArrayList; +import java.util.List; +import java.util.Properties; + +import org.apache.commons.lang.StringUtils; +import org.json.JSONException; +import org.json.JSONWriter; + +import com.metaweb.gridworks.history.Change; +import com.metaweb.gridworks.history.HistoryEntry; +import com.metaweb.gridworks.model.AbstractOperation; +import com.metaweb.gridworks.model.Cell; +import com.metaweb.gridworks.model.Column; +import com.metaweb.gridworks.model.Project; +import com.metaweb.gridworks.model.Row; +import com.metaweb.gridworks.model.changes.MassRowChange; +import com.metaweb.gridworks.process.Process; +import com.metaweb.gridworks.process.QuickHistoryEntryProcess; + +public class MultiValueCellSplitOperation implements AbstractOperation { + private static final long serialVersionUID = 8217930220439070322L; + + final protected int _cellIndex; + final protected int _keyCellIndex; + final protected String _separator; + final protected String _mode; + + public MultiValueCellSplitOperation( + int cellIndex, + int keyCellIndex, + String separator, + String mode + ) { + _cellIndex = cellIndex; + _keyCellIndex = keyCellIndex; + _separator = separator; + _mode = mode; + } + + @Override + public Process createProcess(Project project, Properties options) + throws Exception { + + Column column = project.columnModel.columns.get(_cellIndex); + if (column == null) { + throw new Exception("No column corresponding to cell index " + _cellIndex); + } + + List newRows = new ArrayList(); + + int oldRowCount = project.rows.size(); + for (int r = 0; r < oldRowCount; r++) { + Row oldRow = project.rows.get(r); + if (oldRow.isCellBlank(_cellIndex)) { + newRows.add(oldRow.dup()); + continue; + } + + Object value = oldRow.getCellValue(_cellIndex); + String s = value instanceof String ? ((String) value) : value.toString(); + String[] values = null; + if (_mode.equals("regex")) { + values = s.split(_separator); + } else { + values = StringUtils.splitByWholeSeparator(s, _separator); + } + + if (values.length < 2) { + newRows.add(oldRow.dup()); + continue; + } + + // First value goes into the same row + { + Row firstNewRow = oldRow.dup(); + firstNewRow.setCell(_cellIndex, new Cell(values[0].trim(), null)); + + newRows.add(firstNewRow); + } + + int r2 = r + 1; + for (int v = 1; v < values.length; v++) { + Cell newCell = new Cell(values[v].trim(), null); + + if (r2 < project.rows.size()) { + Row oldRow2 = project.rows.get(r2); + if (oldRow2.isCellBlank(_cellIndex) && + oldRow2.isCellBlank(_keyCellIndex)) { + + Row newRow = oldRow2.dup(); + newRow.setCell(_cellIndex, newCell); + + newRows.add(newRow); + r2++; + + continue; + } + } + + Row newRow = new Row(_cellIndex + 1); + newRow.setCell(_cellIndex, newCell); + + newRows.add(newRow); + } + + r = r2 - 1; // r will be incremented by the for loop anyway + } + + String description = "Split multi-value cells in column " + column.getHeaderLabel(); + + Change change = new MassRowChange(newRows); + HistoryEntry historyEntry = new HistoryEntry( + project, description, this, change); + + return new QuickHistoryEntryProcess(project, historyEntry); + } + + @Override + public void write(JSONWriter writer, Properties options) + throws JSONException { + // TODO Auto-generated method stub + + } +} diff --git a/src/main/webapp/scripts/project/data-table-view.js b/src/main/webapp/scripts/project/data-table-view.js index c965cd8e6..39b491cff 100644 --- a/src/main/webapp/scripts/project/data-table-view.js +++ b/src/main/webapp/scripts/project/data-table-view.js @@ -525,7 +525,7 @@ DataTableView.prototype._createMenuForColumnHeader = function(column, index, elm ] }, { - label: "Collapse/Expand", + label: "View", tooltip: "Collapse/expand columns to make viewing the data more convenient", submenu: [ { @@ -559,17 +559,18 @@ DataTableView.prototype._createMenuForColumnHeader = function(column, index, elm }, {}, { - label: "Add Column Based on This Column", - click: function() { self._doAddColumn(column, index, "value"); } - }, - { - label: "Remove This Column", - click: function() { self._doRemoveColumn(column, index); } - }, - {}, - { - label: "Text Transform", + label: "Edit", submenu: [ + { "heading" : "Column Operations" }, + { + label: "Add Column Based on This Column", + click: function() { self._doAddColumn(column, index, "value"); } + }, + { + label: "Remove This Column", + click: function() { self._doRemoveColumn(column, index); } + }, + { "heading" : "Cell Content Transformations" }, { label: "To Titlecase", click: function() { self._doTextTransform(column, "toTitlecase(value)"); } @@ -586,6 +587,15 @@ DataTableView.prototype._createMenuForColumnHeader = function(column, index, elm { label: "Custom Expression ...", click: function() { self._doTextTransformPrompt(column); } + }, + { "heading" : "Advanced Transformations" }, + { + label: "Join Multi-Value Cells ...", + click: function() { self._doJoinMultiValueCells(column); } + }, + { + label: "Split Multi-Value Cells ...", + click: function() { self._doSplitMultiValueCells(column); } } ] }, @@ -624,7 +634,7 @@ DataTableView.prototype._createMenuForColumnHeader = function(column, index, elm } ] } - ], elmt); + ], elmt, { width: "120px", horizontal: false }); }; DataTableView.prototype._doFilterByExpressionPrompt = function(column, expression) { @@ -781,6 +791,35 @@ DataTableView.prototype._doRemoveColumn = function(column, index) { ); }; +DataTableView.prototype._doJoinMultiValueCells = function(column) { + var separator = window.prompt("Enter separator to use between values", ", "); + if (separator != null) { + this._doPostThenUpdate( + "join-multi-value-cells", + { + cellIndex: column.cellIndex, + keyCellIndex: theProject.columnModel.keyCellIndex, + separator: separator + } + ); + } +}; + +DataTableView.prototype._doSplitMultiValueCells = function(column) { + var separator = window.prompt("What separator currently separates the values?", ", "); + if (separator != null) { + this._doPostThenUpdate( + "split-multi-value-cells", + { + cellIndex: column.cellIndex, + keyCellIndex: theProject.columnModel.keyCellIndex, + separator: separator, + mode: "plain" + } + ); + } +}; + DataTableView.prototype._doExportRows = function() { var form = document.createElement("form"); $(form) diff --git a/src/main/webapp/scripts/util/menu.js b/src/main/webapp/scripts/util/menu.js index b68fd0f1b..8991cd87a 100644 --- a/src/main/webapp/scripts/util/menu.js +++ b/src/main/webapp/scripts/util/menu.js @@ -67,6 +67,10 @@ MenuSystem.createAndShowStandardMenu = function(items, elmt, options) { }; var menu = MenuSystem.createMenu(); + if ("width" in options) { + menu.width(options.width); + } + var createMenuItem = function(item) { if ("label" in item) { var menuItem = MenuSystem.createMenuItem().appendTo(menu); diff --git a/tests/movies-condensed.tsv b/tests/movies-condensed.tsv new file mode 100644 index 000000000..8cfb159d1 --- /dev/null +++ b/tests/movies-condensed.tsv @@ -0,0 +1,25 @@ +name Directed by Performances - Actor Performances - Character Estimated budget - Currency Estimated budget - Amount Genres Initial release date Languages +Wayne's World Penelope Spheeris Mike Myers, Dana Carvey, Rob Lowe, Tia Carrere, Lara Flynn Boyle, Chris Farley, Ed O'Neill, Robert Patrick, Alice Cooper Wayne Campbell, Garth Algar, Stacy US$ 20000000 Comedy, Satire, Buddy film 2/14/1992 English Language +Wayne's World 2 Stephen Surjik Mike Myers, Dana Carvey, Christopher Walken, Tia Carrere, Chris Farley, Ted McGinley, Olivia d'Abo, Kevin Pollak, Ed O'Neill, Kim Basinger, Heather Locklear Wayne Campbell, Garth Algar Comedy, Buddy film 12/10/1993 English Language +Austin Powers: Goldmember Jay Roach Mike Myers, BeyoncÈ, Seth Green, Michael York, Robert Wagner, Michael Caine, Verne Troyer, Gwyneth Paltrow, Fred Savage, Aaron Himelstein, Mindy Sterling, Josh Zuckerman, Greg Grunberg, Tommy 'Tiny' Lister, Rob Lowe, Masi Oka, Nikki Schieler Ziering, Britney Spears, Tom Cruise, John Travolta, Danny DeVito, Katie Couric, Steven Spielberg Austin Powers, Foxxy Cleopatra, Scott Evil, Dixie Normous, Him/Herself, Prison Guard Parody, Time travel, Comedy 7/26/2002 English Language +Austin Powers: International Man of Mystery Jay Roach Mike Myers, Elizabeth Hurley, Michael York, Mimi Rogers, Robert Wagner, Patrick Bristow, Fabiana Udenio, Elya Baskin, Paul Dillon, Lois Chiles, Christian Slater, Brian George, Cynthia Lamontagne, Cindy Margolis, Mindy Sterling, Joe Son Austin Powers, Fembot Parody, Time travel, Comedy 5/2/1997 English Language +So I Married an Axe Murderer Thomas Schlamme Mike Myers, Nancy Travis, Anthony LaPaglia, Amanda Plummer, Brenda Fricker, Michael G. Hagerty, Luenell, Debi Mazar, Matt Doherty, Steven Wright, Charles Grodin, Patrick Bristow, Phil Hartman, Cintra Wilson, Michael Richards, Sheila Kelley, Alan Arkin, M. C. Brennan, Holly Lewis Police Records Officer Comedy 7/30/1993 English Language +Austin Powers: The Spy Who Shagged Me Jay Roach, Mike Myers, Heather Graham, Robert Wagner, Rob Lowe, Michael York, Verne Troyer, David Koechner, Muse Watson, Michael G. Hagerty, Kristen Johnston, Mindy Sterling, Gia Carides, Will Ferrell, Bree Turner, Scott Cooper Austin Powers, Parody, Comedy, Time travel 6/11/1999 English Language + German Language +Shrek 2 Andrew Adamson, Kelly Asbury, Conrad Vernon John Lithgow, Mike Myers, Eddie Murphy, Cameron Diaz, Julie Andrews, Antonio Banderas, John Cleese, Rupert Everett, Jennifer Saunders, Aron Warner, Kelly Asbury, Cody Cameron, Conrad Vernon, Christopher Knights, Mark Moseley Lord Farquaad, Shrek, Donkey, Princess Fiona, Queen, Puss in Boots, King, Prince Charming, Fairy Godmother, Wolf, Page, Pinocchio, Gingerbread Man, Blind Mouse, Mirror US$ 125000000 Comedy, Computer animation, Fantasy 5/19/2004 English Language +Inglourious Basterds Quentin Tarantino, , , , Mark Christopher Brad Pitt, Mike Myers, Diane Kruger, Daniel Br¸hl, Til Schweiger, B. J. Novak, Michael Fassbender, Julie Dreyfus, Maggie Cheung, Rod Taylor, Gedeon Burkhard, Christian Berkel, Samuel L. Jackson, Samm Levine, Cloris Leachman, Christoph Waltz, Ludger Pistor, Omar Doom, Jana Pallaske, Enzo G. Castellari, Jacky Ido, Eli Roth, MÈlanie Laurent, Ryan Phillippe, Salma Hayek, Neve Campbell, Mike Myers, Sela Ward, Breckin Meyer, Sherry Stringfield, Ellen Albertini Dow, Cameron Mathison, Noam Jenkins, Jay Goede, Patrick Taylor, Heather Matarazzo, Heidi Klum, Mark Ruffalo, Lauren Hutton, Skipp Sudduth, Michael York Lt. Aldo Raine, General Ed French, Bridget von Hammersmark, Frederick Zoller, Sgt. Hugo Stiglitz, PFC Utivich, Lt. Archie Hicox, Francesca Mondino, Madame Mimieux, Winston Churchhill, Eric the Barkeeper, PFC Hirschberg, Mrs. Himmelstein, Colonel Hans Landa, PFC Omar Ulmer, Shane O'Shea, Anita Randazzo, Julie Black, Steve Rubell, Billie Auster, Greg Randazzo, Viv, Disco Dottie, Atlanta, Romeo, Buck, Tarzan, Grace O'Shea, VIP Patron US$ 70000000 War, Adventure, Action, Black comedy, LGBT, Drama 8/21/2009 English Language + German Language + French Language + Italian Language +54 US$ 18000000 8/28/1998 English Language +Shrek the Third Raman Hui, Chris Miller, Raman Hui Mike Myers, Cameron Diaz, Eddie Murphy, Antonio Banderas, Julie Andrews, John Cleese, Rupert Everett, Justin Timberlake, Regis Philbin, Seth Rogen, Eric Idle, Cheri Oteri, Edison Chen Shrek, Princess Fiona, , Artie, Ship Captain Comedy, Computer animation, Fantasy 5/18/2007 English Language +View from the Top Bruno Barreto Gwyneth Paltrow, Christina Applegate, Mark Ruffalo, Candice Bergen, Joshua Malina, Kelly Preston, Mike Myers, Rob Lowe, Marc Blucas Donna Jensen Romantic comedy, Comedy 3/21/2003 English Language +Pete's Meteor Brenda Fricker, Mike Myers Drama 1998 +The Cat in the Hat Bo Welch Mike Myers, Alec Baldwin, Kelly Preston, Dakota Fanning, Spencer Breslin, Amy Hill, Sean Hayes The Cat in the Hat, Larry Quinn, Joan Walden, Sally Walden, Conrad Walden, The Fish US$ 109000000 Musical, Fantasy 11/21/2003 English Language +Shrek Andrew Adamson, Vicky Jenson Mike Myers, Eddie Murphy, Cameron Diaz, John Lithgow, Chris Farley, Conrad Vernon, Vincent Cassel, Val Bettin, Christopher Knights Shrek, Donkey, Princess Fiona, Lord Farquaad US$ 60000000 Parody, Computer animation, Comedy, Fantasy 5/18/2001 English Language +The Thin Pink Line Joe Dietl, Michael Irpino Laura Kightlinger, Janeane Garofalo, Margaret Cho, Jennifer Aniston, David Schwimmer, Mike Myers, Will Ferrell Joyce Wintergarden-Dingle, Clove Satire, Indie, Comedy 1998 English Language +Shrek the Halls Gary Trousdale Eddie Murphy, Antonio Banderas, Cameron Diaz, Mike Myers, Aron Warner, Conrad Vernon, Christopher Knights, Marissa Jaret Winokur Princess Fiona Animation, Fantasy, Short film, Adventure, Comedy 11/28/2007 English Language +Shrek Ever After Mike Mitchell, Mike Mitchell Cameron Diaz, Eric Idle, Antonio Banderas, Eddie Murphy, Justin Timberlake, Julie Andrews, Mike Myers, Paul McCartney, Larry King Princess Fiona, Merlin, Puss in Boots, Donkey, Arthur Pendragon, Queen Lillian, Shrek, Rumpelstiltskin, Doris the Ugly Stepsister Comedy, Computer animation, Fantasy 5/21/2010 English Language +The Love Guru Mike Myers, Jessica Alba, Justin Timberlake, Romany Malco, Jessica Simpson, Ben Kingsley, Verne Troyer Maurice Pitka, Jane Bullard, Jacques Grande, Darren Roanoke US$ 62000000 Comedy 6/20/2008 English Language +Shrek Goes Fourth Cameron Diaz, Antonio Banderas, Eddie Murphy, Mike Myers Princess Fiona, Puss in Boots, Donkey, Shrek Computer animation +View from the top Bruno Barreto Gwyneth Paltrow, Mike Myers, Rob Lowe, Christina Applegate, Kelly Preston, Candice Bergen, Mark Ruffalo, Joshua Malina Romantic comedy 3/21/2003 English Language